jquery 在代码中对SELECT控件的值所做的更改是否应触发onChange事件?

weylhg0b  于 2022-12-12  发布在  jQuery
关注(0)|答案(2)|浏览(203)

我使用下面的代码来监视给定SELECT元素的更改。

someSelectElement.change(function () { alert('change made'); });

当我通过UI更改选定项的值时,它工作得很好。
但是,如果通过脚本更改值,它似乎不会触发事件。例如,在调试控制台中执行的以下代码更改了选定项,但不会触发事件

$('#someSelectElement').val('NewValue')

我知道需要检测其他代码对控件所做的更改似乎很不寻常,如果是我的代码,我会手动触发事件,然后收工。问题是,我正在编写一个jQuery插件,当被监视控件的值发生更改时,无论是通过用户干预还是通过插件用户正在运行的客户端脚本,该插件都需要做一些事情。
我假设在这种情况下不触发事件的行为是设计好的。如果不是,请说出来,让我知道我做错了什么。如果是这样,有没有一个解决办法,让我可以监视对SELECT元素的值所做的更改,而不管这些更改是由用户还是代码启动的?

mwkjh3gx

mwkjh3gx1#

代码驱动的元素值更改不会触发原生事件,您可以自己触发它们,当然,可以通过jQuery“.trigger()”方法。
Mozilla浏览器长期以来一直有一个“观察”功能,但其他平台不支持。

nkhmeac6

nkhmeac62#

好的-所以我 * 可能 * 有一个比间隔计时器解决方案更好的解决方案。
还要注意,这是一个大得多的黑客攻击,下面只是简单的概念证明,绝不是生产准备:

$(document).ready(function(){
    function change(){
        $('#test option[value=3]').attr('selected', 'selected');
    }

    // run it before changing it
    alert('first go');
    change();

    var tmp = String(change).replace(/function change\(\){/, '');
    tmp = tmp.replace('}', '');
    tmp += 'alert(\'it changed\');';

    change = function() { eval(tmp); };

    // try it again - should get the second alert this time
    alert('second go (post mod)');
    change();
});

See the sample here.
本质上,我在做的是:
1.将函数转换为字符串
1.替换边界函数构造
1.添加我想注入的任何功能
1.将修改后的函数重新分配给原始函数
看起来可以,但在真实的世界中可能不行:)

相关问题