1

編集:blockUI();これは、Firebug を使用してメッセージをログに記録したことが原因であると誤って想定しましたconsole.logが、ここの例では、複製するために firebug が必要ないようにアラートに変更しました。もう一度テストするblockUIと、削除でき、onclick発火しませんでした。この問題は、DOM が変更されたり、フィードバックが与えられて DOM が起動しなくなったりするたびに発生するようonclickです。

jQuery blockUI プラグインに問題があり、関連のない 2 つのイベントを発生させています (私がそれを失っていない限り)。

基本的に、onchangeイベントがバインドされたテキストボックスがあります。このイベントは、UI をブロックし、ajax 呼び出しを実行し、成功すると UI のブロックを解除します。ajax はテキストをメモリに保存しています。もう 1 つのコントロールは、UI をブロックする on イベントを持つボタンでonclickあり、メモリ内の内容をデータベースに保存する ajax 要求を起動し、成功すると UI のブロックを解除します。

これらは両方とも別々に正常に動作します。onchangeボタンをクリックしてトリガーすると、問題が発生します。次に、 のみonchangeが起動され、onclickは無視されます。

チェックボックスのテキストを変更し、リンクをクリックすると、IFjQuery.blockUI()が存在する (またはアラート)onchangeだけが発生し、保存が呼び出されることはありません。blockUI(またはアラート)を削除すると、両方の関数が呼び出されます。

問題を確認できる完全に機能する例を次に示します。ajaxの遅延をシミュレートしようとしたときにそこにあることに注意してくださいsetTimeoutが、それがなくても問題が発生しています。

複製するには、テキスト ボックスに何かを入力し、[保存] をクリックします。両方のイベントが発生するはずですが、onchangeトリガーされるのは のみです。

<html>
<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script src="http://github.com/malsup/blockui/raw/master/jquery.blockUI.js?v2.31"></script>
    <script>
        function doSomething(){
            //$.blockUI();
            alert("doing something");
            //setTimeout(function(){
                //$.unblockUI();
            //},500);
        }

        function save(){
            //$.blockUI();
            console.log("saving");
            //setTimeout(function(){
            //$.unblockUI();
            //}, 1000);
        }
    
    </script>
</head>

<body>
    <input id="textbox" type="text" onchange="doSomething();">
    <a id="link" href="#"onclick="save()">save</a>
</body>
</html>
4

2 に答える 2

0

次は、リンクに onfocus を使用して「修正」し、イベントがトリガーされます。onclick ではそうではありません。

この作品:

<html>
<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script src="http://github.com/malsup/blockui/raw/master/jquery.blockUI.js?v2.31"></script>
    <script>
        function doSomething(){
            alert("blocking UI");
            console.log("do something");
            //alert("doing something");
            //setTimeout(function(){
                //$.unblockUI();
            //},500);
        }

        function save(){
            //$.blockUI();
            console.log("saving");
            //setTimeout(function(){
            //$.unblockUI();
            //}, 1000);
        }

        function cachebtn()
        {
            console.log("cache bouton");
        }
    </script>
</head>

<body>
    <input id="textbox1" type="text" onchange="doSomething();">
    <input id="textbox2" type="text" onchange="doSomething();">
    <a id="link" href="#" onfocus="save()">save</a>
</body>
</html>

これはそうではありません。唯一の違いは、onchange が先行するときに起動しない onclick です。

<html>
<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script src="http://github.com/malsup/blockui/raw/master/jquery.blockUI.js?v2.31"></script>
    <script>
        function doSomething(){
            alert("blocking UI");
            console.log("do something");
            //alert("doing something");
            //setTimeout(function(){
                //$.unblockUI();
            //},500);
        }

        function save(){
            //$.blockUI();
            console.log("saving");
            //setTimeout(function(){
            //$.unblockUI();
            //}, 1000);
        }

        function cachebtn()
        {
            console.log("cache bouton");
        }
    </script>
</head>

<body>
    <input id="textbox1" type="text" onchange="doSomething();">
    <input id="textbox2" type="text" onchange="doSomething();">
    <a id="link" href="#" onclick="save()">save</a>
</body>
</html>
于 2010-05-06T19:51:33.677 に答える
0

単一ページの環境では、常に 1 つのイベント ループしか発生しません。ajax 呼び出しが同期的である場合、1 つのイベントが処理されている間は、それがすべてです。ブラウザーが別のイベント ループをトリガーした場合、それはシングル スレッドではありません。しかし、そうではありません。

于 2010-05-06T19:18:34.603 に答える