2011-07-12 9 views
1

ここでは、問題を再現する最も簡単なコードを示します。 (AJAX呼び出しでエラーが発生した場合、私の現実世界の例では、私は、チェックボックスをリセットしています。)IE9ではユーザーが画面上の任意の場所をクリックすると、IEはチェックボックスの変更イベントを発生させます。

<html> 
    <script src="http://code.jquery.com/jquery-1.4.2.js"></script> 
<script> 
    $(document).ready(function(){ 
     $('#ckbx').change(function(e){ 
      alert('fired.'); 
      this.checked = !this.checked; 
     }) 
    }); 
</script> 

<form> 
    <input id="ckbx" type="checkbox"></input> 
</form> 

</html> 

、私はチェックボックスをクリックしたとき、それは警告を表示します。それから、時間を待ってから、ページの他の場所をクリックすると、再びイベントが発生します。

this.checked = !this.checkedを削除すると問題が解決します。

誰でもこのことを私に説明できますか?または、この問題を回避する方法を提供しますか?

更新日: 私はjquery 1.4.2を使用しています。 jquery 1.6ではこれは問題ではありません。しかし、私たちはリリースに近づいており、jqueryのバージョンを変更することには消極的です。

+0

jQueryのIE9のために更新されています。 IE9に固有の古いjQueryバグを見つけてjQuery 1.6で修正したので、あなたが私たちに何を望んでいるのか分かりません。 – Sparky

+1

IE7ではjQuery 1.6.2でもそれができますので、それは関係ないと思います。 – Pointy

+0

'Khm'!.....「IE」と聞いたことがありますか? :) –

答えて

1

これは、チェックボックスをリセットしてページの他の場所をクリックすると、.change()イベントが再度発生しているためです。代わりに.click()イベントを使用する必要があります。

<html> 
    <script src="http://code.jquery.com/jquery-1.4.2.js"></script> 
<script> 
    $(document).ready(function(){ 
     $('#ckbx').click(function(e){ 
      alert('fired.'); 
      this.checked = !this.checked; 
     }) 
    }); 
</script> 

<form> 
    <input id="ckbx" type="checkbox"></input> 
</form> 

</html> 
+1

このレスポンスを読むと、もともと私は、ユーザーがキーボードを使用したときにクリックが処理されないと考えていましたが、そうしました。だから、私はこの解決策に行くつもりです。ありがとう。 – mlsteeves

1

問題は、変更イベント内から変更イベントを有効に発生させることです。 1つのオプションは別のイベントを使用することで、コードを介して値を変更することができます。あなたはこれに類似activeFlagを検討することもでき代わり

、...助け

var activeFlag; 
$(document).ready(function(){ 
    activeFlag = true; 
    $('#ckbx').change(function(e){ 
     if(activeFlag) 
     { 
      alert('fired.'); 
      activeFlag = false;//temp disable event to process value reset 
      this.checked = !this.checked; 
      activeFlag = true; 
     } 
    }) 
}); 

希望

RE:これは私の提案を使用するのと同じだろう他のSUGGESTION

別のイベント。ただし、クリックすると、ユーザーがスペースバーに移動してスペースバーを使用して変更を行うと、イベントハンドラが失われます。もちろん、これが許容可能かどうかを判断することができます。

他のポスターに申し訳ありませんが、あなたのコメントはありますが、まだ評判はありません。実際に私がここにいる理由は、私は純粋にそれを構築して、15を打つことができ、先日私を助けた答えをマークすることができます。このように実施された場合、それが動作するのに、愚かな、本当に

1

アクティブフラグのアイデアは、同じ問題を抱えているようだ:

var activeFlag = true; 
$('#ckbx').change(function(e){ 
    if(activeFlag) 
    { 
     activeFlag = false; 
     alert('fired.');    
     this.checked = !this.checked;   
    } 
    else 
    { 
     activeFlag = true; 
    } 
}) 
関連する問題