События наблюдателя в JS Prototype - два события одновременно - PullRequest
1 голос
/ 18 августа 2011

У меня есть поле ввода, которое принимает число, которое проверяется в функции opConfig.reloadPrice ().Я установил 2 наблюдателя на один и тот же элемент, при «изменении» он выполняет код, когда я щелкаю вне поля или использую вкладку - если изменение было сделано.При нажатии клавиши он проверяет, была ли нажата клавиша возврата, затем выполняет код И и также вызывает наблюдателя изменения!Так что в этом случае функция opConfig.reloadPrice () выполняется дважды (и я получаю два одинаковых окна с предупреждениями).Код, который у меня сейчас есть:

<input type="text" value="" name="options[1]" id="options_1" onkeypress="return disableEnterKey(event)">

Event.observe($('options_1'), 'change', function(e){ 
   opConfig.reloadPrice(); 
}); 
Event.observe($('options_1'),'keypress', function(e){ 
  if (e.keyCode == Event.KEY_RETURN)  
    opConfig.reloadPrice(); 
});

Я пробовал несколько разных решений (я пробовал 'размытие' события, помещая одного наблюдателя в другого ...)
Я ищуза решение, похожее на это jQuery-Два события одновременно

Спасибо за миллион

РЕДАКТИРОВАНИЕ:
Спасибоto katspaugh Я решил это.Было несколько вещей, которые мне не были понятны, одна из них: событие 'нажатия клавиши' наблюдается до события "изменения", поэтому вы можете устанавливать переменные в одном наблюдателе и проверять их позже в другом(именно поэтому мне потребовалось некоторое время, чтобы понять код katspaughs :-)).

В любом случае, я немного изменяю код, который мне подходит:

var enterPressed = 0;  

Event.observe($('options_1'), 'change', function(){ 
  if (enterPressed !== 1) {    
    opConfig.reloadPrice();  
  }
  enterPressed = 0;
  });

Event.observe($('options_1'), 'keypress', function(e){  
if ((e.keyCode == Event.KEY_RETURN) || (e.keyCode == Event.KEY_TAB)) {
  enterPressed = 1;
  opConfig.reloadPrice();   
}
else 
  enterPressed = 0;  
}); 

Приветствия,
джазкат

1 Ответ

1 голос
/ 18 августа 2011

Сохранить текущее значение поля ввода в переменной верхней области (значение up).

Если значение изменяется в одном из событий, запустить обработчик и обновить значение up:

var oldVal;

$('options_1').observe(
  'change', function () {
      var val = this.value;
      if (oldVal !== val) {
          oldVal = val;
          opConfig.reloadPrice();
      }
  }
).observe(
    'keypress', function(e) { 
        oldVal = this.value;
        if (e.keyCode == Event.KEY_RETURN) {
            opConfig.reloadPrice();
        }
    }
);

Кроме того, вам лучше удалить встроенный прослушиватель в HTML (и никогда добавить их снова):

<input type="text" name="options[1]" id="options_1" />

Демо .

...