如何dynamic更改onClick处理程序?

我确信有一百万篇关于这方面的文章,但令人惊讶的是我很难find一些东西。

我有一个简单的脚本,我想为页面初始化时的<A>链接设置onClick处理程序。

当我运行这个,我立即得到一个'富'警报框,我希望只有当我点击链接时得到一个警报。

我做错了什么愚蠢的事情? (我试过点击=和onClick =)…

 <script language="javascript"> function init(){ document.getElementById("foo").click = new function() { alert('foo'); }; } </script> <body onload="init()"> <a id="foo" href=#>Click to run foo</a> </body> 

编辑:我改变了我接受的答案jQuery的答案。 ' MárÖrlygsson '的答案在技术上是我原来的问题的正确答案( click应该是onclicknew应该被删除),但我强烈劝阻任何人在他们的代码中直接使用“document.getElementById(…)改用jQuery 。

jQuery的:

 $('#foo').click(function() { alert('foo'); }); 

或者,如果你不希望它跟随链接href:

 $('#foo').click(function() { alert('foo'); return false; }); 

尝试:

 document.getElementById("foo").onclick = function (){alert('foo');}; 

使用.onclick (全部小写)。 像这样:

 document.getElementById("foo").onclick = function () { alert('foo'); // do your stuff return false; // <-- to suppress the default link behaviour }; 

其实,你可能会发现自己使用一些好的库(我build议jQuery的几个原因)更好的启动和运行,并写入干净的JavaScript。

跨浏览器(in)的兼容性对于任何人来说都是一个正确的select,更不用说刚刚开始的人了。

如果你想传递当前函数的variables,另一种方法是,例如:

 document.getElementById("space1").onclick = new Function("lrgWithInfo('"+myVar+"')"); 

如果你不需要传递这个函数的信息,那只是:

 document.getElementById("space1").onclick = new Function("lrgWithInfo('13')"); 

我有一天或多或less尝试了所有其他的解决scheme,但是在我尝试这个方法之前,他们都没有为我工作:

 var submitButton = document.getElementById('submitButton'); submitButton.setAttribute('onclick', 'alert("hello");'); 

据我所知,它完美的作品。

OMG …这不仅是“jQuery库”和“getElementById”的问题。

当然,jQuery帮助我们把浏览器的问题放在一边,但如果你真的了解JavaScript,那么使用没有库的传统方式仍然可以工作。

@MarrÖrlygsson和@Darryl Hein都给了你很好的select(我会说,他们只是altarnatives而不是awsers),前者使用传统的方式,后者使用后者的jQuery方式。 但是,你真的知道你的问题的答案吗? 你的代码有什么问题?

首先, .click是一种jQuery方式。 如果您想使用传统方式,请改用.onclick。 或者我build议你只专注于学习使用jQuery,以免引起混淆。 jQuery是一个很好的工具,可以在不知道DOM的情况下使用。

第二个问题,也是关键的一个, new function(){}是一个非常糟糕的语法,或者说这是一个错误的语法。

无论你想用jQuery还是不用,都需要澄清一下。

有三种基本的声明函数的方法:

 function name () {code} ... = function() {code} // known as anonymous function or function literal ... = new Function("code") // Function Object 

请注意,JavaScript 区分大小写 ,所以new function()不是JavaScript的标准语法。 浏览器可能会误解其含义。

因此你的代码可以用第二种方式修改

  = function(){alert();} 

或者使用第三种方式

  = new Function("alert();"); 

详细说明,第二种方式与第三种方式几乎一样,第二种方式非常普遍,而第三种方式很less见。 这两个你最好的答案使用第二种方法。

然而,第三种方式可以做一些第二种不能做的事情,因为“运行时”和“编译时间”。 我只希望你知道new Function()有时可能是有用的。 有一天你遇到问题使用function(){} ,不要忘记new Function()

要了解更多,build议阅读O'Reilly的“JavaScript:权威指南,第6版”。

我同意使用jQuery是最好的select。 你也应该避免使用body的onload函数,而使用jQuery的ready函数。 对于事件监听者来说,它们应该是具有一个参数的函数:

 document.getElementById("foo").onclick = function (event){alert('foo');}; 

或在jQuery中:

 $('#foo').click(function(event) { alert('foo'); } 

这里是上面的jQuerypost的YUI对应。

 <script> YAHOO.util.Event.onDOMReady(function() { document.getElementById("foo").onclick = function (){alert('foo');}; }); </script> 

我会在jQuery中试试这个:

$('#foo')。attr(“onclick”,“javascript:alert('foo');”);

我想你想使用jQuery的.bind和.unBind方法。 在我的testing中,使用.click和.onclick更改点击事件实际上称为新分配的事件,导致永无止境的循环。

例如,如果您要在两者之间切换的事件是hide()和unHide(),并且单击一个将单击事件切换到另一个事件,则会以连续循环结束。 更好的方法是做到这一点:

 $(element).unbind().bind( 'click' , function(){ alert('!') } ); 

没有人解决正在发生的实际问题,解释了为什么发出警报。

这个代码: document.getElementById("foo").click = new function() { alert('foo'); }; document.getElementById("foo").click = new function() { alert('foo'); };#foo元素的click属性分配给一个空对象。 这里的匿名函数是为了初始化对象。 我喜欢将这种types的函数看作构造函数。 你把警报放在那里,所以被调用,因为函数被立即调用。

看到这个问题 。

上面的YUI例子应该是:

 <script> YAHOO.util.Event.onDOMReady(function() { Dom.get("foo").onclick = function (){alert('foo');}; }); </script>