欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

源碼解讀jQ中瀏覽器兼容模塊support第1/2頁(yè)

 更新時(shí)間:2016年08月01日 12:04:21   投稿:daisy  
jquery support主要是檢測(cè)瀏覽器兼容性,支持力度的方法,用于展示不同瀏覽器各自特性和bug的屬性集合。作為一個(gè)靜態(tài)成員,提供給jquery內(nèi)部函數(shù),告訴他們某些功能是否能用。避免了以往通過(guò)檢測(cè)瀏覽器版本做修改。下面我們通過(guò)源碼詳細(xì)解讀jQ中瀏覽器兼容模塊support。

前言

jQuery的屬性support是判斷瀏覽器之間是否兼容的模塊 ,該模塊包含了leadingWhitespace,tbody,htmlSerialize,style,hrefNormalized,opacity,cssFloat,checkOn,optSelected,getSetAttribute….等兼容問(wèn)題,所有的這些屬性也只是jQuery內(nèi)部會(huì)用到,因?yàn)閖Q內(nèi)部一些模塊需要對(duì)這些東西進(jìn)行判斷, 就直接寫成了一個(gè)support模塊, 可以供我們, 但是我們寫代碼的時(shí)基本都沒用到啊,

今天再把這些玩意兒過(guò)一下, 測(cè)試的瀏覽器為FF,CHROME,IE11, IE6-IE10是用IE11模擬的:

$.support.leadingWhitespace  ———— IE中自動(dòng)去空格

$.support.checkOn   —-chrome中radio默認(rèn)值為checkOn

$.support.tbody  —-IE通過(guò)innerHTML自動(dòng)生成tbody

$.support.htmlSerialize —–  標(biāo)準(zhǔn)瀏覽器會(huì)自動(dòng)生成link標(biāo)簽

$.support.style  —-IE67中g(shù)etAttriute會(huì)獲取各種類型的數(shù)據(jù)….

$.support.opacity  —- IE678不支持opacity

$.support.cssFloat   —-cssFloat標(biāo)準(zhǔn)瀏覽器支持的,IE要用styleFloat

$.support.optSelected  —–瀏覽器并不會(huì)設(shè)置默認(rèn)的option

$.support.getSetAttribute  —-getSetAttribute在瀏覽器之間的兼容

$.support.html5Clone   —- 復(fù)制標(biāo)簽的問(wèn)題

$.support.boxModel  —- 是否支持盒模型

$.support.submitBubbles  —-冒泡

$.support.changeBubbles  —-冒泡

$.support.focusinBubbles  —-冒泡

$.support.deleteExpando   —–IE的DOM元素是COM組件, 不能delete組件的屬性

$.support.noCloneEvent   —-復(fù)制元素的事件

$.support.reliableHiddenOffsets   —-table元素中tr內(nèi)td的問(wèn)題;

$.support.boxSizing  —是否支持boxSizing

$.support.doesNotIncludeMarginInBodyOffset  —-body不會(huì)包含margin的問(wèn)題(算不算問(wèn)題呢?)

$.support.pixelPosition   —-獲取樣式返回的是否是像素值

$.support.boxSizingReliable  —-boxSizing是否可用

$.support.reliableMarginRight    —-chrome中margin的bug

$.support.inlineBlockNeedsLayout    —-IE中l(wèi)ayout的問(wèn)題

$.support.shrinkWrapBlocks    —-IE6中自動(dòng)擴(kuò)大寬高的問(wèn)題

$.support.leadingWhitespace屬性

