matchesSelector用来匹配dom元素是否匹配某css selector。它为一些高级方法的实现提供了基础支持,比如事件代理,parent, closest等。

W3C在2006年就提出了该方法草案,Firefox和Safari相继实现,比如

<div id="wraper" class="item"></div>
<script>
wraper.mozMatchesSelector('div') // true 标签选择器
wraper.mozMatchesSelector('#wraper') // true id选择器
wraper.mozMatchesSelector('.item') // true 类选择器
</script>

  

目前除IE6-IE8,Firefox/Chrome/Safari/Opera/IE 的最新版本均已实现,但方法都带上了各自的前缀

Chrome/Safari

Firefox

IE9+

可以用特性监测来获取一个统一接口API。如下

var matchesSelector = function() {
var body = document.body
return body.webkitMatchesSelector || body.msMatchesSelector || body.mozMatchesSelector || body.oMatchesSelector
}()

有几个细节

1.  优先使用body.webkitMatchesSelector webkit内核占有率最高,尤其国内国产浏览器的高速引擎是webkit

2.  这里没有优选获取body.matchesSelector,是因为该方法迄今尚未标准化

3.  2013年2月Opera放弃Presto转向Webkit,因此把body.oMatchesSelector放在了最后以兼容老版本的Opera

对于低版本的IE,如何实现该方法吗? 首先需要实现一个基本的CSS选择器,这里提供了一个常用选择器(id,class,tagName,attribute)的实现。

两种情况

1. 对于已经存在于页面里的DOM元素

function matches(el, selector) {
var parent = el.parentNode
var match = query(selector, parent)
var len = match.length
if (len) {
while (len--) {
if (match[len] == el) {
return true
}
}
return false
} else {
return false
}
}

存在于页面的DOM元素,必定有parentNode,紧接着在父节点里查找指定的selector,如果不存在返回false,如果存在还有过滤下,如果匹配的元素和传入的el是同一个元素则返回true。

2. 对于动态创建的元素,尚未添加到页面中

function matches(el, selector) {
var tempParent = document.createElement('div')
tempParent.appendChild(el)
match = query(selector, tempParent)
tempParent.removeChild(el)
return !!match.length
} var pp = document.createElement('p')
pp.id = 'pp'
pp.className = 'pp1'
pp.setAttribute('data-info', 'Jack')
pp.innerHTML = 'test' matches(pp, 'p') // true
matches(pp, '#pp') // true
matches(pp, '.pp1') // true
matches(pp, '[data-info=jack]') // true

此时该元素师没有父元素的,这里创建了一个临时的父元素,添加子元素后再把它删掉。剩余思路同上。

两种情况合并一起就完成了对IE9-版本浏览器的支持

function matches(el, selector) {
var parent = el.parentNode
var match = query(selector, parent)
var len = match.length if (parent) {
if (len) {
while (len--) {
if (match[len] == el) {
return true
}
}
return false
} else {
return false
}
} else {
var parent = document.createElement('div')
parent.appendChild(el)
match = query(selector, parent)
parent.removeChild(el)
return !!match.length
}
}

最后是一个完成版本

var matchesSelector = function() {
var body = document.body
var w3cMatches = body.webkitMatchesSelector || body.msMatchesSelector || body.mozMatchesSelector || body.oMatchesSelector function matches(el, selector) {
return w3cMatches.call(el, selector)
} function lowIEMatches(el, selector) {
var parent = el.parentNode
var match = query(selector, parent)
var len = match.length if (parent) {
if (len) {
while (len--) {
if (match[len] == el) {
return true
}
}
return false
} else {
return false
}
} else {
var parent = document.createElement('div')
parent.appendChild(el)
match = query(selector, parent)
parent.removeChild(el)
return !!match.length
}
} return w3cMatches ? matches : lowIEMatches
}()

  

相关:

http://dev.w3.org/2006/webapi/selectors-api2/#matchtesting

https://developer.mozilla.org/zh-CN/docs/Web/API/Element.matches

http://msdn.microsoft.com/en-us/library/ie/ff975201(v=vs.85).aspx

