程序化调用jquery .change()不触发附加绑定更改隐藏字段的事件

时间:2013-04-25 15:36:20

标签: jquery forms events triggers

我一直在寻找可能的线索并且已经空白,所以我用你的智慧转向你,伸出援助之手......

所以我有一个表单,在该表单中有一个字段,我称之为选择工具,由两部分组成,一个字段用于显示友好标签,一个隐藏字段用于存储所选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 -----

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

1 个答案:

答案 0 :(得分:0)

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

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