js中的onclick事件在ul获取li时点击两次才会执行的原因

js中的onclick事件在ul获取li时点击两次才会执行的原因
下面的代码中 只有onclick第二次才会执行函数内部的代码
代码实例如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>js点击事件</title>
<script type="text/javascript" src="jquery.js"></script>
</head>
<body>
<ul id="mylist1">
<li>我喜欢吃</li>
</ul>
<ul id="mylist2">
<li>鸡腿</li>
<li>薯片</li>
<li>汉堡</li>
</ul>
<button id="btn" class="btn1">添加</button>
<script>
window.onload = function(){
var oBtn = document.getElementById('btn');
oBtn.onclick = function(){
var oUl1 = document.getElementById('mylist1');
var oUl2 = document.getElementById('mylist2'); oUl1.appendChild(oUl2.firstChild);
}
}
</script>
</body>
</html>
出现此问题的原因是
firstChild 获得的是元素的第一个子元素 ul中的第一个子元素并不是第一个li标签 而是ul与第一个li之间的空格
解决的办法
1、将ul与li之间的空格全都删掉
2、使用children来调用li children[0]则是第一个li标签
下面的代码可以实现点击一次onclick 可以执行一次函数内部的代码
代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>js点击事件</title>
<script type="text/javascript" src="jquery.js"></script>
</head>
<body>
<ul id="mylist1">
<li>我喜欢吃</li>
</ul>
<ul id="mylist2">
<li>鸡腿</li>
<li>薯片</li>
<li>汉堡</li>
</ul>
<button id="btn" class="btn1">添加</button>
<script>
window.onload = function(){
var oBtn = document.getElementById('btn');
oBtn.onclick = function(){
var oUl1 = document.getElementById('mylist1');
var oUl2 = document.getElementById('mylist2');
oUl1.appendChild(oUl2.children[0]);
}
}
</script>
</body>
</html>

注:也可以通过jQuery中的on()事件通过class属性调用click事件 可以使click事件在点击第一次时就会执行函数内部的代码
JavaScript 的事件机制是其核心特性之一,它使得网页可以响应用户的交互操作。理解 JavaScript 的事件处理对于前端开发人员来说至关重要。 ### 1. **事件流** 当用户在一个页面上触发某个事件(如点击按钮),浏览器会按照特定顺序将该事件传播到目标元素及其祖先元素的过程称为“事件流”。事件流分为三个阶段: - **捕获阶段**:从最外层的 `window` 对象开始逐级向下传递至具体的 DOM 元素。 - **目标阶段**:到达实际发生事件的那个元素。 - **冒泡阶段**:再由这个具体的目标元素向外返回直至顶层窗口对象。 默认情况下,大多数浏览器只支持冒泡阶段;而现代标准规定了完整的三步流程。 ```javascript // 示例:添加事件监听器并指定是否在捕获阶段处理 element.addEventListener('click', function(event) { console.log("Click detected!"); }, true); // 如果第三个参数设为true,则是在捕获阶段处理,默认false表示冒泡阶段 ``` ### 2. **事件委托** 由于DOM结构可能会动态变化,并非所有节点都已存在或需要绑定相同的处理器,“事件委托”就显得尤为重要。通过给父容器设置一次性的全局侦听即可有效减少性能损耗以及内存占用。 例如,在一个包含多个列表项 `<li>` 标签的无序列表 `<ul>` 中,我们可以只为整个列表注册单次鼠标右键菜单禁用功能,而不是分别对每一个选项做同样设定。 ```html <ul id="myList"> <li>Item 1</li> <li>Item 2</li> </ul> <script type="text/javascript"> document.getElementById('myList').addEventListener('contextmenu',function(e){ if (e.target.tagName.toLowerCase() === 'li') e.preventDefault(); }); </script> ``` 这样做不仅简化了代码维护工作量还提高了效率! ### 3. **阻止默认行为和停止冒泡** 有我们希望防止某些内置的行为发生(比如表单提交、链接跳转等)。这就需要使用到 `event.preventDefault()` 方法来取消掉即将发生的动作。 另外有候为了不让事件继续向上传播影响其他元素也可以利用 `event.stopPropagation()` 或者 `return false;`(注意这种方式会在 jQuery 环境下同完成两个任务). ```javascript linkElement.onclick = function(event) { event.preventDefault(); // 阻止a标签默认打开新页行为 var confirmResult = window.confirm("确定要离开吗?"); if(!confirmResult) return false; }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值