Почему мой JavaScript не работает в JSFiddle?
Я не могу понять, в чем проблема с этим JSFiddle.
HTML:
<input type="button" value="test" onclick="test()">
JavaScript:
function test(){alert("test");}
И когда я нажал на кнопку-ничего не произошло. Консоль говорит: "тест не определен"
Я читал документацию JSFiddle - там говорится, что код JS добавляется к <head>, а HTML-код добавляется к <body> (так что этот код JS раньше html и должен работать).
7 ответов:
Функция определяется внутри обработчика нагрузки и, таким образом, находится в другой области видимости. Как отмечает @ellisbben в комментариях, Это можно исправить, явно определив его в объекте
window. Еще лучше изменить его, чтобы незаметно применить обработчик к объекту: http://jsfiddle.net/pUeue/$('input[type=button]').click( function() { alert("test"); });Примечание применение обработчика таким образом, вместо встроенного, сохраняет ваш HTML чистым. Я использую jQuery, но вы можете сделать это с или без фреймворка или с помощью другого рамки, если хотите.
Если вы не зададите параметр wrap, то по умолчанию будет установлено значение"onLoad". Это приводит к тому, что весь JavaScript оборачивается в функцию, выполняемую после загрузки результата. Все переменные локальны для этой функции, поэтому недоступны в глобальной области видимости.
Измените настройку обертывания на "no wrap", и она будет работать:
Http://jsfiddle.net/zalun/Yazpj/1/
Я переключил фреймворк на "нет библиотеки", так как вы ее не используете.
Есть другой способ, объявить вашу функцию в переменную следующим образом:
test = function() { alert("test"); }
Подробности
EDIT (на основе комментариев @nnnnnn)
@нннннн:
Зачем говорить
test =(безvar), чтобы исправить это ?Когда вы определяете функцию следующим образом:
var test = function(){};Функция определяется локально, но когда вы определяете свою функцию без
var:test = function(){};
testопределяется на объектеwindow, который находится на верхнем уровне области видимости.Почему это работает?
Как @zalun говорят:
Если вы не зададите параметр wrap, то по умолчанию он будет "onLoad". Это приводит к тому, что весь JavaScript оборачивается в функцию, выполняемую после загрузки результата. Все переменные локальны для этой функции, поэтому недоступны в глобальной области видимости.
Но если вы используете этот синтаксис :
test = function(){};У вас есть доступ к функции
test, потому что она определена глобально
Список литературы:
<script> function test(){ alert("test"); } </script> <input type="button" value="test" onclick="test()">
Select OnDomreadyHTML:
<input id="dButton" type="button" value="test"/>JavaScript:
addEventListener('load', init, false); function init() { oInput = document.getElementById('dButton'); oInput.onclick = test; } function test(){ alert("test"); }
Comments