gpt4 book ai didi

Javascript:我怎样才能 'announce' 一个函数而不调用它?

转载 作者:行者123 更新时间:2023-12-02 19:22:06 26 4
gpt4 key购买 nike

有人可以帮助我吗?

以下代码可以工作,但不幸的是需要调用 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”。

有人知道怎么解决这个问题吗?

最佳答案

我认为代码在当前形式下的工作方式并不像您想象的那样。 doSomething 函数将在创建表单时调用,但在提交表单时不会调用。

要从 onsubmit 事件调用该函数,必须在全局上下文中知道该函数,因为不会在 Startscreen 实例的上下文中调用该事件处理程序。使用您当前的代码,不可能调用该函数,原因有两个:不可能从全局上下文访问,并且由于没有对对象实例的引用,甚至没有可以用来调用它的实例。

(您可以从原型(prototype)中获取该函数,或者创建该对象的新实例,但是这样您对对象的设置将完全毫无意义。)

如果您想保留实例,则必须将其放入在 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,以便您可以获得对创建的元素的引用并 Hook 之后的事件)。

关于Javascript:我怎样才能 'announce' 一个函数而不调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12437644/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com