Translate
2012年11月23日 星期五
GridView流水號
<asp:TemplateField HeaderText=" 流水號>">
<ItemTemplate>
<%# gv.PageIndex * gv.PageSize + Container.DataItemIndex + 1%>
</ItemTemplate>
</asp:TemplateField>
gv為現有GridView ID
2012年11月21日 星期三
TextBox DateTime應用-取得日期區間
ref→http://stackoverflow.com/questions/1056728/formatting-a-date-in-javascript
var INTERDAY = 2;
$("#<%=TimeStart.ClientID%>").bind('change', function (e) {
var endText = $("#<%=TimeEnd.ClientID%>");
var edate = GetTextDate(endText);
var date = GetTextDate($(this));
if (CheckInInterDate($(this), edate, INTERDAY) == false || edate < date) endText.val(dateToYMD(date, INTERDAY));
});
$("#<%=TimeEnd.ClientID%>").bind('change', function (e) {
var startText = $("#<%=TimeStart.ClientID%>");
var sdate = GetTextDate(startText);
var date = GetTextDate($(this));
if (CheckInInterDate($(this), sdate, INTERDAY) == false || sdate > date) startText.val(dateToYMD(date, -1 * INTERDAY));
});
function GetTextDate(obj) {
if (isDate(obj.val()) == false) obj.val(dateToYMD(new Date(), 0));
return StringtoDate(obj.val());
}
function CheckInInterDate(obj, date, interday) {
var checkbefore = StringtoDate(obj.val());
var checkafter = StringtoDate(obj.val());
checkbefore.setDate(checkbefore.getDate() - interday);
checkafter.setDate(checkafter.getDate() + interday);
return checkbefore <= date && date <= checkafter;
}
function dateToYMD(date, interday) {
date.setDate(date.getDate() + interday);
var d = date.getDate();
var m = date.getMonth() + 1;
var y = date.getFullYear();
return '' + y +'-'+ (m<=9?'0'+m:m) +'-'+ (d<=9?'0'+d:d);
}
function StringtoDate(dateStr) {
var datePat = /^(\d{4})(-)(\d{1,2})(-)(\d{1,2})$/;
var matchArray = dateStr.match(datePat); // is the format ok?
if (matchArray == null) return new Date();
return new Date(matchArray[1] + '/' + matchArray[3] + '/' + matchArray[5])
}
function isDate(dateStr) {
var datePat = /^(\d{4})(-)(\d{1,2})(-)(\d{1,2})$/;
var matchArray = dateStr.match(datePat); // is the format ok?
if (matchArray == null) return false;
day = matchArray[5];
if (day < 1 || day > 31) return false;
month = matchArray[3];
if (month < 1 || month > 12) return false;
if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 31) return false;
year = matchArray[1];
if (month == 2) { // check for february 29th
var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
if (day > 29 || (day == 29 && !isleap)) return false;
}
return true; // date is valid
}
ref→http://netbeansboy.org/2011/09/02/javascript-isdate-function-for-uk/
ref→http://taiwantc.com/js/js_tut_a0.htm
ref→http://www.ezineasp.net/post/Javascript-Convert-String-to-Date.aspx
ref→http://api.jquery.com/val/
ref→http://blog.programmingsolution.net/javascript/casting-jquery-object-to-javascript-object-and-javascript-object-to-jquery-object/
ref→http://www.ezineasp.net/post/Javascript-Convert-String-to-Date.aspx
ref→http://api.jquery.com/val/
ref→http://blog.programmingsolution.net/javascript/casting-jquery-object-to-javascript-object-and-javascript-object-to-jquery-object/
<script type="text/javascript">
var INTERDAY = 2;
$("#<%=TimeStart.ClientID%>").bind('change', function (e) {
var endText = $("#<%=TimeEnd.ClientID%>");
var edate = GetTextDate(endText);
var date = GetTextDate($(this));
if (CheckInInterDate($(this), edate, INTERDAY) == false || edate < date) endText.val(dateToYMD(date, INTERDAY));
});
$("#<%=TimeEnd.ClientID%>").bind('change', function (e) {
var startText = $("#<%=TimeStart.ClientID%>");
var sdate = GetTextDate(startText);
var date = GetTextDate($(this));
if (CheckInInterDate($(this), sdate, INTERDAY) == false || sdate > date) startText.val(dateToYMD(date, -1 * INTERDAY));
});
function GetTextDate(obj) {
if (isDate(obj.val()) == false) obj.val(dateToYMD(new Date(), 0));
return StringtoDate(obj.val());
}
function CheckInInterDate(obj, date, interday) {
var checkbefore = StringtoDate(obj.val());
var checkafter = StringtoDate(obj.val());
checkbefore.setDate(checkbefore.getDate() - interday);
checkafter.setDate(checkafter.getDate() + interday);
return checkbefore <= date && date <= checkafter;
}
function dateToYMD(date, interday) {
date.setDate(date.getDate() + interday);
var d = date.getDate();
var m = date.getMonth() + 1;
var y = date.getFullYear();
return '' + y +'-'+ (m<=9?'0'+m:m) +'-'+ (d<=9?'0'+d:d);
}
function StringtoDate(dateStr) {
var datePat = /^(\d{4})(-)(\d{1,2})(-)(\d{1,2})$/;
var matchArray = dateStr.match(datePat); // is the format ok?
if (matchArray == null) return new Date();
return new Date(matchArray[1] + '/' + matchArray[3] + '/' + matchArray[5])
}
function isDate(dateStr) {
var datePat = /^(\d{4})(-)(\d{1,2})(-)(\d{1,2})$/;
var matchArray = dateStr.match(datePat); // is the format ok?
if (matchArray == null) return false;
day = matchArray[5];
if (day < 1 || day > 31) return false;
month = matchArray[3];
if (month < 1 || month > 12) return false;
if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 31) return false;
year = matchArray[1];
if (month == 2) { // check for february 29th
var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
if (day > 29 || (day == 29 && !isleap)) return false;
}
return true; // date is valid
}
</script>
補充:2012/12/4
發現在IE9版本以下會略有問題:微修及調整之後…
this的用法真的要多加注意/ \
補充:2012/12/4
發現在IE9版本以下會略有問題:微修及調整之後…
this的用法真的要多加注意/ \
2012年11月13日 星期二
ref→http://www.menucool.com/tooltip/css-tooltip.aspx
這邊要介紹的是當
<a href='www.gmail.com' title='測試'><img src=圖片位置 width='150px' height='150px'/><a>
無法顯示ToolTip
因為a的超連結會被img的alt屬性吃掉,會變成只有當圖片網址找不到才顯示提示
上面的網址列給範例
其實也很簡單XD
<a href='www.gmail.com'><img src=圖片位置 width='150px' height='150px'/><span>放你要提示的文字即可</span><a>
這邊要介紹的是當
<a href='www.gmail.com' title='測試'><img src=圖片位置 width='150px' height='150px'/><a>
無法顯示ToolTip
因為a的超連結會被img的alt屬性吃掉,會變成只有當圖片網址找不到才顯示提示
上面的網址列給範例
其實也很簡單XD
<a href='www.gmail.com'><img src=圖片位置 width='150px' height='150px'/><span>放你要提示的文字即可</span><a>
2012年10月19日 星期五
EntityDataSource Where查詢
當有使用EntityDataSource進行查詢時
只需要在EntityDataSource_ContextCreated(object sender, EntityDataSourceContextCreatedEventArgs e)
內重新改寫
EntityDataSourceCom.Where 即可
比較注意的重點
一、當查詢的為時間建議寫:
it.Time>=DATETIME'" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "'"
二、當有AND跟OR要連結起來時寫法(這個倒是試了一陣子)
EntityDataSource.Where= "it.name='%台灣%' AND (it.bookname='%自然%' OR it.bookname='%數學%')"
試過不可行的方式…
EntityDataSource.Where= " (it.bookname='%自然%' OR it.bookname='%數學%') AND it.name='%台灣%'"
ref→http://huan-lin.blogspot.com/2011/04/entitydatasourceselect-it.html:說明it是什麼
只需要在EntityDataSource_ContextCreated(object sender, EntityDataSourceContextCreatedEventArgs e)
內重新改寫
EntityDataSourceCom.Where 即可
比較注意的重點
一、當查詢的為時間建議寫:
it.Time>=DATETIME'" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "'"
二、當有AND跟OR要連結起來時寫法(這個倒是試了一陣子)
EntityDataSource.Where= "it.name='%台灣%' AND (it.bookname='%自然%' OR it.bookname='%數學%')"
試過不可行的方式…
EntityDataSource.Where= " (it.bookname='%自然%' OR it.bookname='%數學%') AND it.name='%台灣%'"
ref→http://huan-lin.blogspot.com/2011/04/entitydatasourceselect-it.html:說明it是什麼
網路芳鄰的共用資料夾取檔
管理工具要連到遠端電話的共用資料夾取得檔案
並可上傳檔案
但老是卡在帳號密碼不合~_~
故目前解決的方法,先寫一個bat檔,先記遠端資料夾的帳密,等關了之後再清除
或許以後會想出更好的方法
View
帳號為abc
密碼為abc123456
密碼為abc123456
net user "\\192.168.1.100" abc123456 /user:"abc"
刪除的.bat ref→http://ithelp.ithome.com.tw/question/10007065
net use \\192.168.1.100\ /delete
當離開在進行刪除→http://msdn.microsoft.com/en-us/library/system.windows.forms.application.applicationexit.aspx
static void Main()
{
Application.ApplicationExit += new EventHandler(OnApplicationExit);
}
//當離開程執行bat檔
static private void OnApplicationExit(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("刪除的.bat");
}
2012-10-26
後來發現好像也不用這麼麻煩了
直接在欲連線的電腦先設定好帳戶資訊就可以了
在執行→輸入 cmd→再輸入control userpasswords2
然後會開啟帳戶介面→選擇進階→新增/編輯帳戶就可以了XDD
ref→http://ithelp.ithome.com.tw/question/10040025?tag=rt.rq
當離開在進行刪除→http://msdn.microsoft.com/en-us/library/system.windows.forms.application.applicationexit.aspx
static void Main()
{
Application.ApplicationExit += new EventHandler(OnApplicationExit);
}
//當離開程執行bat檔
static private void OnApplicationExit(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("刪除的.bat");
}
2012-10-26
後來發現好像也不用這麼麻煩了
直接在欲連線的電腦先設定好帳戶資訊就可以了
在執行→輸入 cmd→再輸入control userpasswords2
然後會開啟帳戶介面→選擇進階→新增/編輯帳戶就可以了XDD
ref→http://ithelp.ithome.com.tw/question/10040025?tag=rt.rq
2012年8月15日 星期三
wort to pdf, word to png 線上轉檔工具
分享一些網路上還不錯用的轉檔工具
不用下載,直接選,直接下載或是寄到信箱就可以了(當然還是有檔案大小的限制()
選擇你要的圖檔之後,再按下一步,就可挑選理想中的icon圖片了
http://www.prodraw.net/favicon/index.php
將word檔制成PDF,對於表格的辨視度很高,不過要輸入電子信箱至信箱收信
http://www.wordtopdf.com/
將PDF轉成圖檔,目前也有多種圖檔,可直接下載,辨識度也高
http://pdf.my-addr.com/free-online-pdf-to-png-convert.php
2012.11.2
如果有時後格式錯誤,也不想等寄信
最近又找到一個
http://convertonlinefree.com/
不用下載,直接選,直接下載或是寄到信箱就可以了(當然還是有檔案大小的限制()
選擇你要的圖檔之後,再按下一步,就可挑選理想中的icon圖片了
http://www.prodraw.net/favicon/index.php
將word檔制成PDF,對於表格的辨視度很高,不過要輸入電子信箱至信箱收信
http://www.wordtopdf.com/
將PDF轉成圖檔,目前也有多種圖檔,可直接下載,辨識度也高
http://pdf.my-addr.com/free-online-pdf-to-png-convert.php
2012.11.2
如果有時後格式錯誤,也不想等寄信
最近又找到一個
http://convertonlinefree.com/
2012年7月30日 星期一
MVC Razor
ref→http://weblogs.asp.net/scottgu/archive/2010/12/15/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax.aspx
先記一下,MVC相關語法
若要從routerView取得id資料
@ViewContext.RouteData.Values["Id"]
若要從Cotroller取得id資料
this.RouteData.GetRequiredString("id")
祝學習愉快
先記一下,MVC相關語法
若要從routerView取得id資料
@ViewContext.RouteData.Values["Id"]
若要從Cotroller取得id資料
this.RouteData.GetRequiredString("id")
祝學習愉快
2012年6月21日 星期四
MVC 語系檔
當在cshtml使用時
ref→http://stackoverflow.com/questions/2688888/why-cant-i-use-resources-as-errormessage-with-dataannotations
當需要驗證錯誤編碼時(請記得將語系檔選為public才能夠使用)
ref→http://stackoverflow.com/questions/5673070/accessing-resource-files-in-mvc-3
這是在cshtml使用一部份的方法
ref→http://stackoverflow.com/questions/6415565/render-usercontrol-cshtml-using-html-partial
MVC不錯的網站參考
暫列→http://blog.darkthread.net/post-2011-04-12-asp-net-mvc3-intro-2.aspx
額外補充語系
ref→http://www.cnblogs.com/think8848/archive/2011/07/05/2098464.html
很詳細的html5
ref→http://www.dotblogs.com.tw/nobel12/archive/2011/08/17/33337.aspx
使用Validation檢視
ref→http://blog.darkthread.net/post-2011-06-09-validator-tryvalidateobject.aspx
2012年6月6日 星期三
2012年5月28日 星期一
移來移去(mouseover/mouseout)顯示tip
只要將滑鼠放在LinkButton上就會顯示訊息
移開就不顯示
因為ToolTip要等待,故有時會採此方式顯示
<asp:LinkButton ID="btntest" runat="server" class=" mousebtn "/>
<asp:Label ID="Label1" runat="server" Text="" class="note"></asp:Label>
<script type="text/javascript">
$(document).ready(function () {
$(".mousebtn").live('mouseover', function () { $(".note").text("顯示姓名"); }).live('mouseout', function () { $(".note").text(""); });
})
</script>
框架頁面自由調整高度
框架自由調整高度→http://wadevelop.blogspot.com/2009/03/iframe-auto-heightiframe.html
框架自由調整高度→http://www.wenso.com/post/182.html
最近為了調整框架,不過上面的方法只能在框架頁跟Mail頁面為同一伺服器底下才行
不 然會發生權限錯誤,冏"
2012年5月25日 星期五
fb like/g+..多個Buttom嵌在網頁
網路上有提供多種方便的嵌入語法,只要放進Web Code裡面即可使用
這些是暫時找到加進去的
http://sharethis.com/publishers/get-sharing-tools#
https://www.addthis.com/get/sharing?where=website&type=bm&bm=tb7#.T78kddUny5J
Google的官方語法
GOOGLE+1→http://www.google.com/intl/zh-TW/webmasters/+1/button/
這些是暫時找到加進去的
http://sharethis.com/publishers/get-sharing-tools#
https://www.addthis.com/get/sharing?where=website&type=bm&bm=tb7#.T78kddUny5J
Google的官方語法
GOOGLE+1→http://www.google.com/intl/zh-TW/webmasters/+1/button/
2012年5月11日 星期五
PDF Form
PDF Form檔寫完後,當使用者按下按鈕,可以跳出列印,並跳出資訊,希望能將聯絡資訊回傳予我們
參考頁面→
http://www.pdfill.com/pdf_action.html#4
Acrobat Forms API Reference: http://www.pdfill.com/download/FormsAPIReference.pdf
Acrobat JavaScript Scripting Guide: http://www.pdfill.com/download/Acro6JSGuide.pdfAcrobat JavaScript Scripting Reference: http://www.pdfill.com/download/AcroJS.pdf總之,先下載→http://www.adobe.com/tw/downloads/
Acrobat® X Pro
然後再用此檔案開啟PDF檔,目前先將PDF javascript語法留在此
//列印的語法
this.print(true);
//詢問的語法
var nButton = app.alert({
cMsg: "是否提供您的姓名及電話做為通知使用?",
cTitle: "詢問",
nIcon: 2, nType: 2
});
★1跟★2代表的是不同的兩種方法
★1//當確認的話,直接使用連結,並將值傳回給Server(GET Method)
if (nButton == 4) {
var namevalue = this.getField("name").value; //將name control的值代入
app.alert(namevalue);
var url1 = "http:/localhost//Handler1.ashx?name=" + namevalue;
app.launchURL(url1 , true);
}
★2//當確認的話,SubmitForm,並將值傳回給Server(Post Method)
if (nButton == 4) {
var afields = new Array("name"); //將name control的值代入,這裡可以是陣列
try
{
var url1 = "http:/localhost//Handler1.ashx";
this.submitForm({
aFields:afields,
cURL: url1,
cSubmitAs: "HTML",
cCharset:"utf-8"}) ;
}
catch(e)
{
app.alert(e + "因為某些原因造成提供失敗!");
}
}
=======Handler1.ashx=========
<%@ WebHandler Language="C#" Class="Handler1 " %>
using System;
using System.Web;
public class Handler1 : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string name = context.Request.Form["name"]; →POST 取得value
name = context.Request.QueryString["name"]; →Get 取得value
//do something
context.Response.Redirect("close.htm");
}
public bool IsReusable
{
get
{
return false;
}
}
}
===============close.htm===================
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
window.opener = null; window.open("", "_self"); window.close();
</script>
</body>
</html>
*window.opener = null; window.open("", "_self"); window.close();將會不詢問而直接關掉
☆若使用者使用非browser開啟PDF,會有以下反應
→SubmitForm會將html下載到本機的Temp資料夾
→launchURL則只是會再開啟browser另開頁面,但因為傳完資訊會進行關閉的動作
☆若使用者使用broser開啟PDF,會有以下反應
→SubmitForm會將html轉址,最後再到close.html關掉整個頁面
→launchURL則只是會再開啟browser另開頁面,但因為傳完資訊會進行關閉的動作
後續將會持續再找最好的方法/_\
2012年4月24日 星期二
confirm使用resource資源檔文字
找了幾種方法,不過通常都會出現錯誤,目前使用比較好的一種方法
就是在script加上function再使用
不過這樣一來就不是很便利了,苦惱,但也解決了目前的問題
<asp:LinkButton ID="butDel" runat="server" ToolTip="<%$ Resources:admin. basedate , 刪除%>" OnClientClick="return checkdel();"/>
<script type="text/javascript">
function checkdel()
{ var msg = "<%= Resources.basedate.將刪除所有基本資料 %>"; return confirm(msg); }
</script>
總的來說就是先將資源檔放入變數,再傳回來XD
更次更新→ return confirm('<%= Resources.basedate.將刪除所有基本資料 %>');
直接使用上面的語法效果比較好...
就是在script加上function再使用
不過這樣一來就不是很便利了,苦惱,但也解決了目前的問題
<asp:LinkButton ID="butDel" runat="server" ToolTip="<%$ Resources:admin. basedate , 刪除%>" OnClientClick="return checkdel();"/>
<script type="text/javascript">
function checkdel()
{ var msg = "<%= Resources.basedate.將刪除所有基本資料 %>"; return confirm(msg); }
</script>
總的來說就是先將資源檔放入變數,再傳回來XD
更次更新→ return confirm('<%= Resources.basedate.將刪除所有基本資料 %>');
直接使用上面的語法效果比較好...
2012年4月23日 星期一
在線人數計算
ref→http://www.aspdotnetfaq.com/Faq/How-to-show-number-of-online-users-visitors-for-ASP-NET-website.aspx
在Global.asax
void Application_Start(object sender, EventArgs e)
{
Application["OnlineUsers"] = 0;
}
void Session_Start(object sender, EventArgs e)
{
//啟動新工作階段時執行的程式碼
Application.Lock();
Application["OnlineUsers"] = (int)Application["OnlineUsers"] + 1;
Application.UnLock();
}
void Session_End(object sender, EventArgs e)
{
//工作階段結束時執行的程式碼。
//注意: 只有在 Web.config 檔將 sessionstate 模式設定為 InProc 時,
//才會引發 Session_End 事件。如果將工作階段模式設定為 StateServer
//或 SQLServer,就不會引發這個事件。
Application.Lock();
Application["OnlineUsers"] = (int)Application["OnlineUsers"] - 1;
Application.UnLock();
}
在Global.asax
void Application_Start(object sender, EventArgs e)
{
Application["OnlineUsers"] = 0;
}
void Session_Start(object sender, EventArgs e)
{
//啟動新工作階段時執行的程式碼
Application.Lock();
Application["OnlineUsers"] = (int)Application["OnlineUsers"] + 1;
Application.UnLock();
}
void Session_End(object sender, EventArgs e)
{
//工作階段結束時執行的程式碼。
//注意: 只有在 Web.config 檔將 sessionstate 模式設定為 InProc 時,
//才會引發 Session_End 事件。如果將工作階段模式設定為 StateServer
//或 SQLServer,就不會引發這個事件。
Application.Lock();
Application["OnlineUsers"] = (int)Application["OnlineUsers"] - 1;
Application.UnLock();
}
使用按鈕來切換語系
ref→http://www.dotblogs.com.tw/jacky19819/archive/2009/03/25/7699.aspx
大概的想法就是用ASP.net載入時,使用按鈕可以選擇所想要切換的語系
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CHS");
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("CHS");
大概的想法就是用ASP.net載入時,使用按鈕可以選擇所想要切換的語系
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CHS");
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("CHS");
2012年4月12日 星期四
GridView Eval為變數新開視窗
如下列代碼
<a onclick="link_web('<%# Eval("ID") %>')">連結書藉</a>
</asp:GridView>
<script type="text/javascript">
function
link_web (obj) {
alert(obj);
//TODO Link
}
</script>
用<a></a>將要連結的包起來 ,就可以順利連結
2012年3月30日 星期五
aspx頁面上使用資源字串
當要在aspx頁面上使用資源字串的方法
通常是用在不需要放在控制項目內的字串
<%=Resources.資源檔名.key值%>
通常是放在控制元件的寫法…
<asp:ListItem Value="1" Text="<%$ Resources: 資源檔名 , key值 %>"/>
通常是用在不需要放在控制項目內的字串
<%=Resources.資源檔名.key值%>
通常是放在控制元件的寫法…
<asp:ListItem Value="1" Text="<%$ Resources: 資源檔名 , key值 %>"/>
2012年3月23日 星期五
javascript inputtext擋住特定字元
當你希望使用輸入文字及貼上一段文字,能避開某些特殊符號,或許可以參考
這裡範例使用的是 ? 及 & 可以改成任何你想擋的
它們的相對應key值是55及191…
<script type="text/javascript">
function RemoveText(obj) {
var str = obj.val();
str = String(str).replace("?", "").replace("&", "");
obj.val(str);
}
$("input[type='text']").bind('paste keydown keyup', function (e) {
var el = $(this);
setTimeout(function () { RemoveText($(el)); }, 1);
if (e.type == 'keyup') {
eKey = e && (e.which || e.keyCode)
if (e.shiftKey && (eKey == 55|| eKey == 191)) {
alert("禁止輸入特殊符號");
}
}
});
</script>
ascii→http://www.asciitable.com/
ref→http://api.jquery.com/bind/
ref→http://www.w3schools.com/jsref/event_onchange.asp
ref→http://stackoverflow.com/questions/3781142/jquery-or-javascript-how-determine-if-shift-key-being-pressed-while-clicking-an
ref→http://blog.longwin.com.tw/2007/08/javascript_match_replace_method_2007/
另外一開始也想用regex來判定,找到的一些方便網站也註記在此
ref→http://blog.roodo.com/rocksaying/archives/2670695.html
ref→http://www.jb51.net/article/23196.htm
ref→http://blog.miniasp.com/post/2010/04/27/How-to-filter-special-characters-using-NET-Regex.aspx
ref→http://joy0626.pixnet.net/blog/post/25259201
ref→http://www.blueshop.com.tw/board/show.asp?subcde=BRD20050715144115ZUM
ref→http://blog.xuite.net/ron825/enjoy/41475369-javascript%E5%AD%97%E4%B8%B2right%E5%8A%9F%E8%83%BD%E8%88%87left%E5%8A%9F%E8%83%BD
補充→之後發生了一點小問題,是有關輸入法,冏"如果是注音輸入法可能無法順利填入…
另…
加一個方法如下
function RemoveText(obj) {
var str = obj.val();
if (str != "") {
var aspecil= [" ? ", " & "]; //禁止輸入的符號 ? , &
var flag = false;
var j = aSign.length;
while (j--) {
while (str.indexOf( aspecil [j]) >= 0) {
flag = true;
str = String(str).replace( aspecil [j], "");
}
}
if (flag) {
alert("<%=Resources.Contacts.禁止輸入特殊符號 %>");
}
obj.val(str);
}
}
$("input[type='text']").bind('blur paste', function (e) {
var el = $(this);
setTimeout(function () { RemoveText($(el)); }, 1);
});
這裡範例使用的是 ? 及 & 可以改成任何你想擋的
它們的相對應key值是55及191…
<script type="text/javascript">
function RemoveText(obj) {
var str = obj.val();
str = String(str).replace("?", "").replace("&", "");
obj.val(str);
}
$("input[type='text']").bind('paste keydown keyup', function (e) {
var el = $(this);
setTimeout(function () { RemoveText($(el)); }, 1);
if (e.type == 'keyup') {
eKey = e && (e.which || e.keyCode)
if (e.shiftKey && (eKey == 55|| eKey == 191)) {
alert("禁止輸入特殊符號");
}
}
});
</script>
ascii→http://www.asciitable.com/
ref→http://api.jquery.com/bind/
ref→http://www.w3schools.com/jsref/event_onchange.asp
ref→http://stackoverflow.com/questions/3781142/jquery-or-javascript-how-determine-if-shift-key-being-pressed-while-clicking-an
ref→http://blog.longwin.com.tw/2007/08/javascript_match_replace_method_2007/
另外一開始也想用regex來判定,找到的一些方便網站也註記在此
ref→http://blog.roodo.com/rocksaying/archives/2670695.html
ref→http://www.jb51.net/article/23196.htm
ref→http://blog.miniasp.com/post/2010/04/27/How-to-filter-special-characters-using-NET-Regex.aspx
ref→http://joy0626.pixnet.net/blog/post/25259201
ref→http://www.blueshop.com.tw/board/show.asp?subcde=BRD20050715144115ZUM
ref→http://blog.xuite.net/ron825/enjoy/41475369-javascript%E5%AD%97%E4%B8%B2right%E5%8A%9F%E8%83%BD%E8%88%87left%E5%8A%9F%E8%83%BD
補充→之後發生了一點小問題,是有關輸入法,冏"如果是注音輸入法可能無法順利填入…
另…
加一個方法如下
function RemoveText(obj) {
var str = obj.val();
if (str != "") {
var aspecil= [" ? ", " & "]; //禁止輸入的符號 ? , &
var flag = false;
var j = aSign.length;
while (j--) {
while (str.indexOf( aspecil [j]) >= 0) {
flag = true;
str = String(str).replace( aspecil [j], "");
}
}
if (flag) {
alert("<%=Resources.Contacts.禁止輸入特殊符號 %>");
}
obj.val(str);
}
}
$("input[type='text']").bind('blur paste', function (e) {
var el = $(this);
setTimeout(function () { RemoveText($(el)); }, 1);
});
2012年3月22日 星期四
javascript 剪貼本取得資料
剪貼本取得資料,其實語法,只有很短的一行
indow.clipboardData.getData("Text")
但是悲劇在於只有IE才能使用冏”
最後總算是很歡樂的試出大部份版本都有的,如下…
elem.bind('paste', function (e) {
var text = "";
if (window.clipboardData && window.clipboardData.getData("Text")) { //IE
text = window.clipboardData.getData("Text");
}
else if (e.clipboardData && e.clipboardData.getData) // Standard
{
text = e.clipboardData.getData('text/plain');
}
else if (e.originalEvent.clipboardData &&
e.originalEvent.clipboardData.getData) // jQuery
{
text = e.originalEvent.clipboardData.getData('text/plain');
}
alert(text);
});
但是後來ff讓我無言了,因為他的預設都是空值
後來…
也總算找到了可以通用的…
elem.bind('paste', function (e) {
var el = $(this);
setTimeout(function () {
var text = $(el).val();
alert(text);
}, 100);
});
ref→http://stackoverflow.com/questions/686995/jquery-catch-paste-input
==後面是補充參考
ref→http://jsfiddle.net/SLaks/nt4SD/
ref→http://stackoverflow.com/questions/8655604/attach-a-handler-for-all-event-types
ref→http://www.javascriptkit.com/javatutors/navigator.shtml
ref→http://topic.csdn.net/t/20020612/19/798745.html
ref→http://php.net/manual/en/function.get-browser.php
indow.clipboardData.getData("Text")
但是悲劇在於只有IE才能使用冏”
最後總算是很歡樂的試出大部份版本都有的,如下…
elem.bind('paste', function (e) {
var text = "";
if (window.clipboardData && window.clipboardData.getData("Text")) { //IE
text = window.clipboardData.getData("Text");
}
else if (e.clipboardData && e.clipboardData.getData) // Standard
{
text = e.clipboardData.getData('text/plain');
}
else if (e.originalEvent.clipboardData &&
e.originalEvent.clipboardData.getData) // jQuery
{
text = e.originalEvent.clipboardData.getData('text/plain');
}
alert(text);
});
但是後來ff讓我無言了,因為他的預設都是空值
後來…
也總算找到了可以通用的…
elem.bind('paste', function (e) {
var el = $(this);
setTimeout(function () {
var text = $(el).val();
alert(text);
}, 100);
});
ref→http://stackoverflow.com/questions/686995/jquery-catch-paste-input
==後面是補充參考
ref→http://jsfiddle.net/SLaks/nt4SD/
ref→http://stackoverflow.com/questions/8655604/attach-a-handler-for-all-event-types
ref→http://www.javascriptkit.com/javatutors/navigator.shtml
ref→http://topic.csdn.net/t/20020612/19/798745.html
ref→http://php.net/manual/en/function.get-browser.php
2012年3月21日 星期三
javascript reload出現詢問視窗
ref→http://www.cnblogs.com/huobazi/archive/2004/04/06/RefreshOrReloadParentWindowWithoutConfirm.html
發現在IE9或Firfox使用opener.location.reload()
當有要從子網頁取得資訊給原本開啟的網頁用時,都會跳出擾人的詢問視窗
目前只要將此一段採用→ window.opener.location.href=window.opener.location.href;
採取重新定位的方式,就可以跟擾人的訊息saygoodbye了
發現在IE9或Firfox使用opener.location.reload()
當有要從子網頁取得資訊給原本開啟的網頁用時,都會跳出擾人的詢問視窗
目前只要將此一段採用→ window.opener.location.href=window.opener.location.href;
採取重新定位的方式,就可以跟擾人的訊息saygoodbye了
2012年3月13日 星期二
離開頁面顯示訊息,當有TreeView的忽略方法
因為IE在點選TreeNode的時後,也會判定頁離開,故採用以下方法即可
<span onclick="window.document.body.onbeforeunload=null;return true;">
<asp:TreeView ID="TreeView1" runat="server">....</asp:TreeView>
</span>
<asp:LinkButton ID="btn1" runat="server" onclick="Clickbtn" OnClientClick="window.document.body.onbeforeunload=null;return true;"></asp:LinkButton>
<script type="text/javascript">
window.document.body.onbeforeunload = function () { return '請問您確定不儲存離開嗎?'; }
</script>
補充:如果使用firefox請愛用→opener.window.parent.onbeforeunload = null;
<span onclick="window.document.body.onbeforeunload=null;return true;">
<asp:TreeView ID="TreeView1" runat="server">....</asp:TreeView>
</span>
<asp:LinkButton ID="btn1" runat="server" onclick="Clickbtn" OnClientClick="window.document.body.onbeforeunload=null;return true;"></asp:LinkButton>
<script type="text/javascript">
window.document.body.onbeforeunload = function () { return '請問您確定不儲存離開嗎?'; }
</script>
補充:如果使用firefox請愛用→opener.window.parent.onbeforeunload = null;
java script,取得資源字串
<script type="text/javascript">
var msg = "<%=Resources.msg.訊息 %>"
alert(msg);
</script>
以此取得訊息即可
var msg = "<%=Resources.msg.訊息 %>"
alert(msg);
</script>
以此取得訊息即可
2012年2月29日 星期三
存取被拒 ,行:5959 解決方式(未證實
ref:http://www.dotblogs.com.tw/jimmyyu/archive/2009/04/21/8116.aspx
跟上面的遇到相同問題
當iframe使用到了scriptManager
然後就存取拒絕,偏偏是舊版本的…
目前實做了一下,遇到了sys/type未定義
因為我不僅僅只有iframe頁面使用,連main頁面也使用
最後…
只有忍痛先將iframe頁面先拿掉了…
目前先將連結記錄在此,有空在拿來實測一次
跟上面的遇到相同問題
當iframe使用到了scriptManager
然後就存取拒絕,偏偏是舊版本的…
目前實做了一下,遇到了sys/type未定義
因為我不僅僅只有iframe頁面使用,連main頁面也使用
最後…
只有忍痛先將iframe頁面先拿掉了…
目前先將連結記錄在此,有空在拿來實測一次
無法開機時修復
無法開機時修復
1.先修改 BIOS 改成 CD-ROM 開機,放入 WinXP 光碟 開機
2.按 ”R” 修復 按 Enter
3.選擇 ”1” 按 Enter
4.出現輸入 "Adminstrator" 密碼(有設定才輸入,沒設定的按 Enter)→然後就可以開始輸入指令
5.出現 C:Windows> 輸入”MAP” 按 Enter
6.再輸入”FIXBOOT” 按 Enter
7.選擇作業系統資料C或D.E 按 ”Y” 按 Enter
8.再輸入”FIXMBR”Enter 按 ”Y” Enter
9.最後輸入”EXIT” Enter 即可重新正常啟動WinXP
ref:
http://tw.group.knowledge.yahoo.com/fix-computer/article/view?aid=85
1.先修改 BIOS 改成 CD-ROM 開機,放入 WinXP 光碟 開機
2.按 ”R” 修復 按 Enter
3.選擇 ”1” 按 Enter
4.出現輸入 "Adminstrator" 密碼(有設定才輸入,沒設定的按 Enter)→然後就可以開始輸入指令
5.出現 C:Windows> 輸入”MAP” 按 Enter
6.再輸入”FIXBOOT” 按 Enter
7.選擇作業系統資料C或D.E 按 ”Y” 按 Enter
8.再輸入”FIXMBR”Enter 按 ”Y” Enter
9.最後輸入”EXIT” Enter 即可重新正常啟動WinXP
ref:
http://tw.group.knowledge.yahoo.com/fix-computer/article/view?aid=85
2012年2月21日 星期二
KB927917錯誤解決方法
出现此问题的原因子容器 HTML 元素包含试图修改子容器的父容器元素的脚本。 脚本试图使用innerHTML 方法或 appendChild 方法修改父容器元素。例如如果 DIV 元素是在 BODY 元素中的子容器,并在 DIV 元素中的一个 SCRIPT 块尝试修改 DIV 元素的父容器的BODY 元素,可能会出现此问题
ref→http://www.nczonline.net/blog/2008/03/17/the-dreaded-operation-aborted-error/
ref→http://www.nczonline.net/blog/2008/03/17/the-dreaded-operation-aborted-error/
- Move the
script
element so that it’s a direct child ofbody
. - Use
insertBefore()
to insert thediv
at the beginning ofbody
instead of the end. - Wait until the page is loaded before attempting to manipulate
document.body
.
我採用了
$(document).ready(function()
{
//TODO
})
這個方式的確是解決XD(大部份都是發生在IE8直接顯示錯誤並無法連結)
2012年2月15日 星期三
javascript心得,子元件的顯示與消失測試
<div id="1">
<div id="1_1" style="display: block;"> 我是子項目一</div>
<div id="1_2" style="display: block;"> 我是子項目二</div>
</div>
<input id="checkGetFirstData" type="checkbox" onclick="CheckGetData(this)"/>
<script>
function CheckGetData(obj)
{
var tree = document.getElementById("1");
var treendes = tree.childNodes;
for(i=0; i <treendes.length; i++)
{
if(treendes[i].nodeType==1 && treendes[i].tagName)
{
if(obj.checked)
{
tree.childNodes[i].style.display="none";
}
else
{
tree.childNodes[i].style.display="";
//tree.childNodes[1].style.display="block";
}
}
}
}
</script>
//下面就可以測試用TreeView模擬點擊打開及關閉
function expand(obj,closestr,openstr,treeid) {
var treeobj = document.getElementById(treeid);
var check = (obj.value.indexOf('展開') != -1) ? "Expand" : "Collapse";
obj.value = (obj.value != openstr) ? openstr : closestr;
for (var i = 0; i < treeobj.childNodes.length; i++) {
if (treeobj.childNodes[i] != null && treeobj.childNodes[i].id) {
TreeNodeExpand(document.getElementById(treeobj.childNodes[i].id), check);
}
}
}
//展開或折曡子節點
function TreeNodeExpand(elm, check) {
for (var i = 0; i <= elm.childNodes.length; i++) {
var child = elm.childNodes[i];
if (child != null) {
arguments.callee(child, check);
if (child.id != null && child.id != "" && child.getAttribute('href') && child.firstChild.tagName == 'IMG') {
if (child.firstChild.getAttribute('alt').indexOf(check) != -1) {
eval(child.getAttribute('href').replace('javascript:', ''));
//window.location = child.getAttribute('href');
}
}
}
}
}
Ps另外有可能FF會多判定→if (nodes[i].nodeType == 1 && nodes[i].tagName )子群組加上這個就可以看到正確
<div id="1_1" style="display: block;"> 我是子項目一</div>
<div id="1_2" style="display: block;"> 我是子項目二</div>
</div>
<input id="checkGetFirstData" type="checkbox" onclick="CheckGetData(this)"/>
<script>
function CheckGetData(obj)
{
var tree = document.getElementById("1");
var treendes = tree.childNodes;
for(i=0; i <treendes.length; i++)
{
if(treendes[i].nodeType==1 && treendes[i].tagName)
{
if(obj.checked)
{
tree.childNodes[i].style.display="none";
}
else
{
tree.childNodes[i].style.display="";
//tree.childNodes[1].style.display="block";
}
}
}
}
</script>
//下面就可以測試用TreeView模擬點擊打開及關閉
function expand(obj,closestr,openstr,treeid) {
var treeobj = document.getElementById(treeid);
var check = (obj.value.indexOf('展開') != -1) ? "Expand" : "Collapse";
obj.value = (obj.value != openstr) ? openstr : closestr;
for (var i = 0; i < treeobj.childNodes.length; i++) {
if (treeobj.childNodes[i] != null && treeobj.childNodes[i].id) {
TreeNodeExpand(document.getElementById(treeobj.childNodes[i].id), check);
}
}
}
//展開或折曡子節點
function TreeNodeExpand(elm, check) {
for (var i = 0; i <= elm.childNodes.length; i++) {
var child = elm.childNodes[i];
if (child != null) {
arguments.callee(child, check);
if (child.id != null && child.id != "" && child.getAttribute('href') && child.firstChild.tagName == 'IMG') {
if (child.firstChild.getAttribute('alt').indexOf(check) != -1) {
eval(child.getAttribute('href').replace('javascript:', ''));
//window.location = child.getAttribute('href');
}
}
}
}
}
Ps另外有可能FF會多判定→if (nodes[i].nodeType == 1 && nodes[i].tagName )子群組加上這個就可以看到正確
javascript心得,取得設定輸入元件的Value
ref→http://perishablepress.com/
ref→http://hi.baidu.com/webworker/blog/item/1595fbded544f55395ee37f3.html
ref→http://www.w3schools.com/js/js_obj_array.asp
ref→http://stackoverflow.com/questions/237104/array-containsobj-in-javascript
ref→http://www.cnblogs.com/lianqianxue/archive/2011/05/17/2048856.html
ref→http://hi.baidu.com/yxhua240/blog/item/f7b186135804f2ddf7039eea.html
ref→http://www.dotblogs.com.tw/eason.yen/archive/2011/02/17/21419.aspx
ref→http://www.cnblogs.com/yond/
ref→http://webcenter.hit.edu.cn/articles/2009/05-16/05070500.htm
當只要設定輸入欄位的值,只需要這樣做即可
連Firefox,IE都可支援了
<body>
<input type="text" id="text1" onkeyup=this.setAttribute('value',this.value) class="test" value="123" size="28">
<input type="text" id="text2" class="test" value="456" size="28">
<input id="checkGetFirstData" type="checkbox" onclick="CheckGetData()"/>
</body>
function CheckGetData()
{
var obj = document.getElementById("checkGetFirstData");
var objtext = document.getElementById("text1");
if(obj.checked)
{
objtext.value = "";
//objtext.setAttribute('value',this.value); //Firefox無法使用
//alert("check!")
}
else
{
objtext.value = "bbb";
//alert("no check!")
}
}
ref→http://hi.baidu.com/webworker/blog/item/1595fbded544f55395ee37f3.html
ref→http://www.w3schools.com/js/js_obj_array.asp
ref→http://stackoverflow.com/questions/237104/array-containsobj-in-javascript
ref→http://www.cnblogs.com/lianqianxue/archive/2011/05/17/2048856.html
ref→http://hi.baidu.com/yxhua240/blog/item/f7b186135804f2ddf7039eea.html
ref→http://www.dotblogs.com.tw/eason.yen/archive/2011/02/17/21419.aspx
ref→http://www.cnblogs.com/yond/
ref→http://webcenter.hit.edu.cn/articles/2009/05-16/05070500.htm
當只要設定輸入欄位的值,只需要這樣做即可
連Firefox,IE都可支援了
<body>
<input type="text" id="text1" onkeyup=this.setAttribute('value',this.value) class="test" value="123" size="28">
<input type="text" id="text2" class="test" value="456" size="28">
<input id="checkGetFirstData" type="checkbox" onclick="CheckGetData()"/>
</body>
function CheckGetData()
{
var obj = document.getElementById("checkGetFirstData");
var objtext = document.getElementById("text1");
if(obj.checked)
{
objtext.value = "";
//objtext.setAttribute('value',this.value); //Firefox無法使用
//alert("check!")
}
else
{
objtext.value = "bbb";
//alert("no check!")
}
}
2012年2月9日 星期四
跳出訊息並轉頁面
ref→http://stackoverflow.com/questions/2345807/window-location-does-not-work-on-chrome-browser
ref→http://msdn.microsoft.com/zh-tw/library/system.web.ui.page.registerclientscriptblock(v=vs.80).aspx
Page.RegisterClientScriptBlock("alert", "<script>alert('請先登入會員!');</script>");
Page.RegisterClientScriptBlock("clientScript", "<script>window.location='index.aspx';window.location.href='index.aspx';</script>");
ref→http://msdn.microsoft.com/zh-tw/library/system.web.ui.page.registerclientscriptblock(v=vs.80).aspx
Page.RegisterClientScriptBlock("alert", "<script>alert('請先登入會員!');</script>");
Page.RegisterClientScriptBlock("clientScript", "<script>window.location='index.aspx';window.location.href='index.aspx';</script>");
2012年2月2日 星期四
MYSQL關於DateTime的知識
ref→http://mysql.yui.tw/2008/03/adddate.html
ref→http://www.w3school.com.cn/sql/func_curdate.asp
要查今天以前的30天可以這樣寫
Select * From table where date > (ADDDATE(CURDATE(),-30))
ref→http://blog.longwin.com.tw/2007/10/mysql_timestamp_properties_2007/
ref→http://dev.mysql.com/doc/refman/5.1/en/timestamp.html
若希望能更新的時後,日期的欄位也跟著更新,可以使用Timestamp這個欄位型態
ref→http://www.w3school.com.cn/sql/func_curdate.asp
要查今天以前的30天可以這樣寫
Select * From table where date > (ADDDATE(CURDATE(),-30))
ref→http://blog.longwin.com.tw/2007/10/mysql_timestamp_properties_2007/
ref→http://dev.mysql.com/doc/refman/5.1/en/timestamp.html
若希望能更新的時後,日期的欄位也跟著更新,可以使用Timestamp這個欄位型態
2012年2月1日 星期三
字串@的應用/C# Thread入門/主鍵和複和主鍵
字串@的應用
ref→
http://www.dotblogs.com.tw/wadehuang36/archive/2010/05/11/15150.aspx?fid=31731#feedback
string s = @"Select *
From table
Where name like 'a%' ";
C# Thread入門
ref→
http://tc.itkee.com/developer/detail-11f9.html
主鍵和複合主鍵
ref→
http://www.iteedu.com/webtech/j2ee/hibernatediary/22.php
ref→
http://tc.itkee.com/database/detail-950.html
ref→
http://www.dotblogs.com.tw/wadehuang36/archive/2010/05/11/15150.aspx?fid=31731#feedback
string s = @"Select *
From table
Where name like 'a%' ";
C# Thread入門
ref→
http://tc.itkee.com/developer/detail-11f9.html
主鍵和複合主鍵
ref→
http://www.iteedu.com/webtech/j2ee/hibernatediary/22.php
ref→
http://tc.itkee.com/database/detail-950.html
2012年1月30日 星期一
url中文亂碼
最近在做網站連結會發現一些錯誤
在網路參考了一些文章→http://blog.ericsk.org/archives/1423
決定將其做一個整理
空白→用%20取代
另外遇到中文的話,再用Server.UrlEncode
like this→Server.UrlEncode("中文路徑名稱").Replace("+","%20")
順帶一提,若檔案名稱的連結也有個+號的話
就照下列的方式→http://support.microsoft.com/kb/942076/zh-tw
http://blog.phpclubs.com/?p=490
在web.config底下加入此代碼
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true"></requestFiltering>
</security>
</system.webServer>
在網路參考了一些文章→http://blog.ericsk.org/archives/1423
決定將其做一個整理
空白→用%20取代
另外遇到中文的話,再用Server.UrlEncode
like this→Server.UrlEncode("中文路徑名稱").Replace("+","%20")
順帶一提,若檔案名稱的連結也有個+號的話
就照下列的方式→http://support.microsoft.com/kb/942076/zh-tw
http://blog.phpclubs.com/?p=490
在web.config底下加入此代碼
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true"></requestFiltering>
</security>
</system.webServer>
2012年1月6日 星期五
MemberShip的帳號大小寫判定
會有如同標題判定的原因出自於是匯入舊的會員資料
並不希望動到任何問題
老實很頭大
這樣的做法等於是在確定好的設計之下在挖洞
不過…有要求也只好做了…
1.先改變定序資料
找到定序資料,將UserName那一欄的定序值改成區分大小寫
變更資料庫的定序 alter database [DatabaseName] collate [CollationName]
如果會用定序連全形,半形都能分辨哩(算是多學到一課了)→http://www.dotblogs.com.tw/jimmyyu/archive/2009/08/30/10320.aspx
2.再將重覆的資料重新匯入時
多在帳號後面加個序號
接著在到UserName將此序號刪除…目前看起來是沒什麼問題
繼續測試中…
遇到的問題
有時後Excell轉檔格式會有將字串日期自動判讀及匯出這點很討厭啊…
在前面加個 ' 這個小米點,就能以字串格式完整匯入了…
並不希望動到任何問題
老實很頭大
這樣的做法等於是在確定好的設計之下在挖洞
不過…有要求也只好做了…
1.先改變定序資料
找到定序資料,將UserName那一欄的定序值改成區分大小寫
變更資料庫的定序 alter database [DatabaseName] collate [CollationName]
如果會用定序連全形,半形都能分辨哩(算是多學到一課了)→http://www.dotblogs.com.tw/jimmyyu/archive/2009/08/30/10320.aspx
2.再將重覆的資料重新匯入時
多在帳號後面加個序號
接著在到UserName將此序號刪除…目前看起來是沒什麼問題
繼續測試中…
遇到的問題
有時後Excell轉檔格式會有將字串日期自動判讀及匯出這點很討厭啊…
在前面加個 ' 這個小米點,就能以字串格式完整匯入了…
訂閱:
文章 (Atom)