我在一个输出警报的按钮中有基本的onClick
function test(){
alert('here');
}
<button onClick="test()">Press</button>
在StackBlitz这不起作用 - https://stackblitz.com/edit/js-umarwe?embed=1&file=index.js&hideNavigation=1
这是因为ES6
这在ES6中是如何工作的
我在一个输出警报的按钮中有基本的onClick
function test(){
alert('here');
}
<button onClick="test()">Press</button>
在StackBlitz这不起作用 - https://stackblitz.com/edit/js-umarwe?embed=1&file=index.js&hideNavigation=1
这是因为ES6
这在ES6中是如何工作的
3 回答
为什么它不起作用
它无法工作的原因是Stackblitz背后有一个资产构建系统,它将您的Javascript代码视为 modules .
这意味着在这些模块中定义的变量只能在这些模块中使用,并且 not 会附加到全局命名空间(正如您所期望的那样,似乎习惯了) .
修复它所需的最低要求
要实现这一点,您需要 explicitly 将这些变量附加到 global object ,这在浏览器中恰好是
window
.只需在index.js文件的末尾添加以下行,即可使代码正常工作:
更好的方法
请注意,直接在元素上使用内联事件处理程序(如
onclick
)被认为是不好的做法(并且确实存在实际缺点,但这会导致太多) . 相反,您应该使用JavascriptsElement.prototype.addEventlistener()
函数 . 到达那里的步骤:将
id
添加到您的按钮,以便您的Javascript可以找到它:接下来,将该元素放在变量中:
最后一步:为
click
事件添加事件侦听器:这是重构版本的完整
index.js
:如何让它更安全,更好
还有一点需要注意:如果将脚本标记加载到文档的
head
部分中,则需要在标记上添加defer
属性,或者在DOMContentLoaded
事件中包装需要访问DOM的部分代码处理:否则,当您的Javascript尝试查找按钮并附加事件侦听器时,浏览器尚未解析HTML .
你可以这样做 .
我不知道stackBlitz ..
但是,我理解加载index.js
所以
window.test = () => {} ...
修改index.js文件中的测试函数声明:
它无法识别click事件上的测试函数,因为您声明的测试函数不在同一范围内 .