matchesSelector及低版本IE中对该方法的实现的更多相关文章

  1. Android 低版本sdk中没有getSupportedPreviewSizes和getSupportedPictureSizes函数怎么办?

    在做camera和SurfaceView做摄像头程序时,需要获取camera支持的相片大小,在低版本sdk中没有getSupportedPictureSizes函数,怎么办呢,请参阅下面的关键代码: ...

  2. popstate事件在低版本webkit中的调用

    popstate是H5的history系列中的事件,但是在低版本的webkit中会自动触发.H5中的history api是不会使页面发生跳转的,只是操作地址栏和响应的state属性而已,而且是手动操 ...

  3. js动态加载activeX控件在IE11与低版本IE中的差异

    由于IE11更加遵循W3C规范,所以IE11与低版本IE在加载activeX时有差别. 1.IE11中动态加载activeX的顺序 var objectTag = document.createEle ...

  4. 高版本 MySQL 导出的脚本到低版本 MySQL 中执行时报错

    导入 MySQL 脚本时报错:[ERR] 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'低版本还不支持 utfmb4 这个字符集 解决方法:将 sql 脚 ...

  5. js中的bind方法的实现方法

    js中目前我遇见的改变作用域的5中方法:call, apply, eval, with, bind. var obj = { color: 'green' } function demo () { c ...

  6. 解决backgroud:transparent在低版本浏览器中的bug

    今天在html页面上定义了一个button和一个div,大小相同,button使用绝对定位,覆盖在div上面一层,同时样式设置背景透明(background:transparent). 这样就可以在看 ...

  7. SQL Server 临时禁用和启用所有外键约束(高版本向低版本迁移数据)

    --获得禁用所有外键约束的语句 select 'ALTER TABLE [' + b.name + '] NOCHECK CONSTRAINT ' + a.name +';' as 禁用约束 from ...

  8. Highcharts 在低版本 IE 上使用注意事项及个人总结

    很多人经常遇到图表在主流浏览器上运行正常,在低版本IE(包括IE6.IE7.IE8等)下运行出错(图表显示不出来或显示不正常)的情况,这不是兼容性问题,而是 IE 浏览器自身的一些限制,我们只需要注意 ...

  9. Highcharts 在低版本 IE 上使用注意事项

    来源:https://segmentfault.com/a/1190000004272693 很多人经常遇到图表在主流浏览器上运行正常,在低版本IE(包括IE6.IE7.IE8等)下运行出错(图表显示 ...

随机推荐

  1. php配合jquery实现增删操作

    后台使用php,前台引用jquery,实现增删操作,代码如下: <script type="text/javascript" src="http://keleyi. ...

  2. jquery实现智能表单

    现在很多网站的注册模块都可以实现即时检查格式是否正确,这样极大的增强了用户体验,对开发非常有利. 下面的代码是利用jquery实现了对一个表单字段格式的即时检查(包括字段长度.邮箱格式),同时在提交时 ...

  3. DIV嵌套垂直居中

    第一记住一点:父级相对定位,子级绝对定位 下面演示CSS样式: .父级DIV{ margin:0px auto; position:relative; border:2px solid #ff0000 ...

  4. 与众不同 windows phone (50) - 8.1 新增控件: PickerFlyout, ListPickerFlyout

    [源码下载] 与众不同 windows phone (50) - 8.1 新增控件: PickerFlyout, ListPickerFlyout 作者:webabcd 介绍与众不同 windows ...

  5. JavaScript常用代码

       页面的按钮全选:   function CheckBoxAll() {             //得到页面上所有input表单元素:document.getElementsByTagName( ...

  6. SignalR-支持平台

    1.支持的服务器操作系统: SignalR 服务器组件可以驻留在下列服务器或客户端操作系统.请注意, SignalR 使用 Websocket,为 Windows Server 2012 或 Wind ...

  7. 最小生成树Kruskal算法(邻接矩阵和邻接表)

    最小生成树,克鲁斯卡尔算法. 算法简述: 将每个顶点看成一个图. 在所有图中找权值最小的边.将这条边的两个图连成一个图, 重复上一步.直到只剩一个图. 注:将abcdef每个顶点看成一个图.将最小权值 ...

  8. ahjesus C# 4.0 Parallel 并行运算

    Parallel.For - for 循环的并行运算 Parallel.ForEach - foreach 循环的并行运算 Parallel.Invoke - 并行调用多个任务 Task - 任务,基 ...

  9. ahjesus解决win下U盘无法写入的问题

    可能是由于不同品牌的U盘出厂时磁盘分区和格式化方式不同而引起的兼容性问题.解决方案如下 启动cmd.输入diskpart,启动DISKPART工具 在DISKPART窗口中输入以下命令: >li ...

  10. 从Android系统出发,分析Android控件构架

    从Android系统出发,分析Android控件构架 Android中所有的控件追溯到根源,就是View 和ViewGroup,相信这个大家都知道,但是大家也许会不太清楚它们之间的具体关系是什么,在A ...