jQuery 1.4.2 .focus()導致IE首次change事件失效
5 |
同事通報的Issue,花了好大功夫才找出問題點,特此記錄。
某網頁的<input id="x" type="text" />以jQuery掛上change事件,使用IE測試,卻出現第一次修改值後按Tab不會觸發change事件,第二次起change事件正常的情形。我另外加了document.getElementById("x").onchange = function() { ... };作為對照,發現使用onchange掛上的事件每次都如預期被觸發,但用jQuery $("#x").change(function() { ... });掛上的事件卻會漏掉第一次修改,推斷問題應與jQuery有關。
經反覆測試,整理出簡單的"Bug重現隨身包"並確認問題出在jQuery 1.4.2版,再加上<input>呼叫.focus()設定焦點,就會在IE瀏覽器中發生首次change事件失效的狀況。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>OnChange Not Fired Issue</title>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.4.2.js"
type="text/javascript"></script>
<script type="text/javascript">
$(function () {
$("#a,#b").val("123").change(function () {
alert(this.id + " changed");
});
$("#a").focus();
});
</script>
</head>
<body>
<input id="a" /><input id="b" />
</body>
</html>
以上網頁使用IE7/8(咦? 那IE6呢? 見文末補充)測試會出現首次change事件未觸發的狀況(用FF, Chrome, Safari則正常),若改用jQuery-1.3.2.js, jQuery-1.4.4.js或jQuery-1.5.js則不會有問題,結論是只有"jQuery-1.4.2 + IE"的組合才會出錯,建議更換為1.4.4版或1.5+版本的jQuery應該就能避開。
【不用管IE6了嗎?】
前陣子,微軟啟動了撲殺IE6的計劃,喊出口號: "是夠義氣的朋友,就該幫忙擺脫IE6!" XD (Friends don't let friends use IE6),網站將持續統計全世界IE6的殘存比例,台灣目前約還有10.7%,但我想這已構成充分理由,足以請堅持網站仍需支援IE6的客戶去呷賽正視世界潮流,我也決定以後射茶包時,對於IE6-Only Issue一律採取"無視"原則來響應。
Web Developer們,大家團結起來把IE6弄死吧!!
Comments
# by jain
在ie6死之前,會死多少業務人員的腦細及浪費的口水呢? XD
# by ddttop
微軟要先幫公務員洗腦才行
# by 路人
IE 不好用,就放棄吧。現在有其他的瀏覽器可以取代IE.
# by 路人甲
IE6 假賽
# by BEAN
小弟我也是有遇到跟版大的狀況一樣,不過用另一種方式,看起來是解決了!如下: $('#' + _txtDurableYear_F).live('focusout', function () { } $('#' + _txtDurableYear_F).change(function () { $('_txtDurableYear_F).triggerHandler('focusout'); });