2015-08-20 3 views
0

Это самая неприятная ошибка, которую я, вероятно, когда-либо имел при кодировании. Я пытаюсь щелкнуть кнопку, и она появится в приветственном окне. Если я удалю документ , готовый, он работает. Если я удалю функцию и просто поставлю флажок в документе document.ready, она также работает, но явно без щелчка. Однако, JS не работает все вместе, и я понятия не имею, почему.функция не работает нажимать? (jquery/javascript)

HTML

<button id="signup-box-button" type="button" onclick="signupSubmit()">sign up</button> 

JS

$(document).ready(function(){ 

    function signupSubmit(){ 
     alert("hello"); 
    } 

}); 
+0

Возможно, вы хотите разместить это внутри документа document.ready block ?: $ ('# signup-box-button').on ('click', signupSubmit); – LexJacobs

+0

Если вы поместили эту функцию внутри обработчика документа, она не будет существовать, когда она привязана к HTML –

+2

Вам действительно следует прекратить использование обработчиков inline-событий, особенно, учитывая, что у вас есть [jQuery's флот вариантов обработки событий] (http://api.jquery.com/category/events/). – Oka

ответ

5

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

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

$(document).ready(function(){ 
    // code here 
}); 

function signupSubmit(){ 
    alert("hello"); 
} 

Или, еще лучше. Оставьте код Javascript только в файле Javascript, и пусть HTML с HTML только.

HTML

<button id="signup-box-button" type="button">sign up</button> 

Javascript

$(document).ready(function(){ 
    $('#signup-box-button').click(function(){ 
     alert("hello"); 
    } 
}); 
0

Это из области видимости в JavaScript, как объяснено Skarllot

Пожалуйста refer знать, как this ключевых слов работает с инлайн события обработчики.

Вы можете использовать код, приведенный ниже фрагмент кода

$(document).ready(function(){ 

    this.signupSubmit = function(){ 
     alert("hello"); 
    } 

}); 

См JSFIDDLE

Добавляя this по ключевому слову function будет зарегистрирован в глобальном масштабе. И вышеупомянутое решение может загрязнять глобальное пространство имен.

Чтобы лучше понять выше функциональность:

обработчики событий Инлайн вычисляются в глобальном масштабе. В вашем первом примере signupSubmit не определен в глобальной области, он определяется внутри функции, которую вы передаете, до $(document).ready. Следовательно, встроенный обработчик события не может найти функцию.

Вот упрощенный пример:

function ready() { 
    function signupSubmit() { } 
} 

ready(); 
signupSubmit(); // ReferenceError because signupSubmit is not defined in this scope 

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

+0

Это не кажется хорошей практикой. Я бы не рекомендовал его. – Skarllot

+0

При использовании встроенного обработчика событий обратитесь к http://www.quirksmode.org/js/this.html. А также вы можете объяснить, почему это не хорошая практика? Я совершенно новичок в этом – Varun

+0

Хотя вы не загрязняете глобальную область, вы по-прежнему загрязняете HTML кодом Javascript. – Skarllot

Смежные вопросы