1

次のコードがあります。

function sdefaults()
{
   alert("test");
}

var btnpos, sbtn;
btnpos = document.getElementsByName('somePosition')[0];
sbtn = document.createElement('input');
btnpos.parentNode.insertBefore(sbtn, btnpos.nextSibling);
sbtn.type = "button";
sbtn.name = "social";
sbtn.value = "Defaults";
sbtn.onClick = sdefaults();

ボタンが必要な場所に表示され、名前/値が正しく設定されています。ただし、ページをロードするsdefaults()と関数が実行され、ボタンをクリックしても何も起こりません。関数がロード時に実行されないようにし、onclick のみを実行するように強制する方法について、誰かが洞察を提供できますか?

ありがとう

4

2 に答える 2

8

変化する:

sbtn.onClick = sdefaults();

に:

sbtn.onClick = sdefaults;

sbtn.onClick = sdefaults();意味: 「sdefaults関数を実行し、結果を に保存しsbtn.onClickます。

btn.onClick = sdefaults;意味:「sbtn.onClick関数に設定sdefaults」、これはあなたが探しているものです。

于 2010-03-05T19:43:31.747 に答える
3

関数参照と関数呼び出しの違いを理解する必要があります。

次の関数を検討してください

function foo()
{
  alert( 'Hello World' );
}

次に、この関数を参照するサンプルをいくつか見てみましょう。関数を参照するには、他の変数と同様に、そのシンボル名を使用します。

// Alert contents of foo
alert( foo );

// Set foo as the click handler for the body
document.body.onclick = foo;

// Assign a new function to foo
foo = function(){ alert( 'Goodbye!' ); }

次に、関数呼び出しについて考えます。これは、関数が実行され、その戻り値が呼び出しスコープに返されることを意味します。

// Invoke foo simply
foo();

// Invoke foo with a specific scope
foo.apply( this ); // or foo.call( this );

のコードを変更するだけで、コード スニペットを完全に変更できるようになりましたsdefaults()。これがどのように見えるかです。

function sdefaults()
{
  return function()
  {
    alert("test");
  }
}

ここで、実行するsbtn.onClick = sdefaults();と何が起こるかというと、onClick実際には「テスト」をアラートするのではなく、それ自体が「テスト」をアラートする無名関数を返すように sdefaults を変更したため、プロパティは期待される関数を受け取ります。 (補足として、この特定の手法は一般にラムダ関数またはデリゲート関数と呼ばれます)

それが解決することを願っています。

于 2010-03-05T20:23:30.767 に答える