中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

淺析JavaScript中瀏覽器的兼容問題
來源:易賢網 閱讀:1050 次 日期:2016-07-08 09:47:35
溫馨提示:易賢網小編為您整理了“淺析JavaScript中瀏覽器的兼容問題”,方便廣大網友查閱!

下面小編就為大家帶來一篇淺析JavaScript中瀏覽器的兼容問題。小編覺得挺不錯的,現在分享給大家,也給大家做個參考

瀏覽器兼容性問題是在實際開發中容易忽略而又最重要的一部分。我們在講老版本瀏覽器兼容問題之前,首先要了解什么是能力檢測,它是來檢測瀏覽器有沒有這種能力,即判斷當前瀏覽器是否支持要調用的屬性或者方法。下面做了一些簡短的介紹。

1、innerText 和 innerContent

1)innerText 和 innerContent 的作用相同

2)innerText IE8之前的瀏覽器支持

3)innerContent 老版本的Firefox支持

4)新版本的瀏覽器兩種方式都支持

1 // 老版本瀏覽器兼容 innerText 和 innerContent

2 if (element.textContent) {

3    return element.textContent ;

4  } else {

5    return element.innerText;

6  }

2、獲取兄弟節點/元素的兼容性問題

 1)兄弟節點,所有瀏覽器都支持

①nextSibling 下一個兄弟節點,可能是非元素節點;會獲取到文本節點

②previousSibling  上一個兄弟節點,可能是非元素節點;會獲取到文本節點

 2)兄弟元素,IE8以前不支持

①previousElementSibling 獲取上一個緊鄰的兄弟元素,會忽略空白  

②nextElementSibling  獲取下一個緊鄰的兄弟元素,會忽略空白

//兼容瀏覽器

// 獲取下一個緊鄰的兄弟元素

function getNextElement(element) {

  // 能力檢測

 if(element.nextElementSibling) {

   return element.nextElementSibling;

  } else {

     var node = element.nextSibling;

     while(node && node.nodeType !== 1) {

         node = node.nextibling;

     }

     return node;

  }

 }

----------------------------------------------------------------------

/**

* 返回上一個元素

* @param element

* @returns {*}

*/

function getPreviousElement(element) {

  if(element.previousElementSibling) {

    return element.previousElementSibling;

  }else {

    var el = element.previousSibling;

    while(el && el.nodeType !== 1) {

      el = el.previousSibling;

      }

    return el;

  }

}

--------------------------------------------------------------------

/**

* 返回第一個元素firstElementChild的瀏覽器兼容

* @param parent

* @returns {*}

*/

function getFirstElement(parent) {

  if(parent.firstElementChild) {

    return parent.firstElementChild;

  }else {

    var el = parent.firstChild;

    while(el && el.nodeType !== 1) {

      el = el.nextSibling;

      }

    return el;

  }

}

---------------------------------------------------------------------

/**

* 返回最后一個元素

* @param parent

* @returns {*}

*/

function getLastElement(parent) {

  if(parent.lastElementChild) {

    return parent.lastElementChild;

  }else {

    var el = parent.lastChild;

    while(el && el.nodeType !== 1) {

      el = el.previousSibling;

      }

    return el;

  }

}

-------------------------------------------------------------------

/**

*獲取當前元素的所有兄弟元素

* @param element

* @returns {Array}

*/

function sibling(element) {

  if(!element) return ;

   

  var elements = [ ];

  var el = element.previousSibling;

  while(el) {

    if(el.nodeType === 1) {

      elements.push(el);

    }

    el = el.previousSibling;

  }

   el = element.previousSibling;

   while(el ) {

    if(el.nodeType === 1) {

      elements.push(el);

    }

    el = el.nextSibling;

  }

    return elements;

}

3、array.filter();   

 // 使用指定的函數測試所有元素,并創建一個包含所有通過測試的元素的新數組

// 兼容舊環境

if (!Array.prototype.filter)

