matchesSelector及低版本IE中对该方法的实现

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

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

?





1

2

3

4

5

6

<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。如下

?





1

2

3

4

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元素

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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. 对于动态创建的元素,尚未添加到页面中

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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-版本浏览器的支持

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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  

    }

}

最后是一个完成版本

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

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中对该方法的实现,布布扣,bubuko.com

时间: 2024-10-13 12:18:42

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

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

在做camera和SurfaceView做摄像头程序时,需要获取camera支持的相片大小,在低版本sdk中没有getSupportedPictureSizes函数,怎么办呢,请参阅下面的关键代码: 1.定义Size类 public class Size { /*** * Sets the dimensions for pictures. * * @param w the photo width (pixels) * @param h the photo height (pixels) */ p

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

由于IE11更加遵循W3C规范,所以IE11与低版本IE在加载activeX时有差别. 1.IE11中动态加载activeX的顺序 var objectTag = document.createElement("object"); objectTag.style.height = XPlayPluginDivHeight + "px"; objectTag.style.width = XPlayPluginDivWidth + "px"; obj

高版本数据库数据附加到低版本数据库中的解决方案

首先, 找一台装有SQL Server 2008的电脑, 将你的数据库文件附加到这台电脑里.附加成功后, 在SSMS的对象资源管理器窗口右键单击刚刚附加的数据库,依次选"任务>生成脚本...", 此时会弹出脚本向导对话框.点"下一步".在"选择数据库"对话框选中刚刚附加的数据库, 同时将底部的"为所选数据库中的所有对象编写脚本"打勾. 点下一步.在"选择脚本选项"对话框中,还需要修改以下几个选项:1)

Java中String.equals()方法的实现代码

java中String类里的String.equals()方法: 源代码: public boolean equals(Object anObject) { //如果是同一个对象 if (this == anObject) { return true; } //如果传递进来的参数是String类的实例 if (anObject instanceof String) { String anotherString = (String)anObject; int n = count;//字符串长度 i

Java String类中CaseInsensitiveComparator.compare()方法的实现

String对象的大小写不敏感比较方法的实现如下: 1 public int compare(String s1, String s2) { 2 int n1 = s1.length(); 3 int n2 = s2.length(); 4 int min = Math.min(n1, n2); 5 for (int i = 0; i < min; i++) { 6 char c1 = s1.charAt(i); 7 char c2 = s2.charAt(i); 8 if (c1 != c2)

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

很多人经常遇到图表在主流浏览器上运行正常,在低版本IE(包括IE6.IE7.IE8等)下运行出错(图表显示不出来或显示不正常)的情况,这不是兼容性问题,而是 IE 浏览器自身的一些限制,我们只需要注意一些事项即可避免这种情况. 注意事项: 1.使用合适的HTML 文档模式 html 文档模式指的是文件的第一行 <!DOCTYPE> 在低版本 IE 中请使用 HTML 4 严格模式 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN&

sql server实现高版本向低版本兼容

用的是sql server2014要然后现在要将2014数据库的数据放到2012中操作如: 一,先用2014的数据库导出表结构和数据: 选择需要导出的数据 右键---任务---生成脚本 ---根据下面截图进行操作---点击确认后选择在新窗口显示最后一直下一步到最后. 二,在低版本数据库中新建一个新的数据库,将到出来的脚本直接在新建的数据库中跑即可.

SQLServer笔记--如何把SQLServer数据库从高版本降级到低版本?

方法一:使用图形化操作(GUI),打开SSMS(SQL Server Management Studio) 第一步:右键你要降级的数据库,按下图选择: 第二步:在对话框中的[高级]中按如下方式设置. 第三步:把脚本保存起来,然后在低版本的SQLServer中运行脚本. 打开低版本SQLServer数据库,连接上数据库,双击脚本即可运行.或者把脚本拖到数据库的查询分析器界面([新建查询]中粘贴脚本代码即可),然后点运行. 第四步:在高版本的SQLServer中通过[任务]→[导入数据],将数据从高

SqlServer高版本数据本分还原到低版本方法

最近遇见一个问题: 想要将Sqlserver高版本备份的数据还原到低版本SqlServer上去,但是这在SqlServer中是没法直接还原数据库的,所以经过一系列的请教总结出来一下可用方法. 首先.你得在电脑上装有你将要操作的高版本以及低版本的SqlServer或者你能够连上SqlServer高版本所在的数据库(便于后面拷贝数据), 第二步.打开高版本数据库中你需要备份的数据库,将你备份的数据库相关的登录名或者用户删除.右键数据库->任务->生成脚本.在生成脚本的“选择对象”步骤选择“编写整个