好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

检测是否为HTML5新标签

检测是否为HTML5新标签

HTML5新添加了许多语义标签与功能标签。虽然我们可以通过document.getElementById,document.getElementsByTagName选择到它们,但在复制节点时出现问题了。本该出现的innerHTML的地方,变成空字符串……

<!DOCTYPE HTML>

< html >

     < head >

         < title >cloneNode by 司徒正美</ title >

         < meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" >

         < script >

             window.onload = function(){

                 

                 alert(document.getElementById("ee").cloneNode(true).innerHTML);//IE678弹出空字符串

             }

         </ script >

     </ head >

     < body >

     < nav id = "ee" >111</ nav >

     </ body >

</ html >

因此我们要复制时,需要区别对待它们,这先决条件是怎么识别它们。

下面是个小测试,从各浏览器的日志的不同之处遴选方案:

window.onload = function (){

     var test = document.createElement( "nav" );

     console.log(test.outerHTML);

     console.log(test.tagName);

     console.log(Object.prototype.toString.call(test));

}

结果如下

IE9

日志: <!--?XML:NAMESPACE PREFIX = PUBLIC NS = "URN:COMPONENT" /--> < nav ></ nav >

日志: nav

日志: [object HTMLUnknownElement]

 

IE9的IE8模式

日志: <!--?XML:NAMESPACE PREFIX = PUBLIC NS = "URN:COMPONENT" /--> < nav ></ nav >

日志: nav

日志: [object Object]

 

IE9的IE7模式

日志: <!--?XML:NAMESPACE PREFIX = PUBLIC NS = "URN:COMPONENT" /--> < nav ></ nav >

日志: nav

日志: [object Object]

 

IE8

日志: <!--?XML:NAMESPACE PREFIX = PUBLIC NS = "URN:COMPONENT" /--> < nav ></ nav >

日志: nav

日志: [object Object]

 

 

IE7

日志: <!--?XML:NAMESPACE PREFIX = PUBLIC NS = "URN:COMPONENT" /--> < nav ></ nav >

日志: nav

日志: [object Object]

 

 

FF12

< nav ></ nav >

NAV

[object HTMLElement]

 

chrome18

< nav ></ nav >

NAV

[object HTMLElement]

 

opera11

< nav ></ nav >

NAV

[object HTMLElement]

 

safari5

< nav ></ nav >

NAV

[object HTMLElement]

有趣的是,如果搞了一个不是HTML5的新标签,opera,chrome, FF对元素的toString不约而同都是[object HTMLUnknownElement]。但我们这里只谈IE的情况,IE显然当作是插入一个XML元素了。因此我们只判定其有没有outerHTML(FF11才支持outerHTML),outerHTML是不是以“

下面是我框架复制节点的代码:

var div = document.createElement( "div" ); //缓存parser,防止反复创建

  function shimCloneNode( outerHTML, tree ) {

      tree.appendChild(div);

      div.innerHTML = outerHTML;

      tree.removeChild(div);

      return div.firstChild;

  }

  var unknownTag = "<?XML:NAMESPACE"

  function cloneNode( node, dataAndEvents, deepDataAndEvents ) {

      var bool //!undefined === true;

      //这个判定必须这么长:判定是否能克隆新标签,判定是否为元素节点, 判定是否为新标签

      if (!support.cloneHTML5 && node.outerHTML){ //延迟创建检测元素

          var outerHTML = document.createElement(node.nodeName).outerHTML;

          bool = outerHTML.indexOf( unknownTag ) // !0 === true;

      }

      var neo = !bool? shimCloneNode( node.outerHTML, document.documentElement ): node.cloneNode( true ), src, neos, i;

    //support.cloneHTML5: DOC.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",

    //……

}

有兴趣可以到 我的github 上转一转。

 

标签:  javascript ,  mass

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于检测是否为HTML5新标签的详细内容...

  阅读:41次