内联事件处理程序不在JSFiddle中工作

我无法找出这个JSFiddle有什么问题。

HTML:

<input type="button" value="test" onclick="test()"> 

使用Javascript:

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

而当我点击button – 什么都没有发生。 控制台说“testing未定义”

我已经阅读了jsfiddle文档 – 有书面的,JS代码被添加到<head>和HTML代码被添加到<body> 。 (所以这个JS代码早于HTML,应该工作)

该函数是在一个负载处理程序中定义的,因此处于不同的范围。 作为注释中的@ellisbben注释,您可以通过在window对象上明确定义来解决这个问题。 更好的是,改变它以不加引人注目地将处理器应用于对象: http : //jsfiddle.net/pUeue/

 $('input[type=button]').click( function() { alert("test"); }); 

注意以这种方式应用处理程序,而不是内联,保持您的HTML干净。 我正在使用jQuery,但是如果你愿意的话,你可以使用或不使用框架或使用不同的框架。

如果您不指定包装设置,则默认为“onLoad”。 这会导致在加载结果之后所有的JavaScript被包装在一个运行的函数中。 所有variables都是本地函数,因此在全局范围内不可用。

改变包装设置为“不换行”,它会工作:

http://jsfiddle.net/zalun/Yazpj/1/

因为你没有使用任何的框架,所以我将这个框架转换为“No Library”。

还有另一种方法,把你的函数声明为这样的variables:

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

的jsfiddle


细节

编辑(基于@nnnnnn的评论)

@nnnnnn:

为什么说test = (没有var )会解决它?

当你像这样定义一个函数:

 var test = function(){}; 

该函数是在本地定义的,但是当你定义没有var的函数时:

 test = function(){}; 

test是在顶层范围的window对象上定义的。

为什么这个工作?

像@zalun说:

如果您不指定包装设置,则默认为“onLoad”。 这会导致在加载结果之后所有的JavaScript被包装在一个运行的函数中。 所有variables都是本地函数,因此在全局范围内不可用。

但是如果你使用这个语法:

 test = function(){}; 

您可以访问functiontest因为它是全局定义的


参考文献

将“框架和扩展”面板中的换行设置更改为“无换行<body>

你的代码没有问题。只需从右侧select扩展onLoad()。

 <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"); }