Why isn't my JavaScript working in JSFiddle?
JavascriptHtmlJsfiddleJavascript Problem Overview
I can't find out what is the problem with this JSFiddle.
HTML:
<input type="button" value="test" onclick="test()">
JavaScript:
function test(){alert("test");}
And when I click on button - nothing happened. The console says "test not defined"
I've read the JSFiddle documentation - there it says that JS code is added to <head>
and HTML code is added to <body>
(so this JS code is earlier than html and should work).
Javascript Solutions
Solution 1 - Javascript
If you do not specify the wrap setting it defaults to "onLoad". This results with all JavaScript being wrapped in a function run after result has been loaded. All variables are local to this function thus unavailable in the global scope.
Change the wrapping setting to "no wrap" and it'll work:
http://jsfiddle.net/zalun/Yazpj/1/
I switched the framework to "No Library" as you don't use any.
Solution 2 - Javascript
The function is being defined inside a load handler and thus is in a different scope. As @ellisbben notes in the comments, you can fix this by explicitly defining it on the window
object. Better, yet, change it to apply the handler to the object unobtrusively: http://jsfiddle.net/pUeue/
$('input[type=button]').click( function() {
alert("test");
});
Note applying the handler this way, instead of inline, keeps your HTML clean. I'm using jQuery, but you could do it with or without a framework or using a different framework, if you like.
Solution 3 - Javascript
There is another way, declare your function into a variable like this :
test = function() {
alert("test");
}
Details
EDIT (based on the comments of @nnnnnn)
@nnnnnn :
> why saying test =
(without var
) would fix it ?
When you define a function like this :
var test = function(){};
The function is defined locally, but when you define your function without var
:
test = function(){};
test
is defined on the window
object which is at the top level scope.
> why does this work?
Like @zalun say :
> If you do not specify the wrap setting it defaults to "onLoad". This results with all JavaScript being wrapped in a function run after result has been loaded. All variables are local to this function thus unavailable in the global scope.
But if you use this syntax :
test = function(){};
You have an access to the function test
because it's defined globally
References :
Solution 4 - Javascript
Change wrap setting in the Frameworks & Extensions panel, to "No wrap-in <body>
"
Solution 5 - Javascript
There is no problem with your code.Just choose the extension onLoad() from right side.
Solution 6 - Javascript
<script>
function test(){
alert("test");
}
</script>
<input type="button" value="test" onclick="test()">
Solution 7 - Javascript
Select OnDomready
HTML:
<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");
}