Object.onClick Javascript запускает функцию вместо установки onClick. Как я могу предотвратить это и выполнять только функцию onClick? - PullRequest
1 голос
/ 05 марта 2010

У меня есть следующий код:

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(), а затем, если я нажимаю кнопку, ничего не происходит. Может ли кто-нибудь дать представление о том, как предотвратить запуск функции под нагрузкой и заставить ее запускаться только по щелчку?

Спасибо

Ответы [ 2 ]

8 голосов
/ 05 марта 2010

Изменение:

sbtn.onClick = sdefaults();

до:

sbtn.onClick = sdefaults;

sbtn.onClick = sdefaults(); означает: «Запустите функцию sdefaults и сохраните результат в sbtn.onClick.

btn.onClick = sdefaults; означает: «Установите sbtn.onClick на функцию sdefaults», что и нужно.

3 голосов
/ 05 марта 2010

Вы должны понимать разницу между ссылками на функции и вызовом функции.

Рассмотрим следующую функцию

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, чтобы фактически не предупреждать "test", а чтобы возвращать анонимную функцию, которая сама будет оповещение "тест". (Как примечание, этот специфический метод обычно называется лямбда-функцией или делегатом)

Надеюсь, это прояснит.

...