如何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
应该是onclick
和new
应该被删除),但我强烈劝阻任何人在他们的代码中直接使用“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>