藍天,逐漸地被叢起的大樓切割竊佔
2013/09/28
2013/09/06
在IE中遇到innerHTML的錯誤
工作紀錄
在寫AJAX式的網頁程式時,常會使用innerHTML來置換掉某部份內容。例如:
document.getElementById("someid").innerHTML = "xxxxxx";
今天遇到一個問題,在HTML中有
<div id="mydiv">
<table id="mytable" style="width: 99%px;"></table>
</div>
然後用下列的JavaScript來填入table的內容:
var s = "<tr><td>AAA</td><td>BBB</td></tr>";
document.getElementById("mytable").innerHTML = s;
這樣的方式在Firefox, Chrome, Opera等都正常,唯獨 IE (8 & 9) 有問題,會出現"未知的執行階段錯誤" (unknown runtime error) 或 SCRIPT600 error。
後來發現,必須要用下列的方式才能滿足這四種browsers。
var s = "<table id="mytable" style="width: 99%px;"><tr><td>AAA</td><td>BBB</td></tr></table>";
document.getElementById("mydiv").innerHTML = s;
猜測:IE在填值到innerHTML時,可能會檢查所填入的內容。前面的例子只填入table的內容,沒有包含<table></table>的tag,IE可能認為這是不完整的內容而發生錯誤。後者則因包含了<table></table>tag,是完整的語法,因此就能接受。
後來也試了<select> tag,如果只給innerHTML一堆<option> tags,也是會有這樣的錯誤,若是包含select tag就OK了。
在寫AJAX式的網頁程式時,常會使用innerHTML來置換掉某部份內容。例如:
document.getElementById("someid").innerHTML = "xxxxxx";
今天遇到一個問題,在HTML中有
<div id="mydiv">
<table id="mytable" style="width: 99%px;"></table>
</div>
然後用下列的JavaScript來填入table的內容:
var s = "<tr><td>AAA</td><td>BBB</td></tr>";
document.getElementById("mytable").innerHTML = s;
這樣的方式在Firefox, Chrome, Opera等都正常,唯獨 IE (8 & 9) 有問題,會出現"未知的執行階段錯誤" (unknown runtime error) 或 SCRIPT600 error。
後來發現,必須要用下列的方式才能滿足這四種browsers。
var s = "<table id="mytable" style="width: 99%px;"><tr><td>AAA</td><td>BBB</td></tr></table>";
document.getElementById("mydiv").innerHTML = s;
猜測:IE在填值到innerHTML時,可能會檢查所填入的內容。前面的例子只填入table的內容,沒有包含<table></table>的tag,IE可能認為這是不完整的內容而發生錯誤。後者則因包含了<table></table>tag,是完整的語法,因此就能接受。
後來也試了<select> tag,如果只給innerHTML一堆<option> tags,也是會有這樣的錯誤,若是包含select tag就OK了。
呼叫SVG裡的javascript method
工作筆記
A.html中用下面的tag包含了一個SVG
在B.svg中有一個JavaScript function: myfunction()
如果要從A.html呼叫B.svg裡的這個function,可以用下面的方法來進行
document.getElementById("svg").getSVGDocument().defaultView.myfunction();
A.html中用下面的tag包含了一個SVG
在B.svg中有一個JavaScript function: myfunction()
如果要從A.html呼叫B.svg裡的這個function,可以用下面的方法來進行
document.getElementById("svg").getSVGDocument().defaultView.myfunction();
2013/08/17
如何在關掉SqlDataReader時也關掉SqlConnection
在C#中以ADO.NET連接資料庫,遇到一個應用是method A去呼叫method B,B開啟一個SqlConnection物件後,執行select statement,將獲得的SqlDataReader傳回給A使用。
在method A中使用SqlDataReader後,可以將SqlDataReader關閉(close),來加速回收此物件的速度。可是,在method B中的SqlConnection就沒有辦法做close了。
當然我們不能在離開B時就把SqlConnection就close掉,因為在method B中執行SqlCommand.ExecuteReader時,並不是一次就把所有的result set都放進SqlDataReader中,而是以stream的方式透過SqlConnection傳進來。所以如果先把SqlConnection關了,SqlDataReader也就讀不到資料了。若是SqlConnection不關閉,又會在一段時間中佔用database connection與相關資源。
後來在網路上找到了這一篇
http://codes.codedigest.com/CodeDigest/164-Implicitly-Closing-the-Connection-object-when-SqlDataReader-is-returned-from-a-Function.aspx
特別注意到這一行
SqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
如果在ExecuteReader加入參數CommandBehavior.CloseConnection,則當對SqlDataReader進行close時,也會將其底層的SqlConnection也關掉。這樣,就可以適時地把SqlConnection關閉,儘早釋放出資源。這對尤其是server-side的系統來說,相當重要。
在method A中使用SqlDataReader後,可以將SqlDataReader關閉(close),來加速回收此物件的速度。可是,在method B中的SqlConnection就沒有辦法做close了。
當然我們不能在離開B時就把SqlConnection就close掉,因為在method B中執行SqlCommand.ExecuteReader時,並不是一次就把所有的result set都放進SqlDataReader中,而是以stream的方式透過SqlConnection傳進來。所以如果先把SqlConnection關了,SqlDataReader也就讀不到資料了。若是SqlConnection不關閉,又會在一段時間中佔用database connection與相關資源。
後來在網路上找到了這一篇
http://codes.codedigest.com/CodeDigest/164-Implicitly-Closing-the-Connection-object-when-SqlDataReader-is-returned-from-a-Function.aspx
特別注意到這一行
SqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
如果在ExecuteReader加入參數CommandBehavior.CloseConnection,則當對SqlDataReader進行close時,也會將其底層的SqlConnection也關掉。這樣,就可以適時地把SqlConnection關閉,儘早釋放出資源。這對尤其是server-side的系統來說,相當重要。
訂閱:
文章 (Atom)