0

几个小时以来我一直在寻找可能的线索,结果一无所获,所以我以你的大智慧向你求助……

所以我有一个表单,在那个表单中有一个我称之为选择工具的字段,它由两部分组成,一个显示友好标签的字段,一个用于存储所选 ID 的隐藏字段。它看起来像这样:

<input type="hidden" name="selector" id="selector" value="" />
<input type="text" readonly="readonly" id="selector_label" value="" />
<a.... link to selection tool .... />

选择工具实际上在 iframe 中打开,这很重要,但不要担心,没有 XSS 错误。用户单击工具中的记录后,该远程页面将调用以下命令:

$('#selector_label',window.parent.document).val(label);
$('#selector',window.parent.document).val(selected).change();
...script to close iframe...

如您所见,它直接更新表单,第二个更新隐藏部分值的语句通过调用.change()完成以触发任何侦听器。最后它关闭了自己。

为了使这更复杂,有一个分配给该字段的侦听器,如下所示:

$('#selector').on('blur change', function() {
    ... script to update a related field ...
});

请注意,blur这实际上是一个动态脚本,并且.each()出于不同的原因分配给了许多字段。我把它包括在内,以防你告诉我它会以某种方式干扰。

所以选择器工具很好用,更新标签和隐藏字段,但是我动态分配的监听器没有触发,所以相关字段没有得到新更改的值#selector字段的值。

任何想法为什么我的听众不会检测到以编程方式触发的.change()事件?谢谢你尽你所能的帮助!

- - - 编辑 - - -

根据评论中的建议更新以使用.on()而不是.bind(),不幸的是没有变化。

仅供参考,我知道这适用于其他领域,因为还有其他人以相同的形式使用这个“相对”事件来更新并且它们工作正常。重要的区别和可能的原因是它们使用可见和可编辑的文本字段而不是隐藏字段

----- 编辑 2 -----

出于测试目的,我将隐藏字段更改为可见字段,仍然是只读的,最初它没有效果,选择器仍然有效,但分配的事件没有。然而,一个有趣的怪癖是,如果我单击该(以前隐藏的)字段,然后再次在其他地方触发blur事件状态,则分配的事件侦听器会触发并更新相关事件。那么为什么事件仅在我与字段交互时才触发,而不是在我以编程方式告诉它触发.change()事件时触发?

4

1 回答 1

0

正如我在评论中提出的那样,也许您的解决方案是使用 .on() 而不是 .bind() 来附加事件。来自 jQuery 网站:

.on() 方法将事件处理程序附加到 jQuery 对象中当前选定的元素集。从 jQuery 1.7 开始,.on() 方法提供了附加事件处理程序所需的所有功能。有关从旧 jQuery 事件方法转换的帮助,请参阅 .bind()、.delegate() 和 .live()。要删除与 .on() 绑定的事件,请参阅 .off()。要附加仅运行一次然后自行删除的事件,请参阅 .one()

于 2013-04-25T15:41:24.007 回答