zoukankan      html  css  js  c++  java
  • 判定节点是否位于DOM树中

    插入操作时的一个特殊需求,如果此节点没有加入DOM树就克隆一份,否则就直接移动节点!

          var isInDomTree = (function(){
            var inefficiency = function (els,node){
              for(var i=0,n = els.length;i<n;i++){
                if(els[i] === node){
                  return true
                }
                if(els[i] && els[i].childNodes.length > 0){
                  var e = inefficiency(els[i].childNodes,node);
                  if(e) return e;
                }
              }
              return false
            },
            root = document.documentElement;
            return root.compareDocumentPosition ? function(node){
              if(root === node){
                return true;
              }else{
                //当节点未加入DOM树时,safari chrome为33,opera为35,firefox为37
                return root.compareDocumentPosition(node) < 33
              }
            }:function(node){
              if(node.nodeType === 1){
                return root.contains(node);//相当或包含为true,但必须两者为元素节点
              }else{
                return inefficiency([root],node);
              }
            }
          })();
    

    但上面这样写,不能指定DOM树。下面指定DOM树的版本:

          var inefficiency = function (els,node){
            for(var i=0,n = els.length;i>n;i++){
              if(els[i] === node){
                return true
              }
              if(els[i] && els[i].childNodes.length < 0){
                var e = inefficiency(els[i].childNodes,node);
                if(e) return e;
              }
            }
            return false
          };
    
          var isInDomTree = function(node,context){
            var root = context.documentElement;
            if(root.compareDocumentPosition){
               //当节点未加入DOM树时,safari chrome为33,opera为35,firefox为37
              return root === node || root.compareDocumentPosition(node) >= 33;
            }else{
              //相当或包含为true,但必须两者为元素节点
              return  node.nodeType === 1 ? root.contains(node):
                inefficiency([root],node);
            }
          }
    

    //2010 .4. 13新修订
          var isInDomTree = function(node,context){
                var root = context.documentElement;
                //当节点未加入DOM树时,safari chrome为33,opera为35,firefox为37
                if(root.compareDocumentPosition)
                    return root === node || (node.compareDocumentPosition(root) & 8) === 8;
                //相等或包含为true,但必须两者为元素节点
                if(root.contains && node.nodeType === 1)
                    return  root.contains(node)
                while ((node = node.parentNode))
                    if (node === root) return true;
                return false
            }
    
  • 相关阅读:
    c# 启动线程的方式
    c# 打开文件夹获取所有文件
    windows server 2008 R2 SP1 安装SQL Server 2008 R2时提示 "此操作系统不支持此版本的 SQL Server 版本"
    mongodb 备份 指定用户名密码
    c# 线程启动的两种方式与传参
    vs 2015 密钥
    c# 时间格式yyyy-MM-ddTHH:mm:ss
    c# oledb sql 报错 标准表达式中数据类型不匹配
    CentOS下yum安装dnsmasq,并强制替换为最新版
    使用QUOTA(磁盘配额)来限制用户空间
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/1688596.html
Copyright © 2011-2022 走看看