为什么在单击操作时不创建类选择器
Why class selector is not created on click action?
下面是HTML代码:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="style.css">
<script type="text/javascript">
var list = document.querySelector('ul');
list.addEventListener('click', function(ev) {
if (ev.target.tagName === 'LI') {
ev.target.classList.toggle('done');
}
}, false);
</script>
</head>
<body>
<ul>
<li>Buy milk</li>
<li>Take the dog for a walk</li>
<li>Exercise</li>
<li>Write code</li>
<li>Play music</li>
<li>Relax</li>
</ul>
</body>
</html>
下面是CSS代码:
li {
list-style-type: none;
position: relative;
margin: 2px;
padding: 0.5em 0.5em 0.5em 2em;
background: lightgrey;
font-family: sans-serif;
}
li.done {
background: #CCFF99;
}
li.done::before {
content: '';
position: absolute;
border-color: #009933;
border-style: solid;
border-width: 0 0.3em 0.25em 0;
height: 1em;
top: 1.3em;
left: 0.6em;
margin-top: -1em;
transform: rotate(45deg);
width: 0.5em;
}
以上HTML代码在浏览器启动时不会创建class="done"
点击动作。
由于代码包含在<head>
中,因此在加载<body>
的内容之前执行。因此,当绑定事件和事件没有绑定时,在DOM中找不到元素。
有两种方法来解决这个问题。
-
将代码封装在
DOMContentLoaded
事件回调中document.addEventListener('DOMContentLoaded', function () { var list = document.querySelector('ul'); list.addEventListener('click', function (ev) { if (ev.target.tagName === 'LI') { ev.target.classList.toggle('done'); } }, false); });
更新小提琴:https://jsfiddle.net/tusharj/pr2hw6c1/
阅读更多关于DOMContentLoaded: https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
-
将代码移到
<body>
的末尾,这样当脚本执行时,所有的DOM元素都会被加载。
注意:你也可以使用load
事件在DOM完全加载后执行脚本代码,但这会等待页面上的所有资源(图像,帧等)加载,这对于将事件绑定到元素上是不必要的。参考阅读DOMContentLoaded和Load事件的区别
为什么相同的代码在jsfiddle工作?
jsfiddle提供了包含脚本的四个选项。您可以在库列表下方的左侧面板设置此选项。
-
onLoad
:这与窗口的load
事件相同。代码被封装在load
事件的回调中,因此不能从外部访问函数/变量。例如:从HTML内联处理程序。 -
onDomReady
:这与jquery的DOMContentLoaded
或ready
相同,这里的代码也被包装为 -
No wrap - in Head
:这意味着JS代码将被添加到head
中。No wrap
意味着代码不像load
和DOMContentLoaded
那样包装在任何函数中。所以定义的函数/变量是全局的。 -
No wrap - in Body
:脚本加载在<body>
元素的末尾。
现在我们知道了脚本对每个选项的行为,在这里,脚本位置的选项被设置为onLoad
,因此代码可以工作。该代码将适用于除No wrap - in Head
以外的所有选项。
在jsfiddle docs http://doc.jsfiddle.net/basic/introduction.html#fiddle-settings-sidebar上阅读更多信息
尝试移动script标签并将其放在正文的最末尾。现在的情况是,脚本试图在加载页面上的元素之前运行。将script标签移动到body的底部将确保其上面的所有html元素都已正确加载。
- 在动态创建的元素上获取对特定选择器的引用
- 如何动态创建许多Jquery颜色选择器(eyecon)
- jQuery选择器不识别任何动态创建的HTML输入函数
- 如何为HTML属性/选择器创建全局名称空间或变量
- 我如何创建一个选择器,就像jQuery有jQuery()或$()一样
- 传单:如何在弹出窗口中创建链接选择器
- 如何在创建动态 HTML 页面时使用日期选择器
- 在加载后创建的对象上使用 jQuery 选择器
- Jquery - 创建动态名称选择器
- 如何使用jQuery扩展方法为元素或类选择器创建自定义插件
- 试图创建一个具有2“;数量;选择器使用html、javascript
- 禁用动态创建的日期选择器中的日期
- 从任何jquery选择器字符串创建元素的最有效方法
- 如何创建高性能选择器[请不要jquery]
- 有没有办法在javascript或jquery中创建变量选择器
- 创建多个 jQuery 选择器
- JQuery 从类选择器上的数据属性创建一个数组
- 创建回历日期选择器
- 如何使用嵌入式 ruby 动态创建 jquery 选择器(在 .js.erb 文件中)
- jQuery动态创建的日期选择器不起作用