为什么我的 JavaScript 在 JSFiddle 中不起作用?

IT技术 javascript html jsfiddle
2021-01-26 21:35:55

我不知道这个JSFiddle有什么问题

HTML:

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

JavaScript:

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

当我点击按钮时 - 什么也没发生。控制台显示“未定义测试”

我已经阅读了 JSFiddle 文档 - 它说添加了 JS 代码并添加了<head>HTML 代码<body>(所以这个 JS 代码早于 html 并且应该可以工作)。

6个回答

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

将包装设置更改为“不包装”,它会起作用:

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

我将框架切换为“无库”,因为您不使用任何库。

该函数是在加载处理程序中定义的,因此在不同的范围内。正如@ellisbben 在评论中指出的那样,您可以通过在window对象上显式定义它来解决此问题更好的是,更改它以不显眼地将处理程序应用于对象:http : //jsfiddle.net/pUeue/

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

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

@tvanfosson-您的解决方案有效,但 jsfiddle 不使用单独的框架来显示结果;参见jsfiddle.net/Yazpj/show它最初不起作用的原因是它test是在onLoad函数内部定义的使用window.test = function(){/*...*/}使它工作得很好。
2021-03-10 21:35:55
@Innuendo - jsFiddle 为代码/html/样式表使用单独的框架。您需要在函数调用中引用框架,但实际上没有一种简单的方法可以做到这一点,因为框架没有名称。由于 jsfiddle 的工作方式,这确实是一个问题,但将 javascript 完全分开仍然是一个好主意。
2021-03-13 21:35:55
@ellisbben - 如果我使用 Firebug 检查 DOM,4 个单独的窗格中的每一个都存在于单独的 iframe 中。
2021-04-03 21:35:55
是的,但是如果您检查用于显示示例的单个 iframe,您会发现它将所有代码放在一个不使用框架的页面中,因此这些框架不会破坏您的示例。附加show到任何 jsfiddle URL 以查看我在说什么:jsfiddle.net/Yazpj/show
2021-04-03 21:35:55

还有另一种方法,将您的函数声明为这样的变量:

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

js小提琴


细节

编辑(基于@nnnnnn 的评论)

@nnnnnn :

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

当您定义这样的函数时:

var test = function(){};

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

test = function(){};

testwindow在顶级范围对象上定义

为什么这样做?

就像@zalun 说的:

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

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

test = function(){};

您可以访问该函数,test因为它是全局定义的


参考 :

为什么这样做呢?您提供的“更多信息”链接并没有解释问题与范围有关,或者为什么说test = (without var) 会解决它。
2021-03-14 21:35:55
@R3tep 你的第一个链接是:jsfiddle.net/R3tep/Yazpj/1406 alert 对我没有任何作用。我在镀铬。
2021-03-19 21:35:55
这确实是最简单的方法,因为您只是在 JSFiddle 中测试一小部分代码。
2021-03-21 21:35:55
@R3tep 是的,它适用于 console.log。我将在 SO 上发布一个问题,因为我相信我没有警报框的事实与我在 iframe 上遇到的另一个问题有关。
2021-03-29 21:35:55
@R3tep 我想你误解了我,但我不确定。你的代码很好。JSFiddle 的编码方式存在问题(他们用来显示结果的 iframe 的沙箱属性中缺少值)。这使得它无法在某些版本的 chrome 上运行。我在他们的 github 上发送了一个问题报告。我对它非常感兴趣,因为我认为我在我的网站上遇到的问题是相同的,但不是。干杯。
2021-03-31 21:35:55

将 Frameworks & Extensions 面板中的 wrap 设置更改为“No wrap-in <body>

您的代码没有问题。只需从右侧选择扩展名 onLoad()。