有句電影台詞是女生對風流倜儻的男主角說:晚上很喜歡睡的旁邊是你,但又怕早上醒來時旁邊還是你。說著是男主角是浪漫卻不能依賴。程式語言有Strong Type和Weak Type之分,Strong Type語言顯然像赤木剛憲般的顧家好男人,Weak Type語言則如同剛說的風流倜儻男主角。Java Script是個古老的Weak Type語言,有相當多的Syntax Sugar,但也常難以捉摸,令人氣結。 需求上是Popup一個視窗,輸入完後按鈕或[X]返回父視窗,而父視窗在Popup視窗未close之前不得被點選。所以找到了window.showModalDialog這個method,卻屢屢無效,最後才知道原來是Google Chrome不支援,支援的有IE和FireFox及Safari,而Chrome和Opera是不支援的。OK!那如何從Popup視窗傳值回父視窗呢?單值還好,多個值…還不如由父視窗提供一個callback的Java Script function給Popup視窗在window.close()前呼叫,只是很狐疑的是,為何以下兩個敍述是等價的:
window.opener.callback window.dialogArguments.callback 而按網路的建議寫法,應該是這樣:
| if (window.dialogArguments != null) { window.dialogArguments.callback(data); } window.opener = null; window.close(); |
估計是預防父視窗當掉,連在Popup視窗也受影響吧!特別像Chrome可以不小心手動close父視窗。
Jemmy 發表在 痞客邦 留言(0) 人氣(861)
E { CSS Rule } Selector examples: <td>、<a>…。E是Tag。 #uniqueID { CSS Rule } Selector examples: <div id="uniqueID"> E.className { CSS Rule } Selector examples: <p class="className">。若是.className,則是不管任何Tag,符合className的class均受影響。 E1, E2, E3 { CSS Rule } Select examples: p, #unique_id, div.class_name。以逗號分隔元素,符合其中一個均受影響。元素不限於Tag,可以是#ID、class name等。#後接的是ID,小數點後接的是class style name。 E F { CSS Rule } Selector examples: #links a。 E元素後接的F元素均受影響。 * { CSS Rule } 所有元素均受影響。 寫了那麼久的網頁,總算因專案要survey jQuery,在大陸簡體書"鋒利的jQuery"才意外看到CSS一般的用法。
Jemmy 發表在 痞客邦 留言(0) 人氣(19)
今天在IE測試Web,在Testing沒事,在Production就出現Java Script錯誤。有時是Cache到以前的HTML所導致的,記得對頁面按F5去Refresh,也許就成了。
Jemmy 發表在 痞客邦 留言(0) 人氣(21)
半轉全function unAsc(text) {
var asciiTable = "!\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
var big5Table = "%uFF01%u201D%uFF03%uFF04%uFF05%uFF06%u2019%uFF08%uFF09%uFF0A%uFF0B%uFF0C%uFF0D%uFF0E%uFF0F%uFF10%uFF11%uFF12%uFF13%uFF14%uFF15%uFF16%uFF17%uFF18%uFF19%uFF1A%uFF1B%uFF1C%uFF1D%uFF1E%uFF1F%uFF20%uFF21%uFF22%uFF23%uFF24%uFF25%uFF26%uFF27%uFF28%uFF29%uFF2A%uFF2B%uFF2C%uFF2D%uFF2E%uFF2F%uFF30%uFF31%uFF32%uFF33%uFF34%uFF35%uFF36%uFF37%uFF38%uFF39%uFF3A%uFF3B%uFF3C%uFF3D%uFF3E%uFF3F%u2018%uFF41%uFF42%uFF43%uFF44%uFF45%uFF46%uFF47%uFF48%uFF49%uFF4A%uFF4B%uFF4C%uFF4D%uFF4E%uFF4F%uFF50%uFF51%uFF52%uFF53%uFF54%uFF55%uFF56%uFF57%uFF58%uFF59%uFF5A%uFF5B%uFF5C%uFF5D%uFF5E";
var result = "";
for ( var i = 0 ; i < text.length ; i ++ ) {
var val = text.charAt(i) ;
var j = asciiTable.indexOf(val) * 6 ;
result += ( j > -1 ? unescape(big5Table.substring( j , j + 6 ) ) : val );
}
return result;
}
全轉半function asc(text)
{
var asciiTable = "!\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
var big5Table = "%uFF01%u201D%uFF03%uFF04%uFF05%uFF06%u2019%uFF08%uFF09%uFF0A%uFF0B%uFF0C%uFF0D%uFF0E%uFF0F%uFF10%uFF11%uFF12%uFF13%uFF14%uFF15%uFF16%uFF17%uFF18%uFF19%uFF1A%uFF1B%uFF1C%uFF1D%uFF1E%uFF1F%uFF20%uFF21%uFF22%uFF23%uFF24%uFF25%uFF26%uFF27%uFF28%uFF29%uFF2A%uFF2B%uFF2C%uFF2D%uFF2E%uFF2F%uFF30%uFF31%uFF32%uFF33%uFF34%uFF35%uFF36%uFF37%uFF38%uFF39%uFF3A%uFF3B%uFF3C%uFF3D%uFF3E%uFF3F%u2018%uFF41%uFF42%uFF43%uFF44%uFF45%uFF46%uFF47%uFF48%uFF49%uFF4A%uFF4B%uFF4C%uFF4D%uFF4E%uFF4F%uFF50%uFF51%uFF52%uFF53%uFF54%uFF55%uFF56%uFF57%uFF58%uFF59%uFF5A%uFF5B%uFF5C%uFF5D%uFF5E";
var result = "";
for (var i = 0; i < text.length; i++) {
var val = escape(text.charAt(i));
var j = big5Table.indexOf(val);
result += (((j > -1) && (val.length == 6)) ? asciiTable.charAt(j / 6) : text.charAt(i));
}
return result;
}
Jemmy 發表在 痞客邦 留言(0) 人氣(653)
不熟YUI,但身為國際化的Ajax Library,應該都是以UTF-8作為傳輸用的編碼。
從JSP post到另一個JSP或是Servlet,在request.getParameter取得參數需做以下的轉換。
keyword = new String(request.getParameter("p_keyword").getBytes("ISO-8859-1"), "UTF-8");
而JSP檔是否以UTF-8格式儲存(charset也設為UTF-8)倒不一定。因為Big5或MS950也能編碼成功。
Jemmy 發表在 痞客邦 留言(0) 人氣(77)
難得走Fubon做一下維護工作,很奇怪心情完全不一樣,放鬆了不再緊繃。也巧遇前公司故人兩個零來Fubon做需求訪談。上午尋找批次出錯問題,是在使用java.sql.Savepoint時出錯,這是JDBC 3.0才有的功能,Oracle的ojdbc14才支援;接著尋找該批次之的設定,classpath確實指向ojdbc14.jar,14之意是指支援JDK 1.4以上的版本(前一版classes12.zip當然指支援JDK 1.2以上);所以在command mode下了java -version,罪魁禍首是jdk1.3.1,雖然該主機有安裝JDK 1.5,顯然Path沒有指向它,原因是Oracle 9i後來才安裝,oracle也有自己的jdk,9i的JDK版本正是1.3.1,在安裝Oracle 9i後,自動把JDK的bin目錄加到Path的最前頭。問題迎刃而解。下午也是一個Java Script的基本問題,很簡單卻也搞了一下午,先是沒有source code,只能直接改JSP,出錯了也不知錯哪裡,編譯程式這時優點好過直譯程式,而後來使用window.open去開一個新url,但前面老是被冠上web context的URL,原因是www.money-link.com.tw前面沒有加http:// Jemmy 發表在 痞客邦 留言(0) 人氣(24)

