功能檢測技術 typeOf

来源:http://www.cnblogs.com/xuanya/archive/2016/09/01/5831662.html
-Advertisement-
Play Games

我們通過功能檢測技術對那些不確定因素進行逐一排除,為了避免讓瀏覽器報錯和性能原因。在原生中這是一種非常重要的開發方式。 ...


Javascript與很多編程語言不同,它不能夠控制其運行環境。再寫php代碼時,只要在伺服器端部署了正確的版本,那麼程式就絕對能夠運行,對於其他python或ruby後端語言來說,也不存在什麼灰色區域。Javascript就不同了,它與所有的前端語言一樣,都需要各大瀏覽器的支持。

前端語言必須通過瀏覽器渲染頁面時才能被運行和執行,伺服器與客戶端的瀏覽器通過HTTP請求進行通信,接受資源後的瀏覽器再進行渲染。有很多因素,諸如瀏覽器對各項功能的支持程度、網路連接速度、屏幕大小、渲染效率等,都是完全不受開發者的控制。

所以,我們通過功能檢測技術對那些不確定因素進行逐一排除,為了避免讓瀏覽器報錯和性能原因。在原生中這是一種非常重要的開發方式。

 

1.    判斷是否開啟javascript功能

檢測用戶瀏覽器是否開啟了javascript功能,給予用戶友好的提示,以免於用戶對網站的抱怨。

1 <noscript>為了您的瀏覽體驗,請在瀏覽器設置中開啟javascript功能!</noscript>

 

如果檢測瀏覽器為IE及之前的舊版本,則給予不同的提示(HTML5 boilerplate):

1 <pclass="chromeframe">您正在使用<strong>過時的</strong>瀏覽器。請<a
2 href="http://browsehappy.com/">升級您的瀏覽器</a>或者<a
3 href="http://www.google.com/chromeframe/?redirect=true">開啟並更新GoogleChromeFrame插件</a>以改善您的瀏覽體驗!</p>

 

2.    在使用for迴圈操作時,有必要檢測迴圈的值

For()運算會占用大量的運算性能,所以開始前有必要檢測一下:

 

 1                 count = fruit.length,
 2                     i;
 3                 //阻止預設行為
 4                 event.preventDefault();
 5 
 6                 target.innerHTML = "";
 7                 if(count > 0 || searchValue !==""){
 8                     for(i = 0;i < count;i++){
 9                         var obj = fruit[i],
10                             //將name與searchvalue值相匹配,如果值不等於 -1,那麼就與之相匹配
11                             inItfount = obj.name.indexOf(searchValue);
12 
13                         //將JSON中匹配的數據寫入到DOM
14                         if(isItfount != -1){
15                             target.innerHTML += '<p>'+obj.name+'<a href="mailto:" '+obj.color+'>'+obj.color+'</a></p>'
16                         }
17                     }
18                 }

 

3.    判斷HTML5版本本地存儲API 