<html>
  <head>
    <meta charset="utf-8" />
    <title>兼容</title>
  </head>
  <body>
    <script type="text/javascript">

      window.l = (function() {
        var el = document.createElement("div"), index = 0;
        el.style.cssText = "padding:10px;position:fixed;top:0;right:0;width:10%;border:1px solid #f00;";
        return function(message) {
          if( message ) {
            var span = document.createElement("span");
            span.innerHTML = (++index) + "信息:<br>"+ message+"<br>";
            el.appendChild( span );
          };
          //IE低版本直接通過(guò)createElement創(chuàng)建的元素有parentNode;
          if( !el.parentNode || (el.parentNode.toString() === "[object]") ) {
            document.body.appendChild(el);
          };
          return l;
        };
      })();

    </script>
    IE678中自動(dòng)過(guò)濾了元素前后的空格,
    而且空格不包含在childNodes里面,
    <script type="text/javascript">
      var el = document.createElement("div");
      el.innerHTML = " <div id=\"null\"> </div> ";
      l(el.childNodes.length);
    </script>
  </body>
</html>

標(biāo)準(zhǔn)瀏覽器中是遵守用戶輸入, el應(yīng)該包含三個(gè)節(jié)點(diǎn) :["", "<div id=\"null\"> </div>", ""]節(jié)點(diǎn);

IE678中卻只有1個(gè)節(jié)點(diǎn), 這個(gè)節(jié)點(diǎn)就是那個(gè)DIV:

$.support.checkOn屬性

標(biāo)準(zhǔn)瀏覽器中的checkbox默認(rèn)value為”on”,IE5678也都是”on”, 但是在某些webkit中checkbox的值默認(rèn)為”"字符串,現(xiàn)在的瀏覽器版本都很高了, 基本沒有這個(gè)問(wèn)題, 如果你有chrome低版本的話可以用下面這個(gè)demo測(cè)試看看有沒有問(wèn)題:

<html>
  <head>
    <meta charset="utf-8" />
    <title>兼容</title>
  </head>
  <body>
    <script type="text/javascript">

      window.l = (function() {
        var el = document.createElement("div"), index = 0;
        el.style.cssText = "padding:10px;position:fixed;top:0;right:0;width:10%;border:1px solid #f00;";
        return function(message) {
          message = message.toString();
          if( message ) {
            var span = document.createElement("span");
            span.innerHTML = (++index) + "信息:<br>"+ message+"<br>";
            el.appendChild( span );
          };
          //IE低版本直接通過(guò)createElement創(chuàng)建的元素有parentNode;
          if( !el.parentNode || (el.parentNode.toString() === "[object]") ) {
            document.body.appendChild(el);
          };
          return l;
        };
      })();

    </script>
    <input id="ck" type='checkbox'/>
    <script type="text/javascript">
      var el = document.getElementById("ck");
      //標(biāo)準(zhǔn)瀏覽器有change事件;
      el.onchange = function() {
        l(el.value);
        l(ck.checked)
      }
      //IE中的萬(wàn)能事件propertychange;
      el.onpropertychange = function() {
        l(el.value);
        l(ck.checked)
      }
      l(el.value);
    </script>
  </body>
</html>

$.support.tbody屬性

在IE6和IE7中新建table會(huì)自動(dòng)創(chuàng)建tbody元素;

如果我們?yōu)閯?chuàng)建的table添加tr或者添加td, 那么所有的瀏覽器都會(huì)自動(dòng)創(chuàng)建tbody;

如果是動(dòng)態(tài)創(chuàng)建的table和tr,把tr添加到tbody中,那么tbod根本不會(huì)出來(lái), 所有瀏覽器都遵循開發(fā)者的操作(瀏覽器的心思真的不好猜測(cè)啊)

