JS基础_DOM查询(这个方法要会:定义一个函数,专门用来为指定元素绑定单击响应函数)

本文通过一系列实例详细介绍了如何使用JavaScript进行DOM操作,包括查找特定元素、获取和设置属性值等关键技能。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Untitled Document</title>
		<link rel="stylesheet" type="text/css" href="style/css.css" />
		<script type="text/javascript">
		
			/*
			 * 定义一个函数,专门用来为指定元素绑定单击响应函数
			 * 	参数:
			 * 		idStr 要绑定单击响应函数的对象的id属性值
			 * 		fun 事件的回调函数,当单击元素时,该函数将会被触发
			 */
			function myClick(idStr , fun){
				var btn = document.getElementById(idStr);
				btn.onclick = fun;
			}
		
			window.onload = function(){
				
				//为id为btn01的按钮绑定一个单击响应函数
				var btn01 = document.getElementById("btn01");
				btn01.onclick = function(){
					//查找#bj节点
					var bj = document.getElementById("bj");
					//打印bj
					//innerHTML 通过这个属性可以获取到元素内部的html代码
					alert(bj.innerHTML);
				};
				
				
				//为id为btn02的按钮绑定一个单击响应函数
				var btn02 = document.getElementById("btn02");
				btn02.onclick = function(){
					//查找所有li节点
					//getElementsByTagName()可以根据标签名来获取一组元素节点对象
					//这个方法会给我们返回一个类数组对象,所有查询到的元素都会封装到对象中
					//即使查询到的元素只有一个,也会封装到数组中返回
					var lis = document.getElementsByTagName("li");
					
					//打印lis
					//alert(lis.length);
					
					//变量lis
					for(var i=0 ; i<lis.length ; i++){
						alert(lis[i].innerHTML);
					}
				};
				
				
				//为id为btn03的按钮绑定一个单击响应函数
				var btn03 = document.getElementById("btn03");
				btn03.onclick = function(){
					//查找name=gender的所有节点
					var inputs = document.getElementsByName("gender");
					
					//alert(inputs.length);
					
					for(var i=0 ; i<inputs.length ; i++){
						/*
						 * innerHTML用于获取元素内部的HTML代码的
						 * 	对于自结束标签,这个属性没有意义
						 */
						//alert(inputs[i].innerHTML);
						/*
						 * 如果需要读取元素节点属性,
						 * 	直接使用 元素.属性名
						 * 		例子:元素.id 元素.name 元素.value
						 * 		注意:class属性不能采用这种方式,
						 * 			读取class属性时需要使用 元素.className
						 */
						alert(inputs[i].className);
					}
				};
				
				//为id为btn04的按钮绑定一个单击响应函数
				var btn04 = document.getElementById("btn04");
				btn04.onclick = function(){
					
					//获取id为city的元素
					var city = document.getElementById("city");
					
					//查找#city下所有li节点
					var lis = city.getElementsByTagName("li");
					
					for(var i=0 ; i<lis.length ; i++){
						alert(lis[i].innerHTML);
					}
					
				};
				
				//为id为btn05的按钮绑定一个单击响应函数
				var btn05 = document.getElementById("btn05");
				btn05.onclick = function(){
					//获取id为city的节点
					var city = document.getElementById("city");
					//返回#city的所有子节点
					/*
					 * childNodes属性会获取包括文本节点在内的所有节点
					 * 根据DOM标签标签间空白也会当成文本节点
					 * 注意:在IE8及以下的浏览器中,不会将空白文本当成子节点,
					 * 	所以该属性在IE8中会返回4个子元素而其他浏览器是9个
					 */
					var cns = city.childNodes;
					
					//alert(cns.length);
					
					/*for(var i=0 ; i<cns.length ; i++){
						alert(cns[i]);
					}*/
					
					/*
					 * children属性可以获取当前元素的所有子元素
					 * 所有浏览器都兼容,推荐使用这个
					 */
					var cns2 = city.children;
					alert(cns2.length);
				};
				
				//为id为btn06的按钮绑定一个单击响应函数
				var btn06 = document.getElementById("btn06");
				btn06.onclick = function(){
					//获取id为phone的元素
					var phone = document.getElementById("phone");
					//返回#phone的第一个子节点
					//phone.childNodes[0];
					//firstChild可以获取到当前元素的第一个子节点(包括空白文本节点)
					var fir = phone.firstChild;
					
					//firstElementChild获取当前元素的第一个子元素
					/*
					 * firstElementChild不支持IE8及以下的浏览器,
					 * 	如果需要兼容他们尽量不要使用
					 */
					//fir = phone.firstElementChild;
					
					alert(fir);
				};
				

				//为id为btn07的按钮绑定一个单击响应函数
				myClick("btn07",function(){
					
					//获取id为bj的节点
					var bj = document.getElementById("bj");
					
					//返回#bj的父节点
					var pn = bj.parentNode;
					
					alert(pn.innerHTML);
					
					/*
					 * innerText
					 * 	- 该属性可以获取到元素内部的文本内容
					 * 	- 它和innerHTML类似,不同的是它会自动将html去除
					 */
					//alert(pn.innerText);
					
					
				});
				
				
				//为id为btn08的按钮绑定一个单击响应函数
				myClick("btn08",function(){
					
					//获取id为android的元素
					var and = document.getElementById("android");
					
					//返回#android的前一个兄弟节点(也可能获取到空白的文本)
					var ps = and.previousSibling;
					
					//previousElementSibling获取前一个兄弟元素,IE8及以下不支持
					//var pe = and.previousElementSibling;
					
					alert(ps);
					
				});
				
				//读取#username的value属性值
				myClick("btn09",function(){
					//获取id为username的元素
					var um = document.getElementById("username");
					//读取um的value属性值
					//文本框的value属性值,就是文本框中填写的内容
					alert(um.value);
				});
				
				
				//设置#username的value属性值
				myClick("btn10",function(){
					//获取id为username的元素
					var um = document.getElementById("username");
					
					um.value = "今天天气真不错~~~";
				});
				
				
				//返回#bj的文本值
				myClick("btn11",function(){
					
					//获取id为bj的元素
					var bj = document.getElementById("bj");
					
					//alert(bj.innerHTML);
					//alert(bj.innerText);
					
					//获取bj中的文本节点
					/*var fc = bj.firstChild;
					alert(fc.nodeValue);*/
					
					//这种写法用的多一点
					alert(bj.firstChild.nodeValue);
					
					
				});
				
			};
			
		
		</script>
	</head>
	<body>
		<div id="total">
			<div class="inner">
				<p>
					你喜欢哪个城市?
				</p>

				<ul id="city">
					<li id="bj">北京</li>
					<li>上海</li>
					<li>东京</li>
					<li>首尔</li>
				</ul>

				<br>
				<br>

				<p>
					你喜欢哪款单机游戏?
				</p>

				<ul id="game">
					<li id="rl">红警</li>
					<li>实况</li>
					<li>极品飞车</li>
					<li>魔兽</li>
				</ul>

				<br />
				<br />

				<p>
					你手机的操作系统是?
				</p>

				<ul id="phone"><li>IOS</li> <li id="android">Android</li><li>Windows Phone</li></ul>
			</div>

			<div class="inner">
				gender:
				<input class="hello" type="radio" name="gender" value="male"/>
				Male
				<input class="hello" type="radio" name="gender" value="female"/>
				Female
				<br>
				<br>
				name:
				<input type="text" name="name" id="username" value="abcde"/>
			</div>
		</div>
		<div id="btnList">
			<div><button id="btn01">查找#bj节点</button></div>
			<div><button id="btn02">查找所有li节点</button></div>
			<div><button id="btn03">查找name=gender的所有节点</button></div>
			<div><button id="btn04">查找#city下所有li节点</button></div>
			<div><button id="btn05">返回#city的所有子节点</button></div>
			<div><button id="btn06">返回#phone的第一个子节点</button></div>
			<div><button id="btn07">返回#bj的父节点</button></div>
			<div><button id="btn08">返回#android的前一个兄弟节点</button></div>
			<div><button id="btn09">返回#username的value属性值</button></div>
			<div><button id="btn10">设置#username的value属性值</button></div>
			<div><button id="btn11">返回#bj的文本值</button></div>
		</div>
	</body>