{

 Array.prototype.filter = function(fun /*, thisArg */)

 {

  "use strict";

  if (this === void 0 || this === null)

   throw new TypeError();

  var t = Object(this);

  var len = t.length >>> 0;

  if (typeof fun !== "function")

   throw new TypeError();

  var res = [];

  var thisArg = arguments.length >= 2 ? arguments[1] : void 0;

  for (var i = 0; i < len; i++)

  {

   if (i in t)

   {

    var val = t[i];

    // NOTE: Technically this should Object.defineProperty at

    //    the next index, as push can be affected by

    //    properties on Object.prototype and Array.prototype.

    //    But that method's new, and collisions should be

    //    rare, so use the more-compatible alternative.

    if (fun.call(thisArg, val, i, t))

     res.push(val);

   }

  }

  return res;

 };

}

4、array.forEach();

// 遍歷數組

//兼容舊環境

// Production steps of ECMA-262, Edition 5, 15.4.4.18

// Reference: http://es5.github.io/#x15.4.4.18

if (!Array.prototype.forEach) {

 Array.prototype.forEach = function(callback, thisArg) {

  var T, k;

  if (this == null) {

   throw new TypeError(' this is null or not defined');

  }

  // 1. Let O be the result of calling toObject() passing the

  // |this| value as the argument.

  var O = Object(this);

  // 2. Let lenValue be the result of calling the Get() internal

  // method of O with the argument "length".

  // 3. Let len be toUint32(lenValue).

  var len = O.length >>> 0;

  // 4. If isCallable(callback) is false, throw a TypeError

  exception. // See: http://es5.github.com/#x9.11

  if (typeof callback !== "function") {

   throw new TypeError(callback + ' is not a function');

  }

  // 5. If thisArg was supplied, let T be thisArg; else let

  // T be undefined.

  if (arguments.length > 1) {

   T = thisArg;

  }

  // 6. Let k be 0

  k = 0;

  // 7. Repeat, while k < len

  while (k < len) {

   var kValue;

   // a. Let Pk be ToString(k).

   //  This is implicit for LHS operands of the in operator

   // b. Let kPresent be the result of calling the HasProperty

   //  internal method of O with argument Pk.

   //  This step can be combined with c

   // c. If kPresent is true, then

   if (k in O) {

    // i. Let kValue be the result of calling the Get internal

    // method of O with argument Pk.

    kValue = O[k];

    // ii. Call the Call internal method of callback with T as

    // the this value and argument list containing kValue, k, and O.

    callback.call(T, kValue, k, O);

   }

   // d. Increase k by 1.

   k++;

  }

  // 8. return undefined

 };

}

5、注冊事件

.addEventListener = function (type,listener,useCapture ) { }; 

//第一個參數 事件名稱 

//第二個參數 事件處理函數(監聽者) 

//第三個參數 true捕獲 false冒泡 

//IE9以后才支持 

// 兼容舊環境

var EventTools = {

    addEventListener: function (element, eventName, listener) {

      //能力檢測

      if(element.addEventListener) {

        element.addEventListener(eventName, listener,false);

      }else if(element.attachEvent) {

        element.attachEvent("on" + eventName, listener);

      }else{

        element["on" + eventName] = listener;

      }

    },

//  想要移除事件,不能使用匿名函數

    removeEventListener: function (element, eventName, listener) {

      if(element.removeEventListener) {

        element.removeEventListener(eventName,listener,false);

      }else if(element.detachEvent) { //IE8以前注冊.attachEvent和移除事件.detachEvent

        element.detachEvent("on"+eventName,listener);

      }else{

        element["on" + eventName] = null;

      }

    }

  };

6、事件對象

 1)事件參數e,就是事件對象,標準的獲取方式

btn.onclick = function(e) { }

 2)e.eventPhase 事件階段,IE8以前不支持

 3)e.target 始終是觸發事件的對象(點擊的按鈕)

   i)IE8以前 srcElement

   ii)瀏覽器兼容

