Javascript JS原型中的观察者事件-同时发生两个事件

Javascript JS原型中的观察者事件-同时发生两个事件,javascript,events,prototypejs,observer-pattern,Javascript,Events,Prototypejs,Observer Pattern,我有一个输入框,它接受一个在函数opConfig.reloadPrice()中得到验证的数字。我将两个观察者设置为一个相同的元素,在“更改”上,当我在框外单击或使用选项卡(如果已进行更改)时,它将执行代码。在“按键”上,它检查返回键是否被按下,然后执行代码,它还触发“更改”观察者!!因此,在本例中,函数opConfig.reloadPrice()执行了两次(最后我得到了两个相同的警报框)。 我现在拥有的代码: <input type="text" value="" name="option

我有一个输入框,它接受一个在函数opConfig.reloadPrice()中得到验证的数字。我将两个观察者设置为一个相同的元素,在“更改”上,当我在框外单击或使用选项卡(如果已进行更改)时,它将执行代码。在“按键”上,它检查返回键是否被按下,然后执行代码它还触发“更改”观察者!!因此,在本例中,函数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(); 
});
干杯,

jazkat

将输入字段的当前值保存在上限变量(上限值)中

如果某个事件中的值发生更改,则触发处理程序并更新upvalue:

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中的内联侦听器(并且永不再添加它们):



.

将输入字段的当前值保存在上限变量(上限值)中

如果某个事件中的值发生更改,则触发处理程序并更新upvalue:

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中的内联侦听器(并且永不再添加它们):



.

感谢katspaugh如此快速的响应,但是当做出更改并按下返回键时,它仍然执行两次:更改+选项卡=确定,更改+单击退出=确定,更改+输入=执行两次(不确定)我将其调整为一个工作示例,但是你应该理解这个想法:在每个处理程序中检查/更新一个共享变量。是的,我很感激,但它仍然给了我一个我正试图摆脱的问题——当值被更改并且返回键被单击时,函数被执行两次(从而给我两个弹出窗口)。我想不出任何好的办法来防止这种情况…:-/奇怪。你用什么浏览器登记?在Chrome中,它在我的演示()中只发出一次警报。我使用的是Firefox 3.6和FF 5.0-结果相同。感谢katspaugh的快速响应,但是当做出更改并按下返回键时,它仍然执行两次:change+tab=OK,change+click out=OK,change+enter=执行两次(不确定)。我将它调整为一个工作示例,但是你应该理解这个想法:在每个处理程序中检查/更新一个共享变量。是的,我很感激,但它仍然给了我一个我正试图摆脱的问题——当值被更改并且返回键被单击时,函数被执行两次(从而给我两个弹出窗口)。我想不出任何好的办法来防止这种情况…:-/奇怪。你用什么浏览器登记?在Chrome中,它在我的演示()中只发出一次警报。我使用的是Firefox 3.6和FF 5.0,结果相同。
<input type="text" name="options[1]" id="options_1" />