内联事件处理程序不在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"); }