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 を宣言したいと考えています。そうしないと、新しい Startscreen を複数回呼び出すと、同じ関数が複数回作成されると考えられるからです。

ただし、コンストラクター内で関数を宣言するなど、doSomething を呼び出さずにこれを機能させるために多くのことを試みましたが、何も機能しませんでした。コードが上から下に読み取られる場合、宣言する前に「onsubmit」に割り当てるため、関数を認識させるには呼び出しが必要であると思います。

これを解決する方法を知っている人はいますか?

4

1 に答える 1

2

現在の形式で考えているようにコードが機能するとは思いません。このdoSomething関数は、フォームの作成時に呼び出されますが、フォームの送信時には呼び出されません。

onsubmitイベントハンドラーはインスタンスのコンテキストでは呼び出されないため、イベントから関数を呼び出すには、グローバルコンテキストで関数を認識する必要がありStartscreenます。現在のコードでは、2つの理由で関数を呼び出すことができません。グローバルコンテキストから到達することはできません。また、オブジェクトインスタンスへの参照が残っていないため、それを呼び出すために使用できるインスタンスも残っていません。

(プロトタイプから関数を取得することも、オブジェクトの新しいインスタンスを作成することもできますが、オブジェクトを使用したセットアップは完全に無意味になります。)

インスタンスを保持したい場合は、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 に答える