`
Kenny.Lee
  • 浏览: 514855 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

判断鼠标点击事件是否在某元素之上(万恶的srcElement)

阅读更多
本来event.target用得好好的,结果IE不支持,只有一个event.srcElement.

但是这两者只有区别的,target的话可以准确定位到事件触发的元素,顾名思义是目标嘛。

而srcElement有时却不尽人意,比方说有些情况是TABLE注册了事件,然后当事件触发时再用event对象来获取触发事件的Element,获取Element后再做逻辑判断来调用其他业务操作。

在这种比较复杂的情况之下往往很容易出现Element混淆的情况(指srcElement),拿到的不是目标事件的对象,而是注册事件的TABLE。如果是自己写的JavaScript还好,但如果不是的话,往往比较麻烦了,因为改动越多,就越有可能产生BUG。

无奈之下只好看看有没有办法解决IE下的这个问题。

想到的解决办法有两个。

1、用坐标解决,即判断目标元素的坐标范围和事件的鼠标坐标进行匹配。

2、在目标元素上添加onclick事件。

首先试了下第二种方法,结果也是为未能解决,原因是原来代码的业务问题,事件太多被其他事件覆盖或者混淆之类。所以只好跑回直接直观的第一种方法之上,虽然个人不太喜欢,因为比较土,但也没办法了。谁叫IE也是那么土。

具体代码如下:

var isClickEL = function(el){
    if(!isIE()||!el)return false;
    var coords = getCoords(el);
    var elTop = coords.top;
    var elBottom = 0;
    var elLeft = coords.left;
    var elRight = 0;
    var elHeight = el.offsetHeight;
    var elWidth = el.offsetWidth;
    elBottom = elTop + elHeight;
    elRight = elLeft + elWidth;
   
    var ev =  window.event;
    if(!ev)return false;
    var mouseX = ev.clientX;
    var mouseY = ev.clientY;

    var isInTheWidth = (mouseX>=elLeft && mouseX<=elRight);
    var isInTheHeight = (mouseY>=elTop && mouseY<=elBottom);
   
    return (isInTheWidth && isInTheHeight);
}

var getCoords = function(el){
   var box = el.getBoundingClientRect(),
   isQuirk = (document.documentMode) ? (document.documentMode==5) ? true : false : ((document.compatMode=="CSS1Compat") ? false : true),
   doc = el.ownerDocument,
   body = doc.body,
   html = doc.documentElement,
   clientTop = html.clientTop || body.clientTop || 0,
   clientLeft = html.clientLeft || body.clientLeft || 0,
   top  = box.top  + (self.pageYOffset || !isQuirk && html.scrollTop  ||  body.scrollTop ) - clientTop,
   left = box.left + (self.pageXOffset || !isQuirk && html.scrollLeft ||  body.scrollLeft) - clientLeft;
   return { top: top, left: left };
 };


getCoords方法是网上看到的,觉得还不错。而在坐标方面没有太精确,例如边框大小像素之类的,因为也不需要太精确。
1
0
分享到:
评论
1 楼 20.Shadow 2009-11-03  
这个确实很麻烦

可以考虑用自定义的property来判断,例如定义一个myProperty,再在js里面去判断,间接来判断是否是你想要点击的元素

相关推荐

    判断事件是不是发生在某组件中的 JS 函数

    这种情况下,我们就需要用到判断事件是否发生在某组件中的JS函数。以下将详细介绍如何实现这一功能。 首先,我们需要获取浏览器信息,因为不同的浏览器处理事件的方式可能有所不同。在提供的代码中,创建了一个名为...

    如何判断鼠标是否在DIV的区域内

    这种方法利用了浏览器的`event.clientX`和`event.clientY`属性来获取鼠标当前的屏幕坐标,然后遍历页面上的所有子元素,判断鼠标坐标是否在每个元素的边界范围内。以下是一个实现示例: ```javascript function ...

    鼠标拖动事件应用

    通过这个过程,用户可以点击并拖动页面上的某个元素,并在释放鼠标时显示关于该元素的一些属性信息。这种交互方式常见于桌面应用程序(如WinForms),但在网页环境中同样具有实用价值,尤其是在提高用户体验方面。 ...

    event和srcElement说明,方法,技巧

    可以使用`event.srcElement.firstChild`或`event.srcElement.lastChild`来获取触发事件元素的第一个或最后一个子元素。此外,还可以使用`event.srcElement.children[i]`或`event.srcElement.childNodes[i]`来访问...

    JavaScript判断按钮被点击的方法

    我们可以在一个父元素上设置事件监听器,根据事件的目标元素(event.target)来判断是哪个子元素触发了事件,从而减少事件监听器的数量并提高性能。 总的来说,JavaScript中的事件处理是前端开发的一个基础知识点,...

    VC++实现WebBrowser控件中获取鼠标点击事件和超链接

    在本文中,我们将探讨如何在MFC(Microsoft Foundation Classes)框架下使用VC++实现WebBrowser控件,以及如何处理鼠标点击事件和获取超链接。 首先,创建一个基于对话框的MFC应用程序,然后将WebBrowser控件添加到...

    js事件源window.event.srcElement兼容性写法(详解)

    例如,当你想要页面中所有输入框对点击事件做出响应时,不需要为每个输入框单独绑定事件,而是可以直接在body上绑定,然后在事件处理函数中通过event.srcElement.tagName来判断用户点击的是否是你想要的元素。...

    VUE中v-on:click事件中获取当前dom元素的代码

    在Vue中处理点击事件时,我们常常需要获取被点击的DOM元素或者事件对象,以进行进一步的操作或数据处理。 在上述提供的内容中,我们可以了解到如何在v-on:click事件处理器中获取当前的DOM元素。关键点在于传递$...

    JS实现的表格行鼠标点击高亮效果代码

    4. 事件委托的应用:在表格元素上直接绑定事件监听器,并利用事件冒泡原理处理其子元素的事件。这种方法可以减少事件监听器的数量,提高程序的性能和可维护性。 5. 兼容性问题:文档中特别提到所给代码“仅IE有效”...

    js-event事件

    这种方式利用了事件冒泡机制,当子元素上的事件发生时,会冒泡到父元素,因此可以在父元素上处理这些事件。 #### 六、高级Event对象 除了基本的`Event`对象外,还有几个扩展的Event对象,如`UIEvent`、`MouseEvent`...

    js中的触发事件对象event.srcElement与event.target详解

    event对象中包含多个属性,其中event.srcElement和event.target是两个用来获取触发事件元素的属性。在不同的浏览器中,这两个属性的支持情况是有所差异的。例如,在IE浏览器中,事件对象包含srcElement属性,而在...

    window.event.srcElement 得到事件源对象

    只要在外层上写一个 然后检查event.srcElement.tagName或其他属性是不是你想要的来决定是否响应事件就可以了.不过好像event.srcElement在ff里不起作用 比如 span div event对象指当前触发的事件对象, window.event...

    javascript事件详解

    在JavaScript中,事件是用户或浏览器对网页进行操作时触发的特定动作,比如点击按钮、鼠标移动等。本文将详细介绍JavaScript事件,包括异步事件处理、事件阶段以及事件对象。 1. 异步事件处理 JavaScript不支持多...

    js 鼠标事件的抓取

    在Web开发中,鼠标事件是非常常见且重要的交互方式之一。合理地使用鼠标事件能够极大地提升用户体验,并为用户提供更丰富的交互功能。本文将详细介绍如何在JavaScript中实现鼠标事件的抓取,并提供一段示例代码进行...

    event事件的使用及说明

    【事件(event)】在Web开发中,事件是用户与网页交互的关键部分,它允许JavaScript响应用户的操作,如点击按钮、滚动页面或者填写表单。HTML DOM Event对象是JavaScript处理事件的核心,它代表了事件的状态,包括事件...

    javascript 常用方法及技巧

    事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcElement.releaseCapture(); 事件按键 event.keyCode event.shiftKey event.altKey event....

    event.srcElement 用法笔记e.target

    此外,`event.srcElement`还可以用于获取触发事件元素的各种属性,如ID、标签名、类型、值、名称和类名等。下面的示例展示了如何获取这些属性: ```javascript function Get_srcElement() { var srcElement = ""; ...

    用javascript获取当页面上鼠标光标位置和触发事件的对象的代码

    在本文中,我们将探讨如何使用 JavaScript 获取鼠标在页面上的位置以及触发事件的对象。 首先,让我们关注如何获取鼠标的位置。JavaScript 提供了 `event` 对象来处理各种用户事件,包括鼠标移动。在以下的代码片段...

Global site tag (gtag.js) - Google Analytics