2010-03-05 87 views
1

我有以下代码:Javascript的object.onClick运行函数而不是设置onClick,我怎样才能防止发生,只执行onClick函数?

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的任何见解?

感谢

+0

@Daniel Vandersluis:谢谢你清理他的帖子。如果可能的话,我会。 – Josh 2010-03-05 19:46:42

回答

8

变化:

sbtn.onClick = sdefaults(); 

到:

sbtn.onClick = sdefaults; 

sbtn.onClick = sdefaults();表示:“运行sdefaults功能,并把结果保存在sbtn.onClick

btn.onClick = sdefaults;表示:“将sbtn.onClick设置为功能sdefaults”,这正是您要查找的内容。

+0

感谢您的提示,我尝试了这一点,它停止了页面加载时运行的功能,但单击此按钮仍然无法执行任何操作。 – 2010-03-05 20:39:02

+0

@cd:尝试'onclick'而不是'onClick'? – Josh 2010-03-05 20:55:56

+0

感谢Josh的回应。 onclick表现出相同的行为。 btn.onclick = sdefaults; – 2010-03-05 21:19:06

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不竟提醒“测试”,而是返回一个匿名函数,它本身会警告“测试”。 (作为一个方面,这种特定的技术通常被称为拉姆达或代表功能)

希望清除它。

+2

这是一个很好的解释...除了你从未告诉他将他的代码改为'btn.onClick = sdefaults;'这最终可以解决他所遇到的问题......相反,你告诉他如何让'btn.onClick = sdefaults ();'工作,这是在我看来有点倒退... – Josh 2010-03-05 20:29:09

+0

嗯,我觉得我不需要,因为你的答案已经这样做。 – 2010-03-05 20:40:22

+0

不够公平。你的回答比我的深入得多。我明天会给你+1,我在当天的投票限额内:-) – Josh 2010-03-05 20:57:06

相关问题