0

有人可以帮助我吗?

以下代码有效,但不幸的是,需要对 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 ,因为我相信否则如果我多次调用 new Startscreen ,则会多次创建相同的函数。

但是,我尝试了很多方法来使这项工作在没有调用 doSomething 的情况下工作,包括在构造函数中声明函数,但没有任何效果。我的猜测是调用是使函数知道所必需的,因为如果从上到下阅读代码,我在声明它之前将其分配给'onsubmit'。

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

4

1 回答 1

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,以便您可以获得对创建的元素的引用并在之后连接事件)。

于 2012-09-15T13:25:49.853 回答