问题描述
|
我有一个现有的原型代码库,可以对选择框进行更改。
我使用的是jQuery,它会生成(样式化的)无序列表,并且希望将对该列表的点击代理到我的选择框...这一切都很好(在选择框上调用ѭ0but),但是即使在我更改时,原型也无法进行这些更改在选择框上显式调用
change()
。有人知道发生了什么吗?
我可以发布一堆代码,但这都是非常基本的,我认为唯一相关的部分是:
parent_obj.val(selected_idx).change();
这确实会更改我的选择框中的所选项目,但不会触发我的原型事件处理程序。
编辑:
可能会有一个关于使用trigger()等的答案……似乎也不起作用:
parent_obj.val(selected_idx).click().change().trigger(\'click\');
parent_obj.find(\'option value[\' + selected_idx + \']\').click().change().trigger(\'click\');
解决方法
我最终按照该答案的建议使用了Event.simulate原型。
使用原型触发事件
, 所有
trigger
(或change
,这只是trigger(\'change\')
的快捷方式)所做的都是调用绑定的jQuery事件处理程序。从javascript更改值也不会触发处理程序(请考虑可能引起的所有无限循环!)。通常,没有可靠的方法可以从javascript触发事件。您可能应该使用单个框架来进行事件处理。否则,您应该找到与type3ѭ等效的Prototype \,并手动调用它。
, 我通过混合使用jQuery和香草Javascript解决了这个问题
parent_obj.val(selected_idx);
parent_obj.get(0).dispatchEvent(new Event(\'change\'));
, 您可能需要在此处查看ѭ8的用法,然后确保隔离。 http://api.jquery.com/jQuery.noConflict/
参见有关protype事件的文章:使用Prototype触发事件
, 因此,解决方案是使用\“ simulate.js \”,因为您无法触发使用jQuery在原型上注册的事件。
经过几分钟的努力,我意识到,为了使“ simulate.js”在选择选项上起作用,需要首先选择您想要的选项
在我的示例中,我要默认选择最后一个选项
$$(\'select#shipping_method option\').last().selected=true;
$$(\'select#shipping_method option\').last().simulate(\'change\');
问候