5

我用于更改选择菜单的 Prototype 事件侦听器未在 IE 中触发。

Event.observe('use_billing', 'change', Checkout.getBillingData);

这在 Firefox 中运行良好(当然),但在 IE 中没有任何反应(当然)——我已经在谷歌上搜索了一段时间,但我还没有找到合适的解决方案来解决这个问题。我读到有问题,但我发现没有任何有用的东西可以规避这个问题并让它发挥作用。

我真的很想避免使用内联事件触发器,因为它们很突兀,并且会使文档变得混乱,容易出错:

<select id='use_billing' onchange="Checkout.getBillingData();">....</select>

任何想法都会很棒——这是阻止这个项目从测试版到生产的唯一原因。

4

3 回答 3

3

这是 IE 的常见问题。change在元素失去焦点之前 它不会触发事件。

要验证这确实是您的问题的原因,请尝试更改菜单,然后按 Tab 将焦点移动到另一个元素。如果您的回调正确触发,您就会知道没有其他问题。

我之前也通过侦听其他事件(如clickor )解决了这个问题keydown。您可以在回调中添加一个检查,以确保该值实际上与以前不同,以确保您处理事件的次数不会超过必要的次数(因为如果其他浏览器click单击change新的价值)。

于 2010-03-01T07:12:51.583 回答
2

我找到了原因 - 这不是焦点问题,事实证明我的表单元素的名称和 id 值相同 - 我更改了 id 值并且一切正常。

于 2010-03-01T17:38:56.367 回答
2

我知道这是一个古老的话题,但我想分享上述问题的替代答案。在我的代码中,元素的名称和 id 是相同的,但这并不重要。

在被触发的函数中,事件参数是从原型传入的。要在 Firefox 中获取文本框(引发事件)的值,请使用eventArg.currentTarget.value

但在 IE 中你必须使用eventArg.srcElement.value

因此,为了使其在两种浏览器中都能正常工作,您必须使用...

var value = "";
var id = "";
if(eventArg.currentTarget){//FireFox
value = eventArg.currentTarget.value;
id = eventArg.currentTarget.id;
}
else{//IE
value = eventArg.srcElement.value;
id = eventArg.srcElement.id;
}

于 2011-06-24T15:11:28.570 回答