<html>
  <head>
    <meta charset="utf-8" />
    <title>兼容</title>
  </head>
  <body>
    <script type="text/javascript">

      window.l = (function() {
        var el = document.createElement("div"), index = 0;
        el.style.cssText = "padding:10px;position:fixed;top:0;right:0;width:10%;border:1px solid #f00;";
        return function(message) {
          message = message.toString();
          if( message ) {
            var span = document.createElement("span");
            span.innerHTML = (++index) + "信息:<br>"+ message+"<br>";
            el.appendChild( span );
          };
          //IE低版本直接通過(guò)createElement創(chuàng)建的元素有parentNode;
          if( !el.parentNode || (el.parentNode.toString() === "[object]") ) {
            document.body.appendChild(el);
          };
          return l;
        };
      })();

    </script>
    <div id="tb"></div>
    <div id="tb2"></div>
    <div id="tb3"></div>
    <script type="text/javascript">
      var el = document.getElementById("tb");
      el.innerHTML = "<table></table>"
      //IE67中會(huì)輸出1, 標(biāo)準(zhǔn)瀏覽器遵循用戶輸入,不會(huì)是自動(dòng)生成tbody,所以tobdy的length是0
      l(el.getElementsByTagName("tbody").length);
    </script>
    <script>
      var el = document.getElementById("tb2");
      el.innerHTML="<table><tr>111</tr></table>";
      //無(wú)論是標(biāo)準(zhǔn)還是IE67都會(huì)自動(dòng)生成tbody標(biāo)簽
      l(el.getElementsByTagName("tbody").length);
    </script>
    <script>
      var el = document.getElementById("tb3");
      el.innerHTML="<table><td>111</td></table>";
      //無(wú)論是標(biāo)準(zhǔn)還是IE67都會(huì)自動(dòng)生成tbody標(biāo)簽
      l(el.getElementsByTagName("tbody").length);
    </script>
    <script>
      var tb = document.createElement("table");
      var tr = document.createElement("tr");
      tr.innerHTML = "trtrtr";
      tb.appendChild(tr);
      document.getElementsByTagName("body")[0].appendChild(tb);
    </script>
  </body>
</html>

代碼執(zhí)行完畢以后你會(huì)看到, 當(dāng)table里沒有元素的時(shí)候, chrome沒有自動(dòng)產(chǎn)生tbody, 如果你不按照正常的寫法寫table, 而是這樣

"<table><tr>111</tr></table>";

產(chǎn)生的HTML變成這樣”111<table><tr></tr></table>“,  在jQ中你這樣寫$(“<table><tr>111</tr></table>”), 生成的HTML也是這樣的["111","<table><tr></tr></table>"],所以再三強(qiáng)調(diào)寫html標(biāo)簽的嵌套要符合標(biāo)準(zhǔn)….

在IE中又是例外一回事,通過(guò)innerHTML的方式會(huì)自動(dòng)添加tbody, 而且你標(biāo)簽嵌套錯(cuò)了他也不管你,通過(guò)appendChild的方式跟其他瀏覽器一樣不會(huì)主動(dòng)生成tbody;

$.support.htmlSerialize

IE678瀏覽器中不能夠通過(guò)innerHTML動(dòng)態(tài)生成link標(biāo)簽, 要通過(guò)新建標(biāo)簽的形式創(chuàng)建:

<html>
  <head>
    <meta charset="utf-8" />
    <title>兼容</title>
  </head>
  <body>
    <script type="text/javascript">

      window.l = (function() {
        var el = document.createElement("div"), index = 0;
        el.style.cssText = "padding:10px;position:fixed;top:0;right:0;width:10%;border:1px solid #f00;";
        return function(message) {
          message = message.toString();
          if( message ) {
            var span = document.createElement("span");
            span.innerHTML = (++index) + "信息:<br>"+ message+"<br>";
            el.appendChild( span );
          };
          //IE低版本直接通過(guò)createElement創(chuàng)建的元素有parentNode;
          if( !el.parentNode || (el.parentNode.toString() === "[object]") ) {
            document.body.appendChild(el);
          };
          return l;
        };
      })();

    </script>
    <div class="bounce animated infinite">
      bounce
    </div>
    <div id="link"></div>
    <script type="text/javascript">
      var eLink = document.getElementById("link");
      eLink.innerHTML = '<link  rel="stylesheet">';
    </script>
  </body>
</html>

雖然link標(biāo)簽多數(shù)都可以通過(guò)innerHTML生成, 但是我們要通過(guò)innerHTML生成script標(biāo)簽是不可行的:

