和firefox上的jQuery change()

我有一个下拉列表,当它改变时触发ajax调用:

$('.travel-to').change(function(){ $.ajax({ type: "GET", url: "/inc/rates/rates-viewer.php", data: "shtech=y&c_name="+escape($(this).val()), success: function(html){ $(".rates-viewer").html(html); $(".rates-viewer tr.numbers td").css({ opacity: 0 }).fadeTo("slow",1); } }); }); 

我的问题是,在Firefox中,使用上/下光标键循环显示下拉选项,不会触发js onChange()事件。 它在IE中没问题。

如何让Firefox将上/下游标视为onChange ? 我可以做一个/或者在事件上,使onChange或keypress触发同样的事情吗?

谢谢。

你实际上正在利用IE中的一个错误。 Firefox正确支持onChange,因为它不应该在浏览器失去select字段的焦点之前触发。 (事实上​​我昨天回答了一个关于这个问题的问题。)使用onChange选择一个实际上有点危险,特别是因为键盘只有用户才能跳过某些选项。 (最重要的是,鼠标滚轮似乎通过多个答案旋转,但实际上它会在IE上传递的每个条目触发onChange。)

如果你真的想要在有人按下或按下时触发事件,我会挂钩onKeyPress或onKeyDown事件,只要按下“向上”或“向下”键就会触发。

更好的选择是使用.on()将函数绑定为多个事件

 $("#member").on("change keyup", function(){ ----- }); 

也许而不是使用change()事件使用blur()事件并检查值是否更改?

仅供参考,我没有测试过这个,只是我的想法。 我不确定这是否是预期的效果,因为它会引起失去焦点,但我建议它在不同的浏览器中保持效果一致。

 var currentValue; $('.travel-to').blur(function(){ var val = $(this).val(); if (currentValue != val) { currentValue = val; $.ajax({ type: "GET", url: "/inc/rates/rates-viewer.php", data: "shtech=y&c_name="+escape(currentValue), success: function(html){ $(".rates-viewer").html(html); $(".rates-viewer tr.numbers td").css({ opacity: 0 }).fadeTo("slow",1); } }); } }); 

我刚刚在firefox中遇到了一些奇怪的行为,它允许用户打开选择下拉列表,使用箭头导航,然后用户可以点击另一个元素而不是标签或点击另一个元素,这将导致更改选择值而不用射击change事件。

要解决此问题,您可以触发change只要keyup (请同时建议其他事件?)事件被触发并且选择具有与前一个不同的值。

 var selectRegistry = {}, $selects = $('select'); $selects.bind('change', function() { var $this = $(this); selectRegistry[$this.attr('id')] = $this.val(); }); $selects.bind('keyup scroll select', function() { var $this = $(this); if ($this.val()!=selectRegistry[$this.attr('id')]) { $this.trigger('change'); } }); 

如果您在网页运行时沿着dinamically创建了select元素,则可以使用.live()函数。

我使用jquery focusout工作了

http://api.jquery.com/focusout/