zoukankan      html  css  js  c++  java
  • javascript contains方法

    IE有许多好用的方法,后来都被其他浏览器抄袭了,比如这个contains方法。如果A元素包含B元素,则返回true,否则false。唯一不支持这个方法的是IE的死对头firefox。

    不过火狐支持compareDocumentPosition() 方法,这是W3C制定的方法,标准浏览器都支持,不过实用性性很差,因此没有什么人用,推广不开来。它的使用形式与contains差不多,但返回的不是一个布尔值,而是一个很奇怪的数值,它是通过如下方式累加计算出来的:

    Bits Number Meaning
    0000000元素一致
    0000011节点在不同的文档(或者一个在文档之外)
    0000102节点 B 在节点 A 之前
    0001004节点 A 在节点 B 之前
    0010008节点 B 包含节点 A
    01000016节点 A 包含节点 B
    100000 32浏览器的私有使用

    PPK给出如下解决方法。

     if (window.Node && Node.prototype && !Node.prototype.contains){
        Node.prototype.contains = function (arg) {
          return !!(this.compareDocumentPosition(arg) & 16)
        }
      }
    

    我搞出个更短的:

      if(!!window.find){
        HTMLElement.prototype.contains = function(B){
          return this.compareDocumentPosition(B) - 19 > 0
        }
      }
    

       //2011.9.24 by 司徒正美 
               var contains  = function(root, el) {
                    if (root.compareDocumentPosition)
                        return root === el || !!(root.compareDocumentPosition(el) & 16);
                    if (root.contains && el.nodeType === 1){
                        return root.contains(el) && root !== el;
                    }
                    while ((el = el.parentNode))
                        if (el === root) return true;
                    return false;
                }
    
       //2013.1.24 by 司徒正美 
                    function contains(parentEl, el, container) {
                // 第一个节点是否包含第二个节点
               //contains 方法支持情况:chrome+ firefox9+ ie5+, opera9.64+(估计从9.0+),safari5.1.7+
    		if (parentEl == el) {
    			return true;
    		}
    		if (!el || !el.nodeType || el.nodeType != 1) {
    			return false;
    		}
    		if (parentEl.contains ) {
    			return parentEl.contains(el);
    		}
    		if ( parentEl.compareDocumentPosition ) {
    			return !!(parentEl.compareDocumentPosition(el) & 16);
    		}
    		var prEl = el.parentNode;
    		while(prEl && prEl != container) {
    			if (prEl == parentEl)
    				return true;
    			prEl = prEl.parentNode;
    		}
    		return false;
    	}
    
  • 相关阅读:
    ASP.NET Core 2.2 : 二十七. JWT与用户授权(细化到Action)
    ASP.NET Core 2.2 : 二十六. 应用JWT进行用户认证及Token的刷新
    ASP.NET Core 发布到Linux需要注意的地方
    小程序根据数字做for循环
    Visual Studio 2019 正式版 更新内容
    CodeSmith 二、多模板按目录树批量自动生成代码
    CodeSmith 一、连接Mysql
    ASP.NET Core 2.2 十九. Action参数的映射与模型绑定
    ASP.NET Core 2.2 十八.各种Filter的内部处理机制及执行顺序
    ASP.NET Core 2.2 : 十七.Action的执行(Endpoint.RequestDelegate后面的故事)
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/1583523.html
Copyright © 2011-2022 走看看