有人能帮助我吗?
以下代码有效,但不幸的是,必须对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作为对象Startscreen的函数。
编辑:我确实想继续使用document.write
我想要在构造函数之外声明doSomething正如我现在所做的那样,因为我相信如果我多次调用新的Startscreen,则会多次创建相同的函数。
但是,我尝试了许多工作来完成这项工作而没有调用doSomething,包括在构造函数中声明函数,但没有任何效果。 我的猜测是调用是必要的,以使函数知道,因为如果代码是从上到下读取,我在我声明它之前将它分配给'onsubmit'。
有人知道如何解决这个问题吗?
答案 0 :(得分: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,以便您可以获得对创建的元素的引用并在之后挂接事件)。