Ajaxis (Ajax + axis)
這兩天剛好踹到AJAX與Axis(Java的Web Services套件), 就把整合一個sample套餐如下: 下載材料:prototype.js, Axis套件(axis-bin-1_4.zip) 下載廚具:Java Web Server(如Tomcat, OC4J...)本人用OC4J 10.1.13 料理砧板:NotePad就行(我用高級一點的EditPlus) 1.Axis套件解壓縮,取出webapps目錄下的Axis子目錄(相當於一個WAR),copy到 Web Server放Application目錄下備用(Web Server如何新增一個Web Context自行參考說明) 2.寫個Java Web Service, 叫Hello.jws(副檔名一定要叫jws), 如下 public class Hello { public String say(String name, int age) { return "Hello! " + name + " " + age; } } 料理完畢後,請將Hellow.jws放在axis目錄下 3.寫個HTML,做測試Ajaxis之用,代碼如下: <HTML> <HEAD> <TITLE> Test Ajaxis </TITLE> </HEAD> <script type="text/javascript" src="./prototype.js"></script> <script type="text/javascript" src="./ajaxis.js"></script> <BODY> Name: <INPUT TYPE="text" NAME="Name" size=10/> Age: <INPUT TYPE="text" NAME="Age" size=5/> <INPUT TYPE="button" value="詢問" onClick="callAjaxis()"><p> <TEXTAREA NAME="msg" ROWS="20" COLS="80"></TEXTAREA> </BODY> </HTML> 紅字必須排在藍字之前. 4.寫個Java Script透過Ajax去call webservices, 名叫ajaxis.js function callAjaxis() { var name = document.getElementById("name").value; var age = document.getElementById("age").value; var url = "http://localhost:8888/axis/Hello.jws?method=say&name=" + name + "&age=" + age; new Ajax.Request(url, { method: 'get',onComplete: handleAjaxis }); } function handleAjaxis(httpObj) { document.getElementById("msg").value = httpObj.responseText; } 5.記得html, prototype.js與ajaxis.js要放在同一個目錄,用IE開啟html,輸入Name, Age, 按[詢問], 它會執行ajaxis.js的callAjaxis, 回傳值會經由指定的function(handleAjaxis)取得放在名為msg的textArea, 會有一堆討厭的soap tag, 可以改良使用DOM去取得所需要的資訊.
|
 |
