ie onmouseup和onclick事件执行顺序

本文介绍了一个网页分享功能的实现方法,包括如何在选中文本时弹出浮动层,并在IE浏览器下解决浮动层显示与文字选择冲突的问题。通过在页面中加入隐藏域保存选中文本,确保了IE环境下功能正常运行。

今天项目要做个类似网页分享的功能,即选中文本文字弹出浮动层,点击浮动层图标可以弹出新页面。

在网上搜到一篇关于实现的方法(原处http://www.zhangxinxu.com/wordpress/?p=1428),为方便叙述将代码粘贴如下

var $sinaMiniBlogShare = function(eleShare, eleContainer) {
	var eleTitle = document.getElementsByTagName("title")[0];
	eleContainer = eleContainer || document;
	var funGetSelectTxt = function() {
		var txt = "";
		if(document.selection) {
			txt = document.selection.createRange().text;	// IE
		} else {
			txt = document.getSelection();
		}
		return txt.toString();
	};
	eleContainer.onmouseup = function(e) {
		e = e || window.event;
		var txt = funGetSelectTxt(), sh = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
		var left = (e.clientX - 40 < 0) ? e.clientX + 20 : e.clientX - 40, top = (e.clientY - 40 < 0) ? e.clientY + sh + 20 : e.clientY + sh - 40;
		if (txt) {
			eleShare.style.display = "inline";
			eleShare.style.left = left + "px";
			eleShare.style.top = top + "px";
		} else {
			eleShare.style.display = "none";
		}
	};
	eleShare.onclick = function() {
		var txt = funGetSelectTxt(), title = (eleTitle && eleTitle.innerHTML)? eleTitle.innerHTML : "未命名页面";
		if (txt) {
			window.open('http://v.t.sina.com.cn/share/share.php?title=' + txt + '→来自页面"' + title + '"的文字片段&url=' + window.location.href);
		}
	};
};
 

这个方法火狐下执行没有问题,在IE下却无法使用,通过调试发现IE下在鼠标弹起时执行顺序似乎是先执行onmouseup,再执行onclick,由于点击新浪的logo后,先执行onmouseup中的关于logo显示的代码,logo被重新显示时页面中曾经选中的文字将被清除,这时再执行onclick事件再判断if(txt)时就不会通过了

考虑在页面中加一个隐藏域,页面选中文字后将文字保存到隐藏域中,在执行onclick事件时不直接去取选中文字而是从隐藏域中获得,这样IE下也能使用这个方法了

 

<think> 我们要回答关于input元素的onMouseUp事件的使用及原理。根据引用内容,我们知道onMouseUp是鼠标事件之一,当鼠标按钮被按下后松开时触发。 参考引用[1]中对鼠标事件的描述:onMouseUp是“鼠标按下后,松开时激发的事件”。同时,引用[2]中提到了类似鼠标按下检测(Input.GetMouseButton(0))旋转操作,虽然是在Unity引擎中,但原理相似:检测鼠标状态并执行相应操作。 因此,我们可以这样组织回答: 1. 介绍onMouseUp事件:是什么,何时触发。 2. 在input元素上使用onMouseUp的方法(示例代码)。 3. 解释原理:事件触发机制(冒泡、捕获等可选,但重点在触发时机)。 4. 注意事项(例如,与onClick的关系,事件对象等)。 同时,按照系统指令: - 中文回答。 - 生成相关问题。 注意:我们引用的内容来自站内引用[1][2],但引用[2]是Unity引擎的API,与网页中的JavaScript事件略有不同,所以主要参考引用[1]中对事件的描述。 由于用户的问题集中在input元素,我们需要给出针对input元素的示例。 回答结构: 1. 解释onMouseUp事件 2. 使用方法(代码示例) 3. 触发机制 4. 注意事项 5. 相关问题 注意:引用标识放在引用内容的后面,如:[^1] </think> ### input元素onMouseUp事件详解 #### 1. 事件定义与触发机制 onMouseUp是鼠标事件之一,当用户在input元素上**按下鼠标按钮后松开**时触发[^1]。其触发需要满足两个条件: - 鼠标按钮在input元素区域内按下 - 鼠标按钮在任意位置松开(即使已移出input区域) 事件触发流程: 1. `onMouseDown` → 2. `onMouseMove`(可选) → 3. `onMouseUp` 当三者连续发生时,最终会触发`onClick`事件[^1]。 #### 2. 使用方法 ```html <!-- HTML内联方式 --> <input type="text" onmouseup="handleMouseUp()"> <!-- JS绑定方式 --> <input id="myInput" type="search"> <script> document.getElementById("myInput").onmouseup = function(event) { console.log("按钮释放位置: (" + event.clientX + "," + event.clientY + ")"); // 可访问event.target.value获取当前输入值 }; // 推荐使用addEventListener const inputEl = document.querySelector('#myInput'); inputEl.addEventListener('mouseup', (e) => { e.preventDefault(); // 阻止默认行为 alert(`已释放${e.button === 0 ? '左键' : '右键'}`); }); </script> ``` #### 3. 事件对象属性 通过事件参数可获取关键信息: ```javascript function handleMouseUp(e) { console.log("触发元素:", e.target.tagName); // INPUT console.log("按钮编码:", e.button); // 0-左键, 1-中键, 2-右键 console.log("坐标:", `屏幕(${e.screenX},${e.screenY}) 页面(${e.pageX},${e.pageY})`); } ``` #### 4. 应用场景 - 实现拖拽操作结束时的确认 - 自定义输入框的交互效果(如松开时验证格式) - 配合`onMouseDown`记录操作时长 - 手势操作结束时的回调处理 #### 5. 注意事项 1. 与`onClick`区别:onClick需完整点击动作,onMouseUp只需释放动作 2. 事件冒泡:默认冒泡,可用`e.stopPropagation()`阻止 3. 表单提交:单独使用不会触发表单提交 4. 移动端兼容:在触摸设备上会转换为`touchend`事件 > 在React等框架中使用时需注意合成事件机制:`onMouseUp`需写为`onMouseUp`(驼峰命名)[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值