用到 function() {...} 也中「Dynamic Code Evaluation」?
最近系統的 JavaScript 被原始碼掃描工具掃出「Dynamic Code Evaluation」的問題。程式類似如下,
var mstrPreText = "這裡是masterPage的Prefix_";
var oHttpReq = GetXmlHttpRequest();
oHttpReq.open("POST","test.aspx", false);
oHttpReq.send("");
var result = oHttpReq.responseText;
if (result == "abc") {
alert("HelloWorld");
window.setTimeout(function () { document.getElementById(mstrPreText + "TextBox2").focus(); }, 0);
return false;
}
就是取得Server端的一些資料到Client端後,再依結果來 Alert 一些訊息,並設定 focus 到某個 TextBox之中。
看起來並沒有什麼 Dynamic Code Evaluation 的問題呀!
依小弟的判斷可能是裡面有 function() { ... } 的關係!
所以讓 setTimeout 裡見不到 function() { ... } 應該就OK了吧!
所以上面的解法有3個,
1.不要使用 setTimeout ,自然就不會有 function(){…} 出現,直接設定 focus 到某個 TextBox之中。
document.getElementById(mstrPreText + "TextBox2").focus();
2.使用保哥提供的function,詳細請參考「利用 jQuery 將 DOM 元素聚焦 focus() 的六個版本」。
(function ($) {
jQuery.fn.setfocus = function () {
return this.each(function () {
var dom = this;
setTimeout(function () {
try { dom.focus(); } catch (e) { }
}, 0);
});
};
})(jQuery);
//改後的Code ...
var oHttpReq = GetXmlHttpRequest();
oHttpReq.open("POST", "test.aspx", false);
oHttpReq.send("");
var result = oHttpReq.responseText;
if (result == "abc") {
alert("HelloWorld");
$("#" + mstrPreText + "TextBox2" ).setfocus();
return false;
}
3.將原有設定 focus 抽出來另一個 function,如下,
function txtFocus(ctrlId) {
var txt = document.getElementById(txtId);
setTimeout(function () {
try { txt.focus(); } catch (e) { }
}, 0);
}
//改後的Code ...
var oHttpReq = GetXmlHttpRequest();
oHttpReq.open("POST", "test.aspx", false);
oHttpReq.send("");
var result = oHttpReq.responseText;
if (result == "abc") {
alert("HelloWorld");
txtFocus(mstrPreText + "TextBox2");
return false;
}
參考資訊
利用 jQuery 將 DOM 元素聚焦 focus() 的六個版本
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^