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()。

更新

演示

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 会为新窗口调用“激活”。添加“超时”以输入正确的时间范围。在第一次警报发生之前将警报设为条件并更改相关变量可防止警报循环.

例子:

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 回答