1

我有以下代码:

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()功能会运行,然后如果我单击按钮,则不会发生任何事情。谁能提供有关如何防止该功能在加载时运行并强制其仅在单击时运行的任何见解?

谢谢

4

2 回答 2

8

改变:

sbtn.onClick = sdefaults();

至:

sbtn.onClick = sdefaults;

sbtn.onClick = sdefaults();意思是:“运行sdefaults函数并将结果存储在sbtn.onClick.

btn.onClick = sdefaults;意思是:“设置sbtn.onClick为函数sdefaults”,这就是你要找的。

于 2010-03-05T19:43:31.747 回答
3

您必须了解函数引用和函数调用之间的区别。

考虑以下函数

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 以不实际警告“测试”,而是返回一个匿名函数,该函数本身会警告“测试”。 (附带说明,这种特定技术通常称为 lambda 或委托函数)

希望清除它。

于 2010-03-05T20:23:30.767 回答