var target = e.target || window.event.srcElement;

// 獲取事件對象 兼容瀏覽器

 getEvent: function(e) {

  return e || window.event; // e事件對象 標準的獲取方式; window.event IE8以前獲取事件對象的方式

 }

// 兼容target

 getTarget: function(e) {

  return e.target || e.srcElement;

 }

7、獲取鼠標在頁面上的位置

①在可視區域中的位置:  e.clientX   e.clientY

②在文檔中的位置: 

  i) e.pageX      e.pageY

  ii)瀏覽器兼容

var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;

 var pageY = e.clientY + scrollTop;

8、獲取頁面滾動的距離

// 兼容瀏覽器

var scrollTop = document.documentElement.scrollTop || document.body.scrolltop;

9、取消文本的選擇

// 兼容瀏覽器

 window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();

【總結】這里只是做了一部分的小結,實際開發中也還會遇到各種瀏覽器兼容的問題。不同瀏覽器在PC端和手機端也會遇到不同適配問題,這些就有待童鞋們一起去發掘總結啦~~希望能幫到大家,不足的地方請多指教啦~~~

以上這篇淺析JavaScript中瀏覽器的兼容問題就是小編分享給大家的全部內容了,希望能給大家一個參考

更多信息請查看網絡編程
易賢網手機網站地址:淺析JavaScript中瀏覽器的兼容問題
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
国产精品美女一区二区在线观看| 国产精品亚洲欧美| 欧美性片在线观看| 亚洲三级影院| 欧美影院午夜播放| 欧美特黄一区| 亚洲午夜在线| 国产欧美日韩亚洲精品| 一区二区三区免费看| 欧美视频一区二区在线观看| 曰本成人黄色| 国产麻豆午夜三级精品| 久久精品中文字幕免费mv| 亚洲国产成人精品视频| 欧美日韩一区在线视频| 99国产精品视频免费观看| 欧美日韩国产综合一区二区| 老司机免费视频一区二区三区| 一本久道久久久| 99热这里只有精品8| 欧美欧美在线| 欧美一区二区性| 激情视频一区二区三区| 久久野战av| 另类av导航| 噜噜噜噜噜久久久久久91| 欧美中文字幕视频| 亚洲欧美国产视频| 亚洲午夜精品久久久久久浪潮 | 国产综合激情| 国产日韩欧美在线播放不卡| 欧美日韩一区二区三区四区在线观看 | 性做久久久久久| 尤物yw午夜国产精品视频明星| 久久一二三区| 欧美a级一区二区| 久久国产精品亚洲77777| 亚洲精品日韩在线观看| 国产一区二区久久久| 国产精品久久久久久av福利软件 | 先锋亚洲精品| 欧美黄色日本| 欧美人体xx| 国产精品日韩在线观看| 欧美日韩亚洲免费| 免播放器亚洲| 韩国女主播一区二区三区| 亚洲夫妻自拍| 一区二区免费看| 欧美一级淫片aaaaaaa视频| 一区二区日韩| 99这里有精品| 久久精品二区亚洲w码| 久久精品国产久精国产爱| 欧美一区国产在线| 久久久久久电影| 国产精品一区二区在线观看| 韩国欧美一区| 亚洲精品久久在线| 亚洲欧洲av一区二区| 亚洲综合二区| 国产偷自视频区视频一区二区| 亚洲国产毛片完整版| 亚洲一二三四久久| 欧美黄色成人网| 国产精品成人一区二区三区吃奶| 中国日韩欧美久久久久久久久| 欧美国产1区2区| 亚洲国产精品123| 欧美在线视频一区| 国产精品xxxxx| 亚洲一区二区日本| 国产精品永久免费观看| 亚洲美女在线一区| 欧美顶级艳妇交换群宴| 国产精品入口日韩视频大尺度| 99成人在线| 国产精品免费小视频| 亚洲精品资源| 国产精品成人一区| 一本一本久久a久久精品牛牛影视| 裸体一区二区三区| 一区二区三区三区在线| 欧美精品在线免费| 99国产精品久久久久久久久久| 欧美电影免费观看高清| 久久精品国产99| 99re热精品| 国产日韩av高清| 免费欧美电影| 日韩一级二级三级| 国产精品成人一区二区网站软件 | 好看的日韩视频| 久久九九久久九九| 亚洲视频碰碰| 一区二区在线看| 女女同性精品视频| 亚洲性夜色噜噜噜7777| 欧美日韩第一区| 一区在线免费| 欧美视频在线免费看| 欧美在线免费| 亚洲欧美www| 亚洲免费精彩视频| 亚洲激情一区| 亚洲国产精品国自产拍av秋霞| 国产精品久久久久久久久婷婷| 在线一区观看| 亚洲图片在区色| 亚洲精品综合| 99re热这里只有精品免费视频| 在线观看视频一区二区| 今天的高清视频免费播放成人 | 国产一区二区日韩精品| 夜夜嗨av一区二区三区免费区| 欧美专区18| 欧美视频一区二区| 亚洲午夜女主播在线直播| 国产精品资源在线观看| 亚洲一级二级| 亚洲欧美综合网| 欧美激情综合网| 亚洲一区欧美二区| 国产精品久久久久久影视| 欧美一区二区三区在线看| 在线观看的日韩av| 国内精品视频在线播放| 伊人成人开心激情综合网| 国产精品综合不卡av| 欧美日韩亚洲一区二区三区在线观看| 久久在线视频在线| 欧美sm重口味系列视频在线观看| 久久久亚洲影院你懂的| 欧美黄色成人网| 一区二区在线观看视频在线观看| 这里只有精品电影| 亚洲视频网在线直播| 一本大道av伊人久久综合| 农村妇女精品| 国产日韩欧美成人| 亚洲国产日韩在线| 亚洲一级电影| 欧美午夜美女看片| 一区二区视频欧美| 一本久道久久综合中文字幕| 久久电影一区| 欧美精品成人一区二区在线观看| 欧美大片在线观看一区| 国产精品最新自拍| 欧美亚洲专区| 国产精品青草久久| 亚洲人成高清| 久久性天堂网| 国模精品娜娜一二三区| 一个色综合av| 欧美一区二区在线观看| 欧美粗暴jizz性欧美20| 尤物精品在线| 欧美极品aⅴ影院| 国产色综合网| 亚洲一区二区久久| 欧美体内谢she精2性欧美| 亚洲无线一线二线三线区别av| 国产精品一区二区a| 亚洲一区综合| 国产一区二区三区黄视频| 久久人体大胆视频| 国产精品一区二区黑丝| 亚洲制服少妇| 一本色道久久综合亚洲二区三区 | 欧美视频官网| 一本久久a久久免费精品不卡| 欧美天堂在线观看| 亚洲欧美成人一区二区三区| 国产精品中文字幕欧美| 国产中文一区| 女同性一区二区三区人了人一| 日韩亚洲视频在线| 亚洲第一精品福利| 欧美激情精品久久久久久变态| 亚洲精品一区二区三区在线观看| 欧美激情综合在线| 久久精品国产99精品国产亚洲性色| 欧美一区二区视频在线观看2020 | 欧美性猛交视频| 欧美日韩日本视频| 欧美激情在线播放| 欧美xxxx在线观看| 久久婷婷国产综合国色天香| 久久精品亚洲精品| 亚洲欧美日韩爽爽影院| 亚洲狠狠婷婷| 亚洲免费观看在线视频| 一区二区三区欧美在线观看| 亚洲精品视频在线播放| 国产性做久久久久久| 韩国欧美国产1区| 亚洲精品美女在线观看| av不卡在线| 一本色道久久综合亚洲精品婷婷 |