同事通報的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'); });

Post a comment