admin管理员组

文章数量:1134241

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).

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).

Share Improve this question edited Nov 29, 2017 at 19:48 TylerH 21.2k76 gold badges79 silver badges110 bronze badges asked Mar 25, 2011 at 10:41 EugeneEugene 11.3k15 gold badges58 silver badges92 bronze badges 3
  • Removing the parentheses would also work under normal non fiddle circumstances though it is definitely good advice to separate js from HTML as much as possible. I only allow myself the style =" display:none" CSS inline no-no. – Adrian Bartholomew Commented Dec 11, 2012 at 19:45
  • related: JavaScript not running on jsfiddle.net – Bergi Commented Mar 11, 2013 at 16:06
  • If you’re looking for the opposite problem — i.e. the code works in JSFiddle, but not locally — see Using document.getElementById() inside object, works in JSFiddle, TypeError in actual. Why?. Both behaviors have the same cause: JSFiddle automatically wraps JS code in a function that is executed as soon as the DOM is ready, which also causes onclick to be out of scope. – Sebastian Simon Commented Dec 3, 2022 at 23:10
Add a comment  | 

7 Answers 7

Reset to default 101

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.

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.

There is another way, declare your function into a variable like this :

test = function() {
  alert("test");
}

jsFiddle


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 :

  • https://stackoverflow.com/a/338053/3083093
  • https://stackoverflow.com/a/5830423/3083093

Change wrap setting in the Frameworks & Extensions panel, to "No wrap-in <body>"

There is no problem with your code.Just choose the extension onLoad() from right side.

<script> 
function test(){
 alert("test");   
}
</script>

<input type="button" value="test" onclick="test()">
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");
}

本文标签: htmlWhy isn39t my JavaScript working in JSFiddleStack Overflow