我有一个附有监听器的链接(我正在使用 YUI):
YAHOO.util.Event.on(Element, 'click', function(){ /* some functionality */});
我希望在不涉及用户点击的另一个场景中发生相同的功能。理想情况下,我可以模拟元素上的“点击”并自动触发该功能。我怎么能这样做?太糟糕了,这不起作用:
$('Element').click()
谢谢。
我有一个附有监听器的链接(我正在使用 YUI):
YAHOO.util.Event.on(Element, 'click', function(){ /* some functionality */});
我希望在不涉及用户点击的另一个场景中发生相同的功能。理想情况下,我可以模拟元素上的“点击”并自动触发该功能。我怎么能这样做?太糟糕了,这不起作用:
$('Element').click()
谢谢。
MDC 有一个使用 dispatchEvent模拟点击事件的好例子。
下面是一些模拟单击元素的代码,该元素还检查是否取消了事件:
function simulateClick(elm) {
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window,
0, 0, 0, 0, 0, false, false, false, false, 0, null);
var canceled = !elm.dispatchEvent(evt);
if(canceled) {
// A handler called preventDefault
// uh-oh, did some XSS hack your site?
} else {
// None of the handlers called preventDefault
// do stuff
}
}
您正在寻找fireEvent (IE) 和dispatchEvent (其他)。
对于 YUI 3,这一切都很好地包含在Y.Event.simulate()
:
YUI().use("node", function(Y) {
Y.Event.simulate(document.body, "click", { shiftKey: true })
})
您可以单独声明您的函数。
function DoThisOnClick () {
}
然后像现在一样将其分配给 onclick 事件,例如:
YAHOO.util.Event.on(Element, 'click', DoThisOnClick)
你可以随时调用它:-)
DoThisOnClick ()
如果有人遇到这种情况,正在寻找一种与框架无关的方式来触发任何 HTML 和鼠标事件,请看这里:如何使用 JavaScript 模拟鼠标点击?
1) 第一个解决方案
文章http://mattsnider.com/simulating-events-using-yui/描述了如何使用 YAHOO 模拟点击:
var simulateClickEvent = function(elem) {
var node = YAHOO.util.Dom.get(elem);
while (node && window !== node) {
var listeners = YAHOO.util.Event.getListeners(node, 'click');
if (listeners && listeners.length) {
listeners.batch(function(o) {
o.fn.call(o.adjust ? o.scope : this, {target: node}, o.obj);
});
}
node = node.parentNode;
}
};
如您所见,该函数循环遍历节点及其父节点,并为每个节点获取侦听器列表并调用它们。
2)第二个解决方案
还有另一种方法可以做到这一点。例如:
var elem = YAHOO.util.Dom.get("id-of-the-element");
elem.fireEvent("click", {});
其中函数用作
3) 第三种解决方案
YUI2 2.9 版本有更好的解决方案:http: //yui.github.io/yui2/docs/yui_2.9.0_full/docs/YAHOO.util.UserAction.html
4)第四解决方案
YUI3 还有一个更好更干净的解决方案:http: //yuilibrary.com/yui/docs/event/simulate.html
当然 $('Element').click() 不起作用,但如果你包含 jquery,它可以与 yui 一起工作。
由于我未测试,您需要执行以下操作:
function myfunc(){
//functionality
}
YAHOO.util.Event.on(Element, 'click', myfunc);
然后在需要发生其他事情时调用 myfunc 。
无法模拟用户对任意元素的点击是故意的,原因很明显。