JavaScript DOM操作 提高篇

  做為一個web前端,處理和了解瀏覽器差異一個重要問題.下面將介紹本人在工作中的一些筆記總結,先介紹沒有使用js庫的情況。

  1.  setAttribute方法設置元素類名 : 在jQuery中,直接使用attr()方法即可,可在原生的JS中

element.setAttribute('class','newClassName') //這個是W3C的標準,在兼容W3C標準的瀏覽器中有效,可是,IE才是國內用戶的主旋律
element.setAttribute('className','newClassName') //這樣的設置在IE中才能有效
element.className = 'newClassName' //所有瀏覽器有效(只要支持javascript)

  好了,開篇說完了,這篇文章的目的也就是介紹瀏覽器差異的同時使前端的朋友們了解如果用最有效的方法去解決問題,下面繼續。

  2.  FireFox沒有window.event對象,只有event對象,IE里只支持window.event,而其他主流瀏覽器兩者都支持,所以一般寫成:

function handle(e)
{
e = e || event;
...
}

  3.  DOMContentLoaded事件原理:對window.onload事件是當頁面解析/DOM樹建立完成,并完成了如圖片、腳本、樣式表等所有資源的下載后才觸發的。這對于很多實際的應用而言有點太“遲”了,比較影響用戶體驗。為了解決這個問題,FF中便增加了一個DOMContentLoaded方法,與onload相比,該方法觸發的時間更早,它是在頁面的DOM內容加載完成后即觸發,而無需等待其他資源的加載(這個也就是jquery.ready()事件的實現原理)。

//以下是jQuery 1.4.2版本的原版分析


bindReady: function() {
  if ( readyBound ) {
    return;
  }
  readyBound = true;
  // Catch cases where $(document).ready() is called after the
  // browser event has already occurred.
  if ( document.readyState === "complete" ) {
    return jQuery.ready();
  }
  // Mozilla, Opera and webkit nightlies currently support this event
  if ( document.addEventListener ) {
  // Use the handy event callback
    document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
    // A fallback to window.onload, that will always work
    window.addEventListener( "load", jQuery.ready, false );
    // If IE event model is used
  } else if ( document.attachEvent ) {
    // ensure firing before onload,
    // maybe late but safe also for iframes
    document.attachEvent("onreadystatechange", DOMContentLoaded);
    // A fallback to window.onload, that will always work
    window.attachEvent( "onload", jQuery.ready );
    // If IE and not a frame
    // continually check to see if the document is ready
    var toplevel = false;
    try {
      toplevel = window.frameElement == null;
    } catch(e) {}
    if ( document.documentElement.doScroll && toplevel ) {
      doScrollCheck();
    }
  }
}

  設計思路 - 將Webkit與Firefox同等對待,都是直接注冊DOMContentLoaded事件,但是由于Webkit是在525以上版本才引入的,因此存在兼容性的隱患。 對于IE,首先注冊document的onreadystatechange事件,經測試,該方式與window.onload相當,依然會等到所有資源下載完畢后才觸發。 之后,判斷如果是IE并且頁面不在iframe當中,則通過setTiemout來不斷的調用documentElement的doScroll方法,直到調用成功則出觸發DOMContentLoaded。1 jQuery對于IE的解決方案的原理是,在IE下,DOM的某些方法只有在DOM解析完成后才可以調用,doScroll就是這樣一個方法,反過來當能調用doScroll的時候即是DOM解析完成之時,與prototype中的document.write相比,該方案可以解決頁面有iframe時失效的問題。此外,jQuery似乎擔心當頁面處于iframe中時,該方法會失效,因此實現代碼中做了判斷,如果是在iframe中則通過document的onreadystatechange來實現,否則通過doScroll來實現。不過經測試,即使是在iframe中,doScroll依然有效。

  4.  學會使用IE的條件注釋。許多前端總是在抱怨萬惡的IE,確實,處理兼容性的問題確實會越來越惡心,可是沒有辦法,既然沒有辦法改變,那么請享受...

