我如何以编程方式从锚标记中调用onclick()事件,同时在onclick函数中保留“this”引用?
有没有可能以编程方式调用一个锚标记的onClick事件,同时保持对锚的“this”引用?
以下不起作用…(至less不在Firefox中:document.getElementById('linkid')。click()不是函数)
<script type="text/javascript"> function doOnClick() { document.getElementById('linkid').click(); //Should alert('/testlocation'); } </script> <a id="linkid" href="/testlocation" onclick="alert(this.href);">Testlink</a>
您需要在该元素的上下文中apply
事件处理程序:
var elem = document.getElementById("linkid"); if (typeof elem.onclick == "function") { elem.onclick.apply(elem); }
否则, this
将引用上面的代码执行的上下文。
jQuery有一个非常简单的解决scheme,我只是使用它,它工作得很好:
<script type="text/javascript"> function doOnClick() { $('#linkid').click(); } </script> <a id="linkid" href="/testlocation" onclick="alert(this.href);">Testlink</a>
testingIE8-10,Chrome,Firefox。
要触发一个事件,你基本上只是调用该元素的事件处理程序。 从你的代码稍微改变。
var a = document.getElementById("element"); var evnt = a["onclick"]; if (typeof(evnt) == "function") { evnt.call(a); }
$("#linkid").trigger("click");
看看handleEvent方法
https://developer.mozilla.org/en-US/docs/Web/API/EventListener
“原始的”Javascript:
function MyObj() { this.abc = "ABC"; } MyObj.prototype.handleEvent = function(e) { console.log("caught event: "+e.type); console.log(this.abc); } var myObj = new MyObj(); document.querySelector("#myElement").addEventListener('click', myObj);
现在点击你的元素(id为“myElement”),它应该在控制台中输出以下内容:
抓到事件:点击
ABC
这使您可以将对象方法作为事件处理程序,并可以访问该方法中的所有对象属性。
你不能直接将一个对象的方法直接传递给addEventListener(如: element.addEventListener('click',myObj.myMethod);
)并期望myMethod
的行为就像我通常在对象上调用一样。 我猜测传递给addEventListener的任何函数都被复制,而不是被引用。 例如,如果将事件侦听器函数引用传递给addEventListener(以variables的forms),则取消设置此引用,事件侦听器在捕获事件时仍然执行。
另一个(较不优雅的)解决方法是传递一个方法作为事件监听器,并且仍然可以访问事件监听器中的对象属性,如下所示:
// see above for definition of MyObj var myObj = new MyObj(); document.querySelector("#myElement").addEventListener('click', myObj.handleEvent.bind(myObj));
如果你使用纯粹的onclick属性来引用函数,这看起来是一个非常糟糕的主意。 内联事件通常是一个糟糕的主意。
我会build议如下:
function addEvent(elm, evType, fn, useCapture) { if (elm.addEventListener) { elm.addEventListener(evType, fn, useCapture); return true; } else if (elm.attachEvent) { var r = elm.attachEvent('on' + evType, fn); return r; } else { elm['on' + evType] = fn; } } handler = function(){ showHref(el); } showHref = function(el) { alert(el.href); } var el = document.getElementById('linkid'); addEvent(el, 'click', handler);
如果你想从其他的JavaScript代码调用相同的函数,模拟一个点击调用函数不是最好的方法。 考虑:
function doOnClick() { showHref(document.getElementById('linkid')); }
一般来说,我会build议不要手动调用事件处理程序。
- 目前还不清楚由于多个注册监听者的执行情况
- 进入recursion和无限事件循环的危险(点击触发点击B,触发点击A等)
- DOM的冗余更新
- 很难区分由用户引起的视图的实际变化与作为初始化代码的变化(应该只运行一次)。
最好是找出你想要发生的事情,把它放在一个函数中,然后手动调用,并把它注册为事件监听器。
这里是一个使用javascript设置所有儿童定位标签onclick事件的例子。
http://urenjoy.blogspot.com/2009/07/set-divs-all-anchor-tags-onclick-event.html
希望,它有帮助。