Magento 1.9修改输入框数量后无法触发总价更新求助
解决Magento 1.9中jQuery修改数量框后无法触发Prototype绑定的change事件问题
这个问题的核心在于Prototype.js和jQuery的事件系统是相互独立的——你用jQuery的trigger("change")触发的是jQuery自己的事件队列,而Prototype通过observe绑定的事件监听的是原生DOM事件或者Prototype自身的事件体系,所以两者不互通。
给你几个可行的解决方案:
方案1:触发原生DOM change事件
直接触发输入框的原生change事件,这样Prototype的监听器就能捕获到:
// 先设置数量值 jQuery("input.qty").val("10"); // 触发原生change事件(适用于现代浏览器) jQuery("input.qty").each(function() { this.dispatchEvent(new Event('change')); });
如果需要兼容IE等老浏览器,可以用更兼容的事件创建方式:
jQuery("input.qty").val("10"); jQuery("input.qty").each(function() { var event = document.createEvent('Event'); event.initEvent('change', true, true); this.dispatchEvent(event); });
方案2:用Prototype的方法触发事件
既然页面里已经加载了Prototype,直接用它的API来触发事件会更稳妥:
// 用jQuery设置值(或者也可以用Prototype的方式设置) jQuery("input.qty").val("10"); // 用Prototype选择器找到元素并触发change事件 $$('input.qty').each(function(el) { el.fire('change'); });
Prototype的fire方法会直接触发它自己通过observe绑定的事件监听器,完全不会有兼容性问题。
方案3:直接调用价格更新函数
如果updateGroupedPrice函数在全局作用域能访问到(虽然你的代码里它是在自执行函数内部,但有些Magento主题会把它暴露出来),你可以直接调用它跳过事件触发的步骤:
jQuery("input.qty").val("10"); updateGroupedPrice();
不过这个方法的前提是该函数能被外部访问,如果它被封装在闭包里,这个方法就不适用了。
为什么你的原代码无效?
Prototype的observe方法在现代浏览器中是基于原生DOM事件实现的,但jQuery的trigger方法只会触发jQuery自己绑定的事件处理器,不会触发原生事件(除非你用特定方式手动触发)。所以你之前的jQuery("input.qty").trigger("change")只会触发jQuery绑定的change事件,对Prototype的监听器完全无效。
内容的提问来源于stack exchange,提问作者Guerrilla
相关产品推荐
相关产品推荐

