我如何以编程方式从锚标记中调用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

希望,它有帮助。