Javascript双重事件解雇不需要

时间:2011-02-01 05:13:53

标签: javascript events mootools

我想为两个不同的事件发射同样的动作。我遇到的问题是其中一个事件引发了另一个事件。我正在使用javascript和Mootools,事件也设置在'input'元素上,该元素位于td单元格内。

我想在元素失去焦点(onBlur)时以及当用户按下'Enter'键(onKeypressed)时触发动作'保存'。问题来自于“保存”动作引发了“onBlur”事件。因此,当我按下“输入”时,保存操作将执行2次,并从脚本中创建不需要的行为。

这是“保存”功能('this'代表输入元素)

storeUpdt(this); this.getParent().appendText(this.value); this.getParent().addEvent(....); this.destroy();

所以,如果您有任何想法,谢谢!

3 个答案:

答案 0 :(得分:0)

您始终可以使用互斥锁来阻止第二个事件处理程序。

function fireSave(event) {
  if (this._saving) {
    return;
  }
  try {
    this._saving = true;
    // do whatever stuff
  }
  finally {
    this._saving = false;
  }
}

function onKeyPressed(event) {
  // make sure the pressed key is ENTER
  fireSave();
}

var input = document.getElementById('whatever_input_id');
input.addEventHandler('blur', fireSave, false);
input.addEventHandler('keypressed', onKeyPressed, false);

答案 1 :(得分:0)

我知道,这显然是过度设计的,但我倾向于只有1个事件处理程序,然后使用另一个来调用第一个。

例如:http://www.jsfiddle.net/dimitar/VaZGC/

var input = document.id("myinput"), output = document.id("output"), saveValues = function(what) {
    output.set("html", what);
};

input.addEvents({
    blur: function() {
        saveValues(this.get("value"));
    },
    keyup: function(e) {
        if (e.key == "enter") {
            this.blur(); // this will be just fine.
        }
    }
});

你也可以.fireEvent("blur", event)但这里不实用,因为虽然它会调用saveValues,但它不会模糊,然后在模糊时会再次运行它。

答案 2 :(得分:0)

实际上我发现按键事件触发有很多不同的行为,具体取决于浏览器!当时我正在使用Chrome,并且“输入按键按火模糊事件”的技巧不起作用,但是使用Opera它工作得很好。

所以我最终决定使用Mootools特定的按键事件管理器,它适用于任何浏览器(包括'Tab'事件!)。 希望它会有所帮助!