相關(guān)文章

  • 基于Jquery的動(dòng)態(tài)創(chuàng)建DOM元素的代碼

    基于Jquery的動(dòng)態(tài)創(chuàng)建DOM元素的代碼

    jquery動(dòng)態(tài)創(chuàng)建頁(yè)面元素,mark一下,以備以后查詢時(shí)使用。以創(chuàng)建div和input為例。
    2010-12-12
  • jQuery實(shí)現(xiàn)表單動(dòng)態(tài)添加與刪除數(shù)據(jù)操作示例

    jQuery實(shí)現(xiàn)表單動(dòng)態(tài)添加與刪除數(shù)據(jù)操作示例

    這篇文章主要介紹了jQuery實(shí)現(xiàn)表單動(dòng)態(tài)添加與刪除數(shù)據(jù)操作,涉及jQuery事件響應(yīng)及頁(yè)面元素動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-07-07
  • 淺析jQuery操作select控件的取值和設(shè)值

    淺析jQuery操作select控件的取值和設(shè)值

    本文主要實(shí)例淺析jQuery操作select控件取值和設(shè)值。有需要的朋友可以看下,希望會(huì)對(duì)大家有所幫助
    2016-12-12
  • 基于jquery的商品展示放大鏡

    基于jquery的商品展示放大鏡

    這兩天幫朋友的網(wǎng)站做個(gè)放大鏡,就是淘寶上的那種,兩個(gè)框,一個(gè)框放小圖,另外一個(gè)框放大圖。本來(lái)說(shuō)想從網(wǎng)上直接載一個(gè)拿來(lái)Hack,但是找好半天都沒有找到,看了看JQ的插件也好像不對(duì),干脆就自己寫了。
    2010-08-08
  • 基于jQuery實(shí)現(xiàn)的查看全文功能【實(shí)用】

    基于jQuery實(shí)現(xiàn)的查看全文功能【實(shí)用】

    本文分享了利用jQuery實(shí)現(xiàn)的查看全文功能:文本內(nèi)容少于四行,不顯示查看全文;超過(guò)五行時(shí)才顯示出來(lái)并有此功能;很實(shí)用,下面就跟小編一起來(lái)看看吧
    2016-12-12
  • jQuery表格(Table)基本操作實(shí)例分析

    jQuery表格(Table)基本操作實(shí)例分析

    這篇文章主要介紹了jQuery表格(Table)基本操作,結(jié)合實(shí)例形式分析了jQuery針對(duì)表格常見的樣式、屬性及增刪行等相關(guān)操作技巧,需要的朋友可以參考下
    2017-03-03
  • 基于jQuery實(shí)現(xiàn)的設(shè)置文本區(qū)域的光標(biāo)位置

    基于jQuery實(shí)現(xiàn)的設(shè)置文本區(qū)域的光標(biāo)位置

    之前做一個(gè)代碼提示的功能涉及到在文本框中插入文本的操作,需要獲得當(dāng)前光標(biāo)位置插入文本,本文章向大家介紹jQuery如何設(shè)置文本區(qū)域的光標(biāo)位置,需要的朋友可以參考一下
    2018-06-06
  • 推薦一款jQuery插件模板

    推薦一款jQuery插件模板

    這篇文章主要給大家推薦一款jQuery插件模板,這是本人最喜歡的一款了,原因很簡(jiǎn)單,使用方便,可選擇性也比較多。有需要的小伙伴參考下吧
    2015-01-01
  • 調(diào)用HttpHanlder的幾種返回方式小結(jié)

    調(diào)用HttpHanlder的幾種返回方式小結(jié)

    本篇文章主要是對(duì)調(diào)用HttpHanlder的幾種返回方式進(jìn)行了總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12
  • jQuery中wrapAll()方法用法實(shí)例

    jQuery中wrapAll()方法用法實(shí)例

    這篇文章主要介紹了jQuery中wrapAll()方法用法,實(shí)例分析了wrapAll()方法的功能、定義及匹配元素的使用技巧,需要的朋友可以參考下
    2015-01-01

最新評(píng)論