Cookies是一種即難處理,又不安全的一種技術,它總是和隱私追蹤程式、惡意軟體等東西綁在一起。所以,W3C在HTML5新版本中定義了localStorage和sessionStorage網路存儲方案。對於此類HTML5新API,你得考慮瀏覽器對該功能的支持情況。如果只關註高端設備及瀏覽器,那也許這就不是問題,但對於剩下的瀏覽器來說,可就要小心了(http://www.w3school.com.cn/html5/html_5_webstorage.asp):

 1 //判斷HTML5版本本地存儲API
 2 if(typeof (localStorage) === "undefined"){
 3     //新版API不支持,需要考慮cookies方案
 4 } else{
 5     //使用JSON.stringObject保存字元串數據
 6     var stringObject = JSON.stringify(favoriteSandwiches);
 7     var localStorage = setItem("favoriteSandwiches",stringObject);
 8     //使用JSON.parse提取為JSON數據
 9     var storedItem = localStorage.getItem("favoriteSandwiches");
10     var convertObject = JSON.parse(storedItem);
11 }

 

4.    在IE瀏覽器中添加事件監聽器的所需備用代碼

在使用addEventListener()方法時要稍微留心一下瀏覽器是否支持它。IE 8及更早的版本都不支持addEventListener()方法,但它支持功能相似的attachEvent()方法;這兩種方法的支持情況不存在交疊:

 1 // IE瀏覽器中添加事件監聽器的備用代碼
 2 var btn = document.getElementById("btn");
 3 
 4 if(btn.addEventListener){
 5     btn.addEventListener("click",function(){
 6         alert("click the button");
 7     },false)
 8 }else {
 9     btn.attachEvent("click", function () {
10         alert("for IE8 AND below");
11     });
12 }

 

5.    選取定位DOM節點的方法

隨著HTML5標準的發佈,javascript根據需求隨即進行標準化,將getElementByClassName()、querySelector()、querySelectorAll()方法加入其中。針對新舊瀏覽器,需要進行支持度檢測。如果你嫌麻煩,可以損失一丁點性能選用程式庫的"$()"選擇器:

 1 //選取定位DOM節點的方法
 2 if(document.querySelector){
 3     document.querySelector(".btn");
 4 
 5 } else if(document.getElementsByClassName()){
 6     document.getElementsByClassName("btn");
 7 
 8 } else{
 9     document.getElementById("subtn");
10 }

 

6.    創建Ajax通信伺服器對象的方法

XMLHttpRequest對象是所有Ajax調用的核心。執行Ajax調用的第一步就是創建XMLHttpRequest對象,這一步非常容易,但是為了適配IE6等老版瀏覽器,我們需要進行檢測:

 1 function getHTTPObject(){
 2     "use strict";
 3     var xhr;
 4     if(window.XMLHttpRequest){
 5         xhr = new window.XMLHttpRequest();
 6     } else if(window.ActiveXObject){
 7         xhr = new window.ActiveXObject("Msxml2.XMLHTTP");
 8     }
 9     //將通信伺服器對象返回
10     return xhr;
11 }

 

7.    在獲取DOM屬性時有必要看看它存不存在

1 if(document.getElementsByTagName("a").length > 0){
2     //可以執行for()迴圈代碼
3 }
4 
5 if(document.getElementById("btn").hasAttribute){
6     document.getElementById("btn").setAttribute("class","subtn");
7 }

 

合理的使用功能檢測技術能夠讓我們避開那些本不該踩到的雷區,當然還有更多的功能檢測等著我們在實操中去發現。另外,我推薦使用火狐瀏覽器的firebug開發人員工具進行調試代碼,總結經驗和不足;歡迎大家相互交流!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ng-grid是基於AngularJS和JQuery的富表格控制項,由AngularUI Team領銜開發,到目前為止已有2354次Commit,1076個Fork。 AngualrUI:http://angular-ui.github.io/ ng-grid: http://angular-ui.g ...
  • 遞歸函數大家都應該比較熟吧?那麼,如何在JavaScript中書寫一個完美的遞歸函數呢?且聽我娓娓道來。 遞歸函數 寫的時候,查了一下維基百科對遞歸函數的定義,恕我愚鈍,簡直太深奧了!所以,我還是簡單的說說我對遞歸函數的理解吧。遞歸函數,說白了就是在函數內部引用函數自身,最終到給定的遞歸結束條件時回 ...
  • 一.簡介 jQuery 庫可以通過一行簡單的標記被添加到網頁中 jQuery 是一個 JavaScript 函數庫。 jQuery 庫包含以下特性: HTML 元素選取 HTML 元素操作 CSS 操作 HTML 事件函數 JavaScript 特效和動畫 HTML DOM 遍歷和修改 AJAX U ...
  • JavaScript數組是一種特殊類型的對象。 JavaScript數組元素可以為任意類型,最大容納232 1個元素。 JavaScript數組是動態的,有新元素添加時,自動更新length屬性。 JavaScript數組元素索引可以是不連續的,它們之間可以有空缺。 1.創建數組 調用構造函數Arr ...
  • ali.js是一款滾動插件,滾動的內容可包含文字和圖片。它的API也很強大,包括滾動區域可見個數、每次滾動個數、滾動方向、是否迴圈滾動、是否自動滾動、滾動間隔時間、滾動動畫速度、動畫效果、滾動方向以及開始滾動索引。 線上實例 實例演示 使用方法 參數詳解 下載 ...
  • Node.js 引入了模塊(Module)概念,一個模塊可以通過module.exports 或 exports 將函數、變數等導出,以使其它 JavaScript 腳本通過require() 函數引入並使用。 module.exports 初始值為一個空對象 {},所以 exports 初始值也是 ...
  • [1]滾動寬高 [2]頁面尺寸 [3]滾動長度 [4]頁面滾動 [5]滾動方法 [6]滾動事件 ...
  • ExtJS的強大功能之一是提供了非常豐富的組件,包括grid(表格)、panel(面板)、form(表單)、button(按鈕)、progressBar(進度條)等等。 一個的ExtJS 4應用程式的UI界面,就是由一個或多個組件組成。 這裡將會介紹組件的分類、名稱、結構以及創建方式。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...