Javascript';s object.onClick运行函数而不是设置onClick,如何防止这种情况发生并仅执行onClick函数?
我有以下代码:Javascript';s object.onClick运行函数而不是设置onClick,如何防止这种情况发生并仅执行onClick函数?,javascript,greasemonkey,setattribute,Javascript,Greasemonkey,Setattribute,我有以下代码: function sdefaults() { alert("test"); } var btnpos, sbtn; btnpos = document.getElementsByName('somePosition')[0]; sbtn = document.createElement('input'); btnpos.parentNode.insertBefore(sbtn, btnpos.nextSibling); sbtn.type = "button"; sbtn
function sdefaults()
{
alert("test");
}
var btnpos, sbtn;
btnpos = document.getElementsByName('somePosition')[0];
sbtn = document.createElement('input');
btnpos.parentNode.insertBefore(sbtn, btnpos.nextSibling);
sbtn.type = "button";
sbtn.name = "social";
sbtn.value = "Defaults";
sbtn.onClick = sdefaults();
按钮显示在我希望的位置,并且名称/值设置正确。但是,当我加载页面时,会运行sdefaults()
函数,如果我单击该按钮,则不会发生任何事情。有人能提供一些关于如何防止函数在加载时运行并强制它只运行onclick的见解吗
感谢更改:
sbtn.onClick = sdefaults();
致:
sbtn.onClick=sdefaults()
表示:“运行sdefaults
功能并将结果存储在sbtn.onClick
中
btn.onClick=sdefaults;
的意思是:“将sbtn.onClick
设置为功能sdefaults
”,这就是您要查找的功能。更改:
sbtn.onClick = sdefaults();
致:
sbtn.onClick=sdefaults();
表示:“运行sdefaults
函数并将结果存储在sbtn.onClick
中
btn.onClick=sdefaults
的意思是:“将sbtn.onClick
设置为函数sdefaults
”,这正是您所要查找的。您必须理解函数引用和函数调用之间的区别
考虑以下函数
function foo()
{
alert( 'Hello World' );
}
现在,让我们看一些引用此函数的示例。为了引用函数,我们使用它的符号名,就像其他变量一样
// Alert contents of foo
alert( foo );
// Set foo as the click handler for the body
document.body.onclick = foo;
// Assign a new function to foo
foo = function(){ alert( 'Goodbye!' ); }
现在我们将考虑函数调用。这意味着函数将执行并将其返回值发送回调用范围
// Invoke foo simply
foo();
// Invoke foo with a specific scope
foo.apply( this ); // or foo.call( this );
现在,完全可以通过更改sdefaults()
的代码来修改代码段。下面是它的样子
function sdefaults()
{
return function()
{
alert("test");
}
}
现在,当您执行sbtn.onClick=sdefaults()时
所发生的是onClick
属性接收它所期望的函数,因为我们已经修改了sdefaults,使其实际上不向“test”发出警报,而是返回一个匿名函数,该函数本身将向“test”发出警报。(作为旁注,此特定技术通常称为lambda或委托函数)
希望这能澄清问题。您必须理解函数引用和函数调用之间的区别 考虑以下函数
function foo()
{
alert( 'Hello World' );
}
现在,让我们看一些引用此函数的示例。为了引用函数,我们使用它的符号名,就像其他变量一样
// Alert contents of foo
alert( foo );
// Set foo as the click handler for the body
document.body.onclick = foo;
// Assign a new function to foo
foo = function(){ alert( 'Goodbye!' ); }
现在我们将考虑函数调用。这意味着函数将执行并将其返回值发送回调用范围
// Invoke foo simply
foo();
// Invoke foo with a specific scope
foo.apply( this ); // or foo.call( this );
现在,完全可以通过更改sdefaults()
的代码来修改代码段。下面是它的样子
function sdefaults()
{
return function()
{
alert("test");
}
}
现在,当您执行sbtn.onClick=sdefaults()时
所发生的是onClick
属性接收它所期望的函数,因为我们已经修改了sdefaults,使其实际上不向“test”发出警报,而是返回一个匿名函数,该函数本身将向“test”发出警报。(作为旁注,此特定技术通常称为lambda或委托函数)
希望这能把事情弄清楚。@Daniel Vandersluis:谢谢你清理了他的帖子。丹尼尔·范德斯路易斯:谢谢你清理了他的帖子。如果可以的话我会的这是一个很好的解释。。。除非你从未告诉他把代码改成
btn.onClick=sdefaults代码>最终解决了他的问题。。。相反,你告诉他如何制作btn.onClick=sdefaults()代码>工作,这在我看来有点倒退…嗯,我觉得我不需要这么做,因为你的答案已经做到了。很公平。你的回答比我的要深刻得多。明天我给你+1,我今天的投票限制是:-)这是一个很好的解释。。。除非你从未告诉他把代码改成btn.onClick=sdefaults代码>最终解决了他的问题。。。相反,你告诉他如何制作btn.onClick=sdefaults()代码>工作,这在我看来有点倒退…嗯,我觉得我不需要这么做,因为你的答案已经做到了。很公平。你的回答比我的要深刻得多。明天我给你+1,我今天的投票限制是:-)谢谢你的提示,我尝试了一下,它会阻止函数在页面加载时运行,但是单击按钮仍然没有任何作用。@cd:tryonclick
而不是onclick
?谢谢你的回复Josh。onclick表现出同样的行为。btn.onclick=sdefaults;然后我建议使用jQuery或Prototype之类的框架。我知道在原型中使用$(btn)很容易做到这一点代码>--我已经好几年没有实际使用过btn.onclick
。谢谢你的帮助Josh。因为这是一个油腻的脚本,我认为我不能使用原型。谢谢你的提示,我尝试过了,它会阻止函数在页面加载时运行,但是单击按钮仍然不起任何作用。@cd:tryonclick
而不是onclick
?谢谢你的回复Josh。onclick表现出同样的行为。btn.onclick=sdefaults;然后我建议使用jQuery或Prototype之类的框架。我知道在原型中使用$(btn)很容易做到这一点代码>--我已经好几年没有实际使用过btn.onclick
。谢谢你的帮助Josh。因为这是一个油腻的脚本,我认为我不能使用原型。干杯