2

アラート ボックスでぼかしイベントに反応したい。アイデアは、コンテンツを検証し、値が有効でない場合にフィードバックを提供することです。私はデバッグにアラート ボックスを使用していません。クライアントは、ユーザー フィードバックを提供するためにアラート ボックスを使用することを主張しています。私はここに似たものを持っていました: (しかし、この質問は冗長ではありません!) Focusout イベントループ

したがって、私の現在のソリューションは次のようになります

HTML:

Type some stuff here:
<br>
<input type="text" id="test" />

JavaScript:

var doFocus = function () {
  $("#test").focus();
    console.log("do focus");
};

$("#test").blur(function () {
  console.log("Blur event got triggered.");
  alert("Blur event got triggered.");
  window.setTimeout(function () {
    doFocus();
  }, 1);
});

これは今のところ機能しますが 、問題は、サイトを開いた場合、入力フィールドをクリックしてからウィンドウを変更することです。たとえば、テキスト エディターを開き、元に戻します。Safari がイベント ループに陥る (コールバックが何度も呼び出される)...

4

2 に答える 2

4

この行を削除するだけです:

alert("Blur event got triggered.");

Alert()は、blurイベントのコールバック関数では使用しないでください。

アップデート

デモ

var doFocus = function () {
  $("#test").focus();
    console.log("do focus");
};

var bluring = function(sender){
    $(sender).off('blur');
    console.log("Blur event got triggered.");
    alert("Blur event got triggered.");
    window.setTimeout(function () {
      doFocus();
      $(sender).on('blur',function(){bluring(this)});
    }, 1);
};

$("#test").blur(function(){bluring(this)});
于 2013-01-07T11:53:26.687 に答える
2

アラートを追加することができました.サファリは、まだ古いウィンドウにあるときに新しいウィンドウの「アクティブ化」を呼び出します.適切な時間枠を入力するために「タイムアウト」を追加しました.アラートを条件付きにして、最初のアラートが発生する前に関連する変数を変更すると、アラートループが防止されます.

例:

safari.application.addEventListener("activate", function(){
  //setTimeout prevents boundary complications
  setTimeout(
  function() {
    if (enabled) {
      var tab = safari.application.activeBrowserWindow.activeTab;
      if (curTab != tab) {
        curTab = tab;
        if (selectedTab != tab)
        alert('This is an alert!!');

      }
    }
  }
  ,1000);
},true);
于 2013-05-28T09:14:58.087 に答える