ホームページ ウェブフロントエンド jsチュートリアル JavaScript_javascript スキルにおけるブラウザ互換性問題の簡単な分析

JavaScript_javascript スキルにおけるブラウザ互換性問題の簡単な分析

May 16, 2016 pm 03:04 PM
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. 配列フィルター(); // 指定された関数を使用してすべての要素をテストし、テストに合格したすべての要素を含む新しい配列を作成します

// 兼容旧环境
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 ) { }; //第一パラメータのイベント名
//第二引数イベント処理関数(リスナー)
// 3 番目のパラメータ 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 &#63; window.getSelection().removeAllRanges() : document.selection.empty();
ログイン後にコピー
[概要] ここで紹介するのはほんの一部ですが、実際の開発ではブラウザの互換性の問題も発生します。 PC と携帯電話では、ブラウザーが異なれば適応の問題も異なります。これらは子供たちが一緒に調べてまとめるためのものです~~ 皆さんの欠点についてもっとアドバイスしていただければ幸いです~~~

JavaScript におけるブラウザ互換性の問題に関する上記の簡単な分析は、エディターによって共有されたすべての内容です。参考にしていただければ幸いです。また、Script Home をサポートしていただければ幸いです。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Webページにローカルにインストールされている「Jingnan Mai Round Body」を正しく表示するにはどうすればよいですか? Webページにローカルにインストールされている「Jingnan Mai Round Body」を正しく表示するにはどうすればよいですか? Apr 05, 2025 pm 10:33 PM

最近、Webページにローカルにインストールされたフォントファイルを使用して、インターネットから無料のフォントをダウンロードし、システムに正常にインストールしました。今...

JavaScriptまたはCSSを介してブラウザ印刷設定でページの上部と終了を制御する方法は? JavaScriptまたはCSSを介してブラウザ印刷設定でページの上部と終了を制御する方法は? Apr 05, 2025 pm 10:39 PM

JavaScriptまたはCSSを使用して、ブラウザの印刷設定のページの上部と端を制御する方法。ブラウザの印刷設定には、ディスプレイが...

ネガティブマージンが場合によっては効果がないのはなぜですか?この問題を解決する方法は? ネガティブマージンが場合によっては効果がないのはなぜですか?この問題を解決する方法は? Apr 05, 2025 pm 10:18 PM

なぜマイナスマージンが場合によっては有効にならないのですか?プログラミング中、CSSの負のマージン(負...

Webページにローカルにインストールされたフォントファイルを使用する方法は? Webページにローカルにインストールされたフォントファイルを使用する方法は? Apr 05, 2025 pm 10:57 PM

Webページにローカルにインストールされたフォントファイルを使用する方法Webページ開発でこの状況に遭遇しましたか:コンピューターにフォントをインストールしました...

フレックスレイアウトの下のテキストは省略されていますが、コンテナは開かれていますか?それを解決する方法は? フレックスレイアウトの下のテキストは省略されていますが、コンテナは開かれていますか?それを解決する方法は? Apr 05, 2025 pm 11:00 PM

フレックスレイアウトとソリューションの下でのテキストの過度の省略によるコンテナの開口部の問題が使用されます...

CSSで要素を回転させることにより、水平オプションの水平スクロール効果を実現する方法は? CSSで要素を回転させることにより、水平オプションの水平スクロール効果を実現する方法は? Apr 05, 2025 pm 10:51 PM

CSSにおける水平オプションの水平スクロール効果を実現する方法は?最新のWebデザインでは、水平方向のタブのような効果を実現し、マウスをサポートする方法...

適応設計でREMユニットを調整して、高さの問題を解決する方法は? 適応設計でREMユニットを調整して、高さの問題を解決する方法は? Apr 05, 2025 pm 11:03 PM

適応設計の高さ調整の問題を解決する方法は?適応設計では、高さの調整はしばしば困難な問題です。特に同様に対処するとき...

See all articles