2012-09-15 43 views
0

有人可以帮我吗?Javascript:我怎样才能'宣布'一个函数而不需要调用它?

下面的代码工作,但不幸的是一个函数调用DoSomething的()是必要的:

<body onload=init()> 
</body> 

<script> 
    function Startscreen() 
    { 
     this.doSomething(); //why is this call necessary and how else to solve it? 
     this.startscreenhtml = 
      " <form onsubmit=doSomething()> " + 
      "  <input type=text />   " + 
      " </form>       "; 
     document.write(this.startscreenhtml); 
    } 
    Startscreen.prototype.doSomething = function() 
    { 
     alert(123) 
    } 
</script> 

<script> 
    function init() 
    { 
     var startscreen = new Startscreen();  
    } 
</script> 

我也想保持功能DoSomething的作为对象启动画面的功能。

编辑:我想使用document.write

Preferrably我要声明,我现在所做的构造之外DoSomething的保持,因为我相信,否则的话我会叫新的启动画面多次,该相同的功能被创建多次。

但是,我尝试了很多事情,使得这个工作没有调用doSomething,包括声明构造函数内的函数,但没有任何工作。 我的猜测是,调用是必要的,使功能已知,因为如果代码是自上而下读取,我即时分配给'onsubmit'之前我宣布它。

有人知道如何解决这个问题吗?

回答

2

我不认为代码的工作原理与您现在的想法相同。当您创建表单时将调用doSomething函数,但在您提交表单时不会调用它。

要从onsubmit事件调用的函数,它在全球范围内被称为,作为事件处理函数不是在Startscreen实例的情况下调用。由于两个原因,使用当前的代码无法调用该函数。从全局上下文无法实现,并且由于没有对该对象实例的引用,因此甚至没有可以用来调用它的实例。

(你可以得到从样机的功能,或创建对象的新实例,但随后与对象的设置将会是完全没有意义的。)

如果你想保留的情况下,你有把它在生存的init函数的变量:

var startscreen; 
function init() { 
    startscreen = new Startscreen();  
} 

现在的对象仍然将围绕当onsubmit事件处理程序被调用,这样你就可以通过变量达到功能:

this.startscreenhtml = 
    "<form onsubmit="startscreen.doSomething()">" + 
    "<input type=text />" + 
    "</form>"; 

这当然不是理想的,因为你将对象与变量耦合在一起,但是我希望你能够获得关于正在发生的事情的一些知识,以便你能够挺身而出。


若要在提交事件的方法,而无需一个全局变量来找到它,你必须创建一个元素,让你可以挂钩的实际功能的事件处理程序。这样,你可以达到从事件处理程序的方法:

// make a local variable that you can capture in a closure 
var me = this; 
var frm = document.createElement("form"); 
// make an anonymous function that will create a closure capturing "me" 
frm.onsubmit = function(){ 
    me.doSomething(); 
}; 

这意味着你不能使用document.write创建表单(或者你需要给每一个形成唯一的ID,这样就可以得到一个参考到创建的元素并在事件后连接事件)。

+0

非常感谢这个解决方案,虽然它并不像您说的那样理想,我不想事先知道我会做什么变数名称。然而,起初你说我的doSomething函数在我提交表单时不会被调用......但它会是......?只是在创建表单时(这是我想摆脱的副作用)。希望你会回复,并感谢评论 – Jeroen

+0

顺便说一句,我得到你的解释关于没有一个(引用一个)实例留在当事件处理程序做它的事情,但仍然代码工作(我测试它在铬)。所以也许最初的呼叫(我想要一个不同的解决方案)使得这个实例在全局范围内已知 - 明确地说 - 或者将函数提升到全局水平..或者我不知道我只是在猜测,但它仍然有效......在我的原始文章中的代码,doSomething将被调用时,我提交 – Jeroen

+0

@Jeroen:我不明白'onsubmit'事件可能如何调用该方法。调用方法不注册是全局范围内的一项功能。你必须在页面中的某处添加更多的代码才能实现。无论如何,我在如何从没有全局变量的事件处理程序中获取方法的问题上增加了一些更多内容。 – Guffa

相关问题