32

我正在尝试使用 javascript 设置 onclick 事件。以下代码有效:

var link = document.createElement('a');
link.setAttribute('href', "#");
link.setAttribute('onclick', "alert('click')");

然后我使用 appendChild 将链接添加到文档的其余部分。

但我显然想要一个比警报更复杂的回调,所以我尝试了这个:

link.onclick = function() {alert('clicked');};

和这个:

link.onclick = (function() {alert('clicked');});

但这无济于事。当我单击链接时,没有任何反应。我已经使用 chrome 进行了测试,并且浏览 DOM 对象显示该元素的 onclick 属性为 NULL。

为什么我不能将函数传递给 onclick?

编辑:

我尝试使用下面建议的 addEventListener 并获得相同的结果。链接的 DOM 将 onclick 显示为 null。

我的问题可能是该元素的 DOM 可能尚未完全构建。此时页面已经加载完毕,用户点击了一个按钮。该按钮执行构建一个新 div 的 javascript,它通过调用 document.body.appendChild 将其附加到页面。此链接是新 div 的成员。如果这是我的问题,我该如何解决?

4

5 回答 5

29

我一直无法重现该问题。与 OP 的发现相反,以下行在最新版本的 IE、FF、Opera、Chrome 和 Safari 上运行良好。

link.onclick = function() {alert('clicked');};

您可以访问此 jsFiddle 在您自己的浏览器上进行测试:

http://jsfiddle.net/6MjgB/7/

假设我们在 html 页面中有这个:

<div id="x"></div>

以下代码在我尝试过的浏览器上运行良好:

var link = document.createElement('a');
link.appendChild(document.createTextNode("Hi"));
link.setAttribute('href', "#");
link.onclick= function() {link.appendChild(document.createTextNode("Clicked"));}

document.getElementById("x").appendChild(link);

如果存在浏览器兼容性问题,使用 jQuery 应该可以解决它并使代码更加简洁:

var $link = $("<a>").html("Hi").attr("href","#").click(function (){$link.html("Clicked")})

$("#x").html($link)

如果简洁不是使用 jQuery 的有力论据,浏览器兼容性应该是……反之亦然:-)

注意:我没有在代码中使用 alert() 因为 jsFiddle 似乎不喜欢它:-(

于 2012-11-30T01:08:52.663 回答
5

addEventListener(...)正如大卫所说,您可以添加一个 DOM 甚至监听器。我已经包含attachEvent了与 IE 的兼容性。

var link = document.createElement('a');
link.setAttribute('href', "#");
if(link.addEventListener){
   link.addEventListener('click', function(){
      alert('clicked');
   });
}else if(link.attachEvent){
   link.attachEvent('onclick', function(){
      alert('clicked');
   });
}
于 2012-11-30T00:22:29.267 回答
5

如果您使用 JavaScript 执行此操作,则使用addEventListener(), withaddEventListener('click', function(e) {...})将事件存储为e. 如果你不传递这样的事件,它将无法访问(尽管 Chrome 看起来足够聪明,可以解决这个问题,但并非所有浏览器都是 Chrome)。

完整的 JSBin 演示。

StackOverflow 演示...

document.getElementById('my-link').addEventListener('click', function(e) {
  console.log('Click happened for: ' + e.target.id);
});
<a href="#" id="my-link">Link</a>

于 2021-02-08T17:58:44.113 回答
2

如果您愿意,可以这样使用:

<button id="myBtn">Try it</button>
<p id="demo"></p>

<script>
document.getElementById("myBtn").onclick=function(){displayDate()};

function displayDate()
{
    document.getElementById("demo").innerHTML=Date();
}
</script>
于 2012-11-30T00:30:33.443 回答
2

设置属性看起来不正确。最简单的方法就是这样:

link.onclick = function() {
    alert('click');
};

但是addEventListener按照 JCOC611 的建议使用更灵活,因为它允许您将多个事件处理程序绑定到同一个元素。请记住,您可能需要回退以attachEvent与旧 Internet Explorer 版本兼容。

于 2012-11-30T00:26:40.953 回答