Javascript двойное событие стрельбы нежелательных - PullRequest
0 голосов
/ 01 февраля 2011

Я хочу выполнить одно и то же действие для двух разных событий. У меня проблема в том, что одно событие увольняет другое. Я использую javascript и Mootools, также события устанавливаются для элемента input, который находится внутри ячейки td.

Я хочу запустить действие «сохранить», когда элемент теряет фокус (onBlur), а также когда пользователь нажимает клавишу «Enter» (onKeypressed). Проблема заключается в том, что действие «save» запускает само событие «onBlur». Поэтому, когда я нажимаю «Ввод», действие сохранения выполняется 2 раза, и это создает нежелательное поведение из сценария.

Вот функция «сохранить» («this» обозначает входной элемент)

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

Так что, если у вас есть идеи, спасибо!

Ответы [ 3 ]

0 голосов
/ 01 февраля 2011

я знаю, это явно чрезмерно сконструировано, но я стараюсь иметь только один обработчик событий, а затем использовать другой для вызова первого.

например: 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, он не будет размытым, а затем после размытия он запустится снова.

0 голосов
/ 11 марта 2011

На самом деле я обнаружил, что срабатывание событий нажатия клавиш имеет много разного поведения в зависимости от браузера!В то время, когда я работал с Chrome, уловка «событие размытия при нажатии клавиши ввода» не работала, но с Opera она работала просто отлично.

Поэтому я, наконец, решил использовать специальный менеджер событий нажатия клавиш Mootools, ион отлично работал с любым браузером (включая событие «Tab»!).Надеюсь, это поможет!

0 голосов
/ 01 февраля 2011

Вы всегда можете использовать мьютекс для блокировки второго обработчика событий.

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);
...