2015-01-26 3 views
0

У меня скрипку для вас: http://jsfiddle.net/pneebntd/3/focusout только срабатывает при загрузке документа и никогда больше?

$(document).ready(function(){  
    $('#Address').focusout(ValidateAddress($(this).val(), "address")); 
    $('#City').focusout(ValidateAddress($(this).val(), "city")); 
    $('#State').focusout(ValidateAddress($(this).val(), "state")); 
    $('#Zipcode').focusout(ValidateAddress($(this).val(), "zip/postal code")); 
    $("#StateList").change(ValidateAddress($(this).val(), "state")); 
}); 

function ValidateAddress(location, label) { 
    console.info("made it there : " + location + " " + label); 
} 

Короткий его в том, что я (пытаюсь) присоединить обработчик событий для функции я хочу работать, когда элемент управления теряет фокус (или когда выпадающее меню меняет значение).

То, как это написано, оно срабатывает при загрузке страницы, но больше никогда после этого. Я сделал это раньше, но, возможно, это просто потому, что это понедельник, но ... что я делаю неправильно здесь?

+1

Прочитайте документацию для [focusout] (http://api.jquery.com/focusout/). – epascarello

+1

Интересно, почему кто-то остановил вопрос. В нем есть пример выполнения, объясняется, что пошло не так, и каково ожидаемое поведение. Просто потому, что это глупая ошибка, это не делает его плохим вопросом. –

ответ

4

Этот код

$('#Address').focusout(ValidateAddress($(this).val(), "address")); 

звонкиValidateAddress и передает ее возвращаемое значение в focusout, точно так, как foo(bar())звонкиbar и передает ее возвращаемое значение в foo.

Если вы хотите дать функцию focusout, вы должны сделать это вместо этого. Например:

$('#Address').focusout(function() { 
    ValidateAddress($(this).val(), "address"); 
}); 

Этот код создает новую анонимную функцию и передает эту функцию ссылку в focusout. Когда событие произойдет, оно вызовет вашу функцию ValidateAddress.

+0

Не должен ли jQuery жаловаться, когда вы передаете что-то, что не является функцией в функцию установки обработчика событий? –

+0

Клянусь, несколько дней я просто не должен даже прикасаться к клавиатуре. Спасибо, что поймал это. – MetalPhoenix

+1

@JuanMendes: проверка, вероятно, не стоит накладных расходов. Например, я предполагаю, что 'ValidateAddress' вообще не имеет« возврата ». Таким образом, его вызов приводит к 'undefined'. Поэтому мы передаем 'undefined' в' focusout'. Это ** много **, как вызов 'focusout' без каких-либо аргументов, который должен * запускать * событие. Для проверки потребуется использовать псевдо-массив 'arguments', например:' if (! Handler && arguments.length> 0) '. В дополнение к раздуванию они просто не нужны в такой большой библиотеке, на некоторых машинах, использующих «аргументы» внутри функции *, заметно * замедляет функцию вниз. –