<!--[if IE]>
<h1>您正在使用IE瀏覽器</h1>
<![endif]-->
<!--[if IE 5]>
<h1>版本 5</h1>
<![endif]-->
<!--[if IE 5.0]>
<h1>版本 5.0</h1>
<![endif]-->
<!--[if IE 5.5]>
<h1>版本 5.5</h1>
<![endif]-->
<!--[if IE 6]>
<h1>版本 6</h1>
<![endif]-->
<!--[if IE 7]>
<h1>版本 7</h1>
<![endif]-->

  今天就先總結到這里吧,下周收假回來有時間發高級AJAX篇,希望能對新手或者有需要的人有所幫助.由于文筆有限,寫的不好也請見諒,這個剛剛開始寫博客,成長階段嘛。哈哈...

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248954.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248954.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248954.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《算法競賽進階指南》0.5排序

103. 電影 莫斯科正在舉辦一個大型國際會議&#xff0c;有n個來自不同國家的科學家參會。 每個科學家都只懂得一種語言。 為了方便起見&#xff0c;我們把世界上的所有語言用1到109之間的整數編號。 在會議結束后&#xff0c;所有的科學家決定一起去看場電影放松一下。 他們去的…

Spring Cloud Gateway(五):路由定位器 RouteLocator

本文基于 spring cloud gateway 2.0.1 1、簡介 直接 獲取 路 由 的 方法 是 通過 RouteLocator 接口 獲取。 同樣&#xff0c; 該 頂 級 接口 有多 個 實現 類&#xff0c; RouteLocator 路由定位器&#xff0c;顧名思義就是用來獲取路由的方法。該路由定位器為頂級接口有多個實…

CommonJS,AMD,CMD區別 - 鄭星陽 - ITeye博客

CommonJS&#xff0c;AMD&#xff0c;CMD區別 博客分類&#xff1a; seajs和requirejs JavaScript zccst轉載 學得比較暈&#xff0c;再次看commonjs&#xff0c;amd, cmd時好像還是沒完全弄清楚&#xff0c;今天再整理一下&#xff1a; commonjs是用在服務器端的&#xff…

739. Daily Temperatures

根據每日 氣溫 列表&#xff0c;請重新生成一個列表&#xff0c;對應位置的輸入是你需要再等待多久溫度才會升高的天數。如果之后都不會升高&#xff0c;請輸入 0 來代替。 例如&#xff0c;給定一個列表 temperatures [73, 74, 75, 71, 69, 72, 76, 73]&#xff0c;你的輸出應…

【NOIP2018】DAY2T2——填數游戲(輪廓線狀壓的dp?搜索打表)

描述 小 D 特別喜歡玩游戲。這一天&#xff0c;他在玩一款填數游戲。 這個填數游戲的棋盤是一個n m的矩形表格。玩家需要在表格的每個格子中填入一個數字&#xff08;數字 0 或者數字 1&#xff09;&#xff0c;填數時需要滿足一些限制。 下面我們來具體描述這些限制。 為了方…

Mysql中遇到的錯誤

Caused by: java.sql.SQLException: Unknown system variable ‘tx_isolation’ 這種錯誤是因為數據庫版本新的但是mysql的jar包是舊的&#xff0c;所以導入最新的mysqljar包 注意實體類和數據庫字段的映射關系&#xff0c;實體類中使用駝峰式的命名規則&#xff0c;大寫的字母…

Express 入門之Router - worldtree_keeper的專欄 - CSDN博客

要了解Router我們需要先知道到Application&#xff0c;首先&#xff0c;每一個express實例本身內部就內建了router&#xff0c;所以我們先從簡單的下手&#xff0c;先使用application&#xff1b;另外這里我們只選擇get方法&#xff0c;作為我們Router.Method, 之所以使用get是…

rest測試定義

1.為什么要做接口測試&#xff1a; 1.因為很多系統關聯都是基于接口實現的&#xff0c;接口測試可以將系統復雜的系統關聯進行簡化 2.接口工程比較單一&#xff0c;能夠比較好的進行測試覆蓋&#xff0c;也相對容易實現自動化持續集成 3.接口相對于界面功能 &#xff0c;會更底…

團隊開發進度報告9

&#xff08;1&#xff09;站立會議 &#xff08;2&#xff09;任務面板 &#xff08;3&#xff09;具體內容 昨天&#xff1a;完成了界面控件按鈕的設置問題&#xff1a;PHP數據處理&#xff0c;如何實現在線數據交互問題今天&#xff1a;hbuilder后臺環境搭建 轉載于:https:/…

nodejs+express整合kindEditor實現圖片上傳 - 木子豐咪咕晶 - 開源中國

