Html选择列表:为什么onchange会被调用两次?

时间:2010-05-22 16:10:31

标签: javascript html asp.net-mvc

我有一个带有选择列表的页面(ASP.NET MVC页面)

选择列表和onchange事件指定如下:

<%=Html.DropDownList("CompanyID", Model.CompanySelectList, "(select company)", new { @class = "data-entry-field", @onchange = "companySelectListChanged()" })%>

companySelectListChanged函数被调用两次?

我正在使用this question中的漂亮代码来获取调用者。

两次调用者都是onchange事件,但是如果我使用以下方式查看调用者调用者:

arguments.callee.caller.caller

第一个调用返回一些系统代码作为调用者(我假设),第二个调用返回undefined。

我正在检查undefined只对onchange做出反应一次,但是这看起来并不理想,会不会再调用两次?

更新

好的,找到了罪魁祸首! ...除了我:-)但是两次调用companySelectListChanged函数的问题仍然存在。

onchange事件直接在select上设置,如上所述。这会调用companySelectListChanged函数。

..注意'data-entry-field'类,现在在一个单独的链接javascript文件中,所有字段上的更改事件与此类绑定到一个更改保存按钮颜色的函数。这意味着onchange上有两个事件,但是publicSelectListChanged被调用两次?

附加绑定设置如下:

$('。data-entry-field')。bind('keypress keyup change',function(e){highLightSaveButtons();});

假设它可能在选择列表上有2个更改事件,它将假设设置按键&amp; keyup事件可能会破坏什么?

有什么想法吗?

另一个更新:

如果我删除了额外的“更改”绑定,那么select元素看起来很好并且一切正常。当添加'change'绑定时,事件触发一次,并且硬连线'onchange'被触发两次。

如果两个事件都是通过jQuery绑定的,那么一切正常,似乎混合使用硬连线onchange和jquery绑定的更改事件是不是可以混合使用?我想这回答了我的问题,但似乎是IE的一个问题,并用jquery绑定这些事件。

2 个答案:

答案 0 :(得分:3)

我同意你的评估。我在http://gutfullofbeer.net/onchange.html更新了我的小例子,除了DOM 0处理程序(带有“onchange”属性的集合)之外,还包括一个jQuery处理程序。它似乎是一个jQuery错误,或者至少是jQuery无法处理IE的怪异。

我记录了jQuery ticket 6593。

答案 1 :(得分:2)

使用IE8时我也遇到过这个问题并进行了一些修改来解决这个问题。

我没有在下拉列表中指定onchange事件,而是使用了jquery.change()事件。

标记:

@Html.DropDownList("drpList", myList, new { @class = "myClass", id = "drpList" })

脚本:

$(function () {
  $('#drpList').change(function () {
  .... your functionality
  });
});

这对我有用..希望这有帮助。