條件註釋的兩種形式——下層隱藏與下層顯示

来源:https://www.cnblogs.com/LFeather/archive/2019/08/21/11386397.html
-Advertisement-
Play Games

條件註釋的兩種形式——下層隱藏與下層顯示 條件註釋 (conditional comment) 是於HTML源碼中被 Microsoft Internet Explorer 有條件解釋的語句。條件註釋可被用來向 Internet Explorer 提供及隱藏代碼。 條件註釋最初於微軟的 Intern ...


條件註釋的兩種形式——下層隱藏與下層顯示

條件註釋 (conditional comment) 是於HTML源碼中被 Microsoft Internet Explorer 有條件解釋的語句。條件註釋可被用來向 Internet Explorer 提供及隱藏代碼。
條件註釋最初於微軟的 Internet Explorer 5瀏覽器中出現,並且直至 Internet Explorer 9 均支持。微軟已宣佈於 Internet Explorer 10 中以標準模式處理頁面 - 如 HTML5 - 時停止支持,但是舊版網頁使用這種技術(於相容性視圖)將繼續有效。

在處理相容問題時,條件註釋是非常常見的手段

<!-- Bootstrap -->
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">

<!-- HTML5 shim 和 Respond.js 是為了讓 IE8 支持 HTML5 元素和媒體查詢(media queries)功能 -->
<!-- 警告:通過 file:// 協議(就是直接將 html 頁面拖拽到瀏覽器中)訪問頁面時 Respond.js 不起作用 -->
<!--[if lt IE 9]>
  <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/html5shiv.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/[email protected]/dest/respond.min.js"></script>
<![endif]-->

上述示例為Bootstrap官方的相容性寫法,if lt IE 9 意為if less than IE 9,也就是說當瀏覽器版本小於IE9時,執行下列語句,當然小於也就是說不包括IE9,如果是小於等於則是lte(less than or equal to),大於(gt)和大於等於(gte)同理可得,普通條件註釋的寫法可以說很清晰了,所以這篇記錄的重點也不是這裡,而是針對IE以外的瀏覽器如何使用條件註釋。

最初我是這樣寫的:

<!--[if !IE]>
<script type="text/javascript" src="<%=Page.ResolveClientUrl("~/Scripts/jquery-2.1.4.min.js")  %>"></script>
<![endif]-->

<!--[if lt IE 9]>
    <script type="text/javascript" src="<%=Page.ResolveClientUrl("~/Scripts/jquery-1.12.4.min.js")%>"></script>
<![endif]-->

想當然地認為 !IE 可以被其他瀏覽器識別從而達到載入不同版本jQuery的目的,但實際上條件註釋正常只有IE5-IE9支持,這是一個IE獨有的用法,所以在相容性的處理上就存在問題,還是看上面的例子,如果去掉2.1.4版本的條件註釋,在大部分情況下都可以正常使用,但是在IE9以下的環境中就會載入兩個版本的jQuery,並且還有可能因為不支持高版本jQuery的一些寫法而報錯,那麼有沒有更好的解決辦法呢?還是有的,答案就在條件註釋的不同寫法中,這兩種寫法分別叫做下層隱藏與下層顯示。

下層隱藏(downlevel-hidden)

下層隱藏就是我們上面用的那種寫法,很好理解,也比較常用,但是非IE瀏覽器都會把它當做普通註釋完全忽略裡面的內容。

<!--[if IE 8]>
<link href="ie8only.css" rel="stylesheet">
<![endif]-->

下層顯示(downlevel-revealed)

而想要寫出針對其他瀏覽器生效的條件註釋就需要下層顯示的寫法。首先看一個不太規範的下層顯示寫法

<![if !IE]>
<link href="non-ie.css" rel="stylesheet">
<![endif]>

這個示例展示了應該僅對非 IE 瀏覽器暴露的內容,由於該條件對 IE 為假(並且因此該內容被忽略),而這些標簽自身在非 IE 瀏覽器中是無法識別的(並因此被忽略)。這不是有效的 HTML 或 XHTML。微軟承認這種句法不是標準化的標記,意圖是這些標記被其它瀏覽器忽視並暴露其中的內容。

那如果想要符合W3C標準要如何寫呢?答案如下:

<!--[if !IE]>-->
<link href="non-ie.css" rel="stylesheet">
<!--<![endif]-->

這幾種寫法咋看之下都沒什麼區別,但是看粗看語法著色就能發現區別,下層顯示狀態下條件註釋中的語句是有著色的,代表其已經被識別到,而下層隱藏反之,原因在於下層顯示的寫法其實是把條件註釋的語句註釋了,我們前面說到IE以外的瀏覽器會把條件註釋內的所有內容都當做普通註釋忽略,那麼當我們把條件註釋也註釋掉的時候,IE以外的瀏覽器就可以識別到中間的語句了,所以一個比較合理的相容性寫法可以這樣:

<!--[if !IE]>-->
<script type="text/javascript" src="<%=Page.ResolveClientUrl("~/Scripts/jquery-2.1.4.min.js")  %>"></script>
<!--<![endif]-->

<!--[if lt IE 9]>
    <script type="text/javascript" src="<%=Page.ResolveClientUrl("~/Scripts/jquery-1.12.4.min.js")%>"></script>
<![endif]-->

當使用IE5-IE9時,正常識別條件註釋,跳過 !IE 的部分,讀取 lt IE 9 裡面的內容,當使用其他版本時忽略條件註釋,讀取2.1.4版本jQuery


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

-Advertisement-
Play Games
更多相關文章
  • 下載 https://dev.mysql.com/downloads/mysql/5.7.html#downloads 參考鏈接 https://blog.csdn.net/qq_41307443/article/details/79839558 https://blog.csdn.net/wu_j ...
  • 1.數字註入 2.字元串註入 3. #後邊全部為註釋,字元串拼裝後繞過密碼驗證。 4. 同樣繞過密碼驗證 ...
  • 1.sql註入是怎麼產生的 2.如何尋找sql註入漏洞 在地址欄輸入單雙引號造成sql執行異常(get) post請求,在標題後輸入單引號,造成sql執行異常。 ...
  • 1.什麼是sql註入 sql註入是一種將sql代碼添加到輸入參數中,傳遞到sql伺服器解析並執行的一種攻擊手法。 2.正常行為,比如拿到id獲取文章的內容(案例) 3. 在瀏覽器中人為加入參數 or 1=1(永遠為真);這就產生了意想之外的行為,人為的獲取了整張表的內容,達到了攻擊的目的。 輸入參數 ...
  • 轉自: http://www.maomao365.com/?p=9336 摘要: 下文講述mssql中時間戳和時間格式的轉換方法,如下所示: 實驗環境:sql server 2008 R2 時間戳簡介:時間戳是linux下一種表示時間的方式。 時間戳是從 從格林威治時間1970年01月01日00時0 ...
  • 在Windows伺服器上確認伺服器和mysql都是正常運行,但就是連接不上。搜了一下別人的解決方案, 參考這篇https://blog.csdn.net/langren697/article/details/38422055的說法,問題就出在動態連接數上。給出的解決方案是在註冊表自定義最大連接數: ...
  • 如需轉載,請註明出處:Flutter學習筆記(20)--FloatingActionButton、PopupMenuButton、SimpleDialog、AlertDialog、SnackBar FloatingActionButton FloatingActionButton FloatingA ...
  • 一、 我們製作一個百度首頁作為練習,可直接複製該代碼保存尾碼名為.html來查看 二、源碼: d93_baidu_home_exercise.html 地址: https://github.com/ruigege66/HTML_learning/blob/master/d93_baidu_home_ ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...