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:try
onclick
而不是
onclick
?谢谢你的回复Josh。onclick表现出同样的行为。btn.onclick=sdefaults;然后我建议使用jQuery或Prototype之类的框架。我知道在原型中使用
$(btn)很容易做到这一点--我已经好几年没有实际使用过
btn.onclick
。谢谢你的帮助Josh。因为这是一个油腻的脚本,我认为我不能使用原型。谢谢你的提示,我尝试过了,它会阻止函数在页面加载时运行,但是单击按钮仍然不起任何作用。@cd:try
onclick
而不是
onclick
?谢谢你的回复Josh。onclick表现出同样的行为。btn.onclick=sdefaults;然后我建议使用jQuery或Prototype之类的框架。我知道在原型中使用
$(btn)很容易做到这一点--我已经好几年没有实际使用过
btn.onclick
。谢谢你的帮助Josh。因为这是一个油腻的脚本,我认为我不能使用原型。干杯