2010-03-05 1 views
1

У меня есть следующий код:Объект javascript.onClick запускает функцию вместо установки onClick, как я могу предотвратить это и выполнять функцию onClick?

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?

Благодаря

+0

@ Daniel Vandersluis: Спасибо, что убрали свой пост. Я бы хотел, если бы мог. – Josh

ответ

8

Изменение:

sbtn.onClick = sdefaults(); 

к:

sbtn.onClick = sdefaults; 

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

.

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

+0

Спасибо за подсказку, я пробую это, и он останавливает выполнение функции при загрузке страницы, однако нажатие кнопки продолжает ничего не делать. –

+0

@cd: попробуйте 'onclick' вместо' onClick'? – Josh

+0

Спасибо за ответ Джош. onclick проявляет такое же поведение. btn.onclick = sdefaults; –

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

Надеюсь, что это очистит.

+2

Это отличное объяснение ... кроме того, что вы не сказали ему изменить свой код на 'btn.onClick = sdefaults;', который в конечном итоге устраняет проблему, с которой он сталкивается ... Вместо этого вы сказали ему, как сделать 'btn.onClick = sdefaults(); работа, которая немного отстает по моему мнению ... – Josh

+0

Ну, я чувствовал, что мне не нужно, так как ваш ответ уже делает это. –

+0

Достаточно честный. Ваш ответ был гораздо более глубоким, чем мой. Я дам вам +1 завтра, я на свой лимит голосов на день :-) – Josh