|

|
|

|
後來把測試用的html(名為TestAjaxis.html)放到Web Server上,透過web server的url來go. 需做以下的設定, Ajax才能work: Edit C:\windows\system32\drivers\etc下的hosts文字檔,應該會有預設的一行 127.0.0.1 localhost Ajax的作用只能在localhost起作用,卻不能在實體IP或127.0.0.1起作用,後來我加了如下一行: 10.1.81.58 my 而之所以要編輯hosts,我猜是Browser對涉及像XMLHttpRequest元件等(如IE的ActiveXObject)會存取Client資訊加以安控所致. |
|
Jemmy 發表在 痞客邦 留言(3) 人氣(40)
Example 1:<script type="text/javascript" src="prototype.js"></script>被include的js檔內容不能有Tag,如<script/>,<html>之類Example 2:<script type="text/javascript" src="prototype.js"></script>
<script type="text/javascript" src="useAjax.js"></script>
若useAjax.js有引用prototype.js的內容,include需有先後順序
Example 3:Use Ajax
var url = "http://localhost:8888/axis/EchoHeader?wsdl";
new Ajax.Request(url, { method: 'get',onComplete: handleAxis});
onComplete所指的handleAxis是函數指標,待Ajax處理完後回給handleAxis
故要在Java Script宣告handleAxis處理傳回的結果:
function handleAxis(httpObj) { // httpObje是handleAxis區域變數,由prototype.js所呼叫
var returnText = httpObj.responseText; // 傳回的結果
// process ....
}
Jemmy 發表在 痞客邦 留言(0) 人氣(1,885)
凡電腦語言,涉及到小數加總,有時筆算明明是對的,但電腦總是比對的數字多出0.00000000...001
因為電腦計算單位是0與1,小數採浮點數格式,所以小數以二進位表示有時會展延成無理數
對此每個程式語言均有提供解法,Java Script的方法是total = Math.round(total * 100) / 100
Jemmy 發表在 痞客邦 留言(0) 人氣(24)
最近在debug程式,因不諳DHTML,深受IFrame之害,故此誌備忘.
IFrame的特性是由forward的JSP轉成html主頁後,傳到前端Browser,再由Browser載入IFrame的內容.
因此html主頁可以接收到forward的JSP內容轉換出來的變數值.
而IFrame卻無法與html主頁收到相同的變數值,因為html主頁是在Browser端載入IFrame的內容,
若IFrame內容也是JSP,在html主頁載入IFrame之時,IFrame會再向Web Server Request傳回轉換後的html.
因此html主頁的JSP的轉換值無法與IFrame的JSP共享.IFrame的用法其實也就Ajax未正名之前替代方案之一.
相形之下Ajax比IFrame單純多了.
另一個情境是在富邦案出現的,該情境未來可能出現其他的案子,而且很合理.
就是一個session user可同時處理不同視窗或頁籤卻相同的AP,但帶不同的客戶ID.
除了把scope從session改成request之外,另一種方式組Key,這樣不會擔心不同視窗搶到同一個session key的值,
怎麼組session key:客戶ID+"_keyname",甚至可以複雜到user id + "_" + custom id + "_" + key_nameJemmy 發表在 痞客邦 留言(0) 人氣(134)