kindEditor官網上中提供了ASP,ASP.NET,JSP相關的整合應用,http://kindeditor.net/docs/upload.html可以參照實現nodejs的整合,發現實用nodejs更簡單 環境: unbuntu 14.10 nodejs 0.10.35 express 4.11.2 formidable 1.0.16 kindEditor 4.1.10 webStorm 8 1.通過IDE或終端創建…

基于springboot多模塊項目使用maven命令打成war包放到服務器上運行的問題

首先&#xff0c;大家看到這個問題&#xff0c;可能并不陌生&#xff0c;而且腦子里第一映像就是使用mava中的clear package 或者 clear install進行打包&#xff0c;然后在項目中的target文件夾下面找到xxx.war&#xff0c;將這個war包放到外置的tomcat服務器下的webapps下面&…

Kafka學習筆記(3)----Kafka的數據復制(Replica)與Failover

1. CAP理論 1.1 Cosistency(一致性) 通過某個節點的寫操作結果對后面通過其他節點的讀操作可見。 如果更新數據后&#xff0c;并發訪問的情況下可立即感知該更新&#xff0c;稱為強一致性 如果允許之后部分或全部感知不到該更新&#xff0c;稱為弱一致性。 若在之后的一段時間&…

H5頁面隨機數字鍵盤支付頁面

H5頁面隨機數字鍵盤支付頁面 有個H5支付的業務需要隨機數字的鍵盤 參考了下文&#xff1a;https://blog.csdn.net/Mr_Smile2014/article/details/52473351 做了一些小修改&#xff1a; 在原有的基礎上&#xff0c;增加了一些按鍵反饋的效果。 每個按鍵加上邊框。 最終效果&…

expressjs路由和Nodejs服務器端發送REST請求 - - ITeye博客

Nodejs創建自己的server后&#xff0c;我們如果需要從客戶端利用ajax調用別的服務器端的數據API的接口&#xff0c;這時候出現了ajax跨域問題。 一種是利用在客戶端解決跨域問題 這種方案大家可以去網上查查 另一種方案是在服務器端去請求別的服務器&#xff0c;然后將數據再…

Jmeter操作mysql數據庫測試

1. 選中線程組鼠標點擊右鍵添加-->配置元件-->JDBC Connection Configuration&#xff1b; 2. DataBase Connection Configuration配置 Variable Name&#xff1a;配置元件的的所有配置所保存的變量&#xff0c;自定義變量名稱(不能使用mysql作為變量名&#xff0c;多個…

axios發送自定義請求頭的跨域解決

前端發送來的axios請求信息 this.$axios.request({ url:http://127.0.0.1:8001/pay/shoppingcar/, method:post, headers:{ authenticate:a073b3dabbb140e8b9d28debb6a356a1 # 自定義的請求頭部信息鍵值對, }, # 接上,這種key也算是一種請求頭,需要加入django中間件內…

前端“智能”靜態資源管理 - Onebox - 博客園

前端“智能”靜態資源管理 模塊化/組件化開發&#xff0c;僅僅描述了一種開發理念&#xff0c;也可以認為是一種開發規范&#xff0c;倘若你認可這規范&#xff0c;對它的分治策略產生了共鳴&#xff0c;那我們就可以繼續聊聊它的具體實現了。 很明顯&#xff0c;模塊化/組件化…

【轉】幾張圖看懂列式存儲

幾張圖看懂列式存儲 轉載于:https://www.cnblogs.com/apeway/p/10870211.html

hive -e和hive -f的區別(轉)

大家都知道&#xff0c;hive -f 后面指定的是一個文件&#xff0c;然后文件里面直接寫sql&#xff0c;就可以運行hive的sql&#xff0c;hive -e 后面是直接用雙引號拼接hivesql&#xff0c;然后就可以執行命令。 但是&#xff0c;有這么一個東西&#xff0c;我的sql當中有一個s…

我們是如何做好前端工程化和靜態資源管理 - 無雄 - 博客園

我們是如何做好前端工程化和靜態資源管理 隨著互聯網的發展&#xff0c;我們的業務也日益變得更加復雜且多樣化起來&#xff0c;前端工程師也不再只是做簡單的頁面開發這么簡單&#xff0c;我們需要面對的十分復雜的系統性問題&#xff0c;例如&#xff0c;業務愈來愈復雜&…