</html>

 

 

<think>我们正在讨论的是如何为同一个DOM元素同时绑定contextmenu(右键菜单)事件和dblclick(双击)事件。这两个事件可能会发生冲突,因为双击事件包含两次点击,而右键菜单事件通常在点击右键时触发。我们需要确保这两个事件能够互不干扰地触发。需要注意的是,在同一个元素上同时绑定多个事件监听器是完全可行的,但要注意事件触发顺序和可能的事件冲突。我们可以通过分别添加事件监听器来实现。但是,由于双击事件由两次点击组成,而右键菜单事件在右键点击时触发,所以它们通常不会同时触发(一个是左键双击,一个是右键单击)。因此,直接绑定两个事件监听器可能是安全的。然而,有一种情况需要注意:如果用户快速连续地右击两次,可能会触发两次contextmenu事件,而不会触发dblclick事件(因为dblclick事件通常只在左键双击时触发)。所以,我们不需要担心同一个手势同时触发两个事件。但是,根据标准,双击事件只针对主按钮(通常是左键)。因此,在监听dblclick事件时,我们只关心左键。而contextmenu事件通常由右键点击触发,但也可以通过其他方式触发(例如键盘上的菜单键)。因此,我们可以直接为同一个元素分别添加dblclick和contextmenu事件监听器。示例代码如下:```html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Double-clickandContextMenu</title></head><body><divid="myElement">在此处双击或右键点击</div><script>constelement=document.getElementById('myElement');//绑定双击事件element.addEventListener('dblclick',function(event){console.log('双击事件触发');//这里可以写双击事件的处理逻辑});//绑定右键菜单事件element.addEventListener('contextmenu',function(event){console.log('右键菜单事件触发');//这里可以写右键菜单事件的处理逻辑//注意:如果需要显示自定义的右键菜单,通常需要阻止默认行为(浏览器自带的右键菜单)//event.preventDefault();});</script></body></html>```注意:1.双击事件(dblclick)只会由鼠标左键触发,而右键菜单事件(contextmenu)主要由鼠标右键触发(也可能是键盘菜单键)。2.这两个事件不会同时触发(因为一个需要左键双击,一个需要右键单击),所以不会冲突。3.在contextmenu事件处理函数中,如果你希望显示自定义的右键菜单,需要调用`event.preventDefault()`来阻止浏览器默认的右键菜单。但是,如果我们想要在同一个元素上同时处理这两种事件,并且确保它们不会互相干扰,上面的代码就可以工作。另外,需要提醒的是,双击事件会先触发两次click事件,然后才触发dblclick事件。而contextmenu事件会在一次右键点击时触发,不会触发click事件(左键点击才会触发click事件)。因此,我们不必担心双击事件会触发contextmenu事件,也不必担心右键点击会触发双击事件。结论:直接绑定两个事件监听器即可。如果用户有特殊需求,比如在右键双击时触发某个事件(注意:这不是标准行为),则可能需要自己实现,但这不在本次问题的讨论范围内。因此,按照上述方法就可以同时为同一个元素绑定contextmenu和dblclick事件。相关问题:1.如何区分单击事件和双击事件?2.如何阻止右键菜单事件的默认行为?3.在双击事件中如何获取鼠标点击的位置?4.如何为同一个事件添加多个事件监听器?</think> 在 JavaScript 中为同一元素同时绑定 `contextmenu`(右键菜单)和 `dblclick`(双击)事件时,需要注意它们的事件触发机制并不冲突,可以直接绑定。以下是实现方法和注意事项: ### 实现方法 ```javascript const element = document.getElementById('yourElementId'); // 绑定 contextmenu 事件 element.addEventListener('contextmenu', (event) => { event.preventDefault(); // 阻止浏览器默认右键菜单 console.log('右键菜单事件触发'); // 自定义右键菜单逻辑 }); // 绑定 dblclick 事件 element.addEventListener('dblclick', (event) => { console.log('双击事件触发'); // 自定义双击逻辑 }); ``` ### 关键说明 1. **无冲突机制**: - `contextmenu` 由**鼠标右键单击**触发 - `dblclick` 由**鼠标左键快速双击**触发 - 两者触发条件完全不同,不会互相干扰 2. **需要阻止默认行为**: - 在 `contextmenu` 事件中建议调用 `event.preventDefault()` - 这会阻止浏览器默认的右键菜单,让你可以完全自定义菜单 - 若不调用此方法,浏览器默认菜单会出现 3. **移动端注意事项**: ```javascript // 添加 touch 事件支持(移动端长按触发右键菜单) element.addEventListener('longpress', (event) => { event.preventDefault(); console.log('移动端长按事件(模拟右键)'); }); ``` ### 完整示例 ```html <div id="target" style="width:200px;height:200px;background:#eee;"> 点击/双击此区域 </div> <script> const target = document.getElementById('target'); // 右键菜单事件 target.addEventListener('contextmenu', (e) => { e.preventDefault(); alert('自定义右键菜单被触发'); }); // 双击事件 target.addEventListener('dblclick', (e) => { alert('双击事件被触发'); }); // 移动端长按模拟(可选) let timer; target.addEventListener('touchstart', () => { timer = setTimeout(() => alert('长按触发'), 500); }); target.addEventListener('touchend', () => clearTimeout(timer)); </script> ``` ### 注意事项 1. 在移动设备上,`contextmenu` 事件不会被触发,需要用 `touchstart`/`touchend` 模拟长按行为 2. 如果同时绑定了 `click` 事件,需注意双击事件会触发两次单击事件(可通过计时器解决) 3. 自定义右键菜单时需考虑: - 菜单位置 (`e.clientX`/`e.clientY`) - 菜单层级(避免被其他元素遮挡) - 点击菜单外区域自动关闭
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZHOU_VIP

您的鼓励将是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值