2017-12-26 26 views
5

私は、クリックイベントが完了する前に(つまり、ボックスがチェックされている)いくつかのjavascript/jQueryコードを実行できるので、チェックボックスのクリックイベントを中断する複雑なスキームを持っています。

しかし、Chrome(私のベースブラウザ)とFirefox(少数のユーザーが使用)でコードを適用すると、いくつかの異なる動作に気付きました。

このフィドルexampleでは、一連のイベントはChromeでうまく動作しますが、Firefoxで同じイベントを試すと、プログラムによる.trigger('click')はイベントリスナーをトリガーしません。どうして?私はそれと恐らく$.trigger()の方法と何かをgoogledしましたか?

マイコード:

HTML:(jQueryUIダイアログを使用して)

<input type="checkbox" id="foo"> Clicky! 

<hr> 

<textarea id="bar"></textarea> 

<hr> 

<textarea id="cons"></textarea> 

JS

$("#dialog").dialog({ 
 
    autoOpen: false 
 
}); 
 

 
$("#foo").on('mousedown', function(e) { 
 
    e.preventDefault(); // stop mousedown propagation 
 
    $("#foo").prop('checked', false).prop("disabled", true); // disable checkbox from checking 
 

 
    if (!$("#foo").is(":checked")) { // if not checked, run script 
 

 
    // Open a modal while checkbox event is paused 
 
    $("#dialog").dialog('open').dialog({ 
 
     title: "Hey! Here is a modal", 
 
     modal: 'true', 
 
     buttons: { 
 
     "OK": function() { 
 
      // run a script while modal running during checkbox pause 
 
      $("#bar").val("checkbox paused, script run"); 
 
     
 
         // release checkbox disable & 
 
      // programmatically complete the check 
 
      $("#foo").prop('disabled', false); 
 
      $("#foo")[0].click(); 
 
      // This click event completes and the click listener fires below in Chrome, but not on firefox? Why oh why? 
 
      $("#dialog").dialog('close'); 
 
     
 
     } 
 
     
 
     } 
 
    }); 
 
    } 
 
}); 
 

 

 

 
$("input:checkbox").on("click", function() { 
 
    $("#cons").val("check completed!"); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script> 
 
<input type="checkbox" id="foo"> Clicky! 
 

 
<hr> 
 

 
<textarea id="bar"></textarea> 
 

 
<hr> 
 

 
<textarea id="cons"></textarea> 
 

 
<div id="dialog"> 
 
    A modal opens 
 
</div>

更新: 私は目に私のコードを簡素化裸の要素と私はその動作がfirefoxの後続の.trigger( 'クリック')メソッドを壊すダイアログ(または警告または任意のモーダル)を起動することに特有であることを実証することができます。 simplified example

答えて

1

本当にチェックボックスを無効にする必要がありますか?
モーダルを閉じると、disabledプロパティをfalse(Firefoxの場合)に戻すまでに時間がかかります。チェックボックスが再び有効になるまで待つ必要があります。それ以外の場合、トリガーは無効なチェックボックスで「クリック」し、結果は表示されません。
ルックスニペットで、私はトリガーにタイムアウトを設定して、それが動作します:

$('#bar').on('click', function() { 
 
    $("#foo").prop('disabled', true); 
 
    alert("pause"); // alert, modal, dialog all break trigger event 
 
    $("#foo").prop('disabled', false); 
 
    // wait... 
 
    setTimeout(function() { 
 
    $("#foo").trigger('click') 
 
    }, 100); 
 
}); 
 

 
$("input:checkbox").on("change", function() { 
 
    $("#baz").val("check completed!"); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="checkbox" id="foo"> 
 
<hr> 
 
<button id="bar">Checker</button> 
 
<hr> 
 
<textarea id="baz"></textarea>

しかし、それは別の方法を解決することができます。

+0

すべての催眠術!これはまさに私が探していたものです。ありがとうございます。ユースケースに関しては、それはやや複雑であることは認めていますが、趣味のプログラマとしての私の限界の中では、私にとって最も邪魔な解決策であるようです。私の場合、ユーザーはマウスクリックのメニューを使ってWebアプリケーションとやりとりします。特定の以前の選択に基づいて、チェックボックスのクリックリスナが発生したときの効果を変更する必要があります。これは、クリックシーケンスを終了するにはいくつかのコードを実行することでチェックボックスを一時停止するのです。私は一般的にこれを行うためのより良い方法を知りたいです。 – user1837608

+0

私はあなたに恩恵を与えてくれます。 – user1837608

+0

私は約束を見ることをお勧めします:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise –

関連する問題