《Ext JS權威指南》——2.4節關于Ext.onReady

2.4 關于Ext.onReady
代碼為什么寫在Ext.onReady中,而不是在body中添加一個onload事件并在onload事件中運行呢?主要原因是Ext.onReady在DOM模型加載完畢后即可進行操作,而無需像onload事件那樣,等待頁面的所有資源都加載完畢后才進行操作,尤其是在頁面有大圖片這類資源的時候。下面我們來看看Ext.onReady是如何做到這點的。
在Loader.js文件可以找到Ext.onReady的定義:

Ext.onReady = function(fn, scope, options) {Loader.onReady(fn, scope, true, options);
};
在這里調用了Loader對象的onReady方法,在Loader.js中可找到如下定義:
onReady: function(fn, scope, withDomReady, options) {var oldFn;if (withDomReady !== false && Ext.onDocumentReady) {oldFn = fn;fn = function() {Ext.onDocumentReady(oldFn, scope, options);};}fn.call(scope);
},

在上面的代碼中,因為調用時withDomReady為true,所以只需判斷Ext.onDocumentReady是否存在,如果存在,就建立一個匿名函數fn,準備執行Ext.onDocumentReady方法。最后是調用函數fn,執行Ext.onDocumentReady。
在EventManger.js中可找到Ext.onDocumentReady的定義:

onDocumentReady: function(fn, scope, options){options = options || {};var me = Ext.EventManager,readyEvent = me.readyEvent;options.single = true;readyEvent.addListener(fn, scope, options);if (Ext.isReady) {readyEvent.fire();} else if (document.readyState == 'complete') {me.fireDocReady();} else {me.bindReadyEvent();}
},

在上面的代碼中,readyEvent是Ext.util.Event的實例,options.single的作用是規定ready-Event事件只執行一次。接著將函數添加到Event實例內的監聽事件列表中,最后判斷DOM模型是否已加載完成。如果已加載完成,則調用fire方法依次執行監聽事件列表中的函數。這樣做的目的是:當存在多個onReady方法時,能保證所有的函數都能執行。如果還沒有加載完成,而document對象的readyState屬性為“complete”,表示文檔其實已經加載完成了,但是沒有設置isReady屬性為true,那么可調用fireDocReady方法,其代碼如下:

fireDocReady: function(){var me = Ext.EventManager;if (!Ext.isReady) {Ext.isReady = true;if (document.addEventListener) {document.removeEventListener('DOMContentLoaded', me.fireDocReady, false);window.removeEventListener('load', me.fireDocReady, false);} else {if (me.readyTimeout !== null) {clearTimeout(me.readyTimeout);}if (me.hasOnReadyStateChange) {document.detachEvent('onreadystatechange', me.checkReadyState);}window.detachEvent('onload', me.fireDocReady);}Ext.supports.init();me.onWindowUnload();me.readyEvent.fire();}
},

在上面的代碼中,如果isReady不是true,則將其設置為true,然后移除文檔的監聽事件。首先調用Ext.supports的init方法檢測當前運行環境的信息;然后調用onWindowUnload方法為文檔綁定unload事件,觸發后會刪除頁面的所有元素;最后再調用readyEvent的fire方法,開始執行我們定義的代碼。
如果文檔還沒有加載完成,則執行bindReadyEvent方法,其代碼如下:

bindReadyEvent: function(){var me = Ext.EventManager;if (me.hasBoundOnReady) {return;}if (document.addEventListener) {document.addEventListener('DOMContentLoaded', me.fireDocReady, false);window.addEventListener('load', me.fireDocReady, false);} else {if (!me.checkReadyState()) {document.attachEvent('onreadystatechange', me.checkReadyState);me.hasOnReadyStateChange = true;}window.attachEvent('onload', me.fireDocReady, false);}me.hasBoundOnReady = true;
},

看懂以上代碼就應該很清楚整個執行過程了。在代碼中,如果沒有在頁面中綁定監聽事件,則綁定事件,非IE瀏覽器是綁定“DOMContentLoaded”事件,IE是綁定onload事件。對于舊版本的IE,會調用checkReadyState方法檢查頁面是否準備好,因為舊版本IE只能使用替代辦法檢查DOMContentLoaded事件。事件觸發后執行fireDocReady方法。

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

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

相關文章

git push 提交時顯示 Empty reply from server的解決辦法

輸入 git fetch origin --prune 參考鏈接:https://stackoverflow.com/questions/28364023/gits-error-on-push-empty-reply-from-server 轉載于:https://www.cnblogs.com/team42/p/6941678.html

轉]移動視頻監控(1)---項目綜述

對于市場上的視頻監控系統,大家都有一定的了解,就是視頻采集,經過無線/有線發送到服務或代理,客戶從服務或代理上得到視頻/音頻流。不復雜。 對于不遠的將來,3G,4G的到來,對移動的業務有一個推動…

java 空接口_學Java,java接口搞明白了嗎?大牛讓你一文搞清楚

前言對于面向對象編程來說,抽象是一個極具魅力的特征。如果一個程序員的抽象思維很差,那他在編程中就會遇到很多困難,無法把業務變成具體的代碼。在 Java 中,可以通過兩種形式來達到抽象的目的,一種是抽象類&#xff0…

Check Point CEO:“我們正在積極尋找收購目標”

Check Point Sofrware Technologies很可能成為下一個會產生收購案的主流安全廠商,首席執行官Gil Shwed在該公司第二季度財報電話會議上這樣表示。 “我們正在積極地尋求收購目標,期待無論是大規模的還是小規模的擴張,”Shwed表示。“我們在并…

Spark SQL 編程API入門系列之SparkSQL數據源

不多說,直接上干貨! SparkSQL數據源:從各種數據源創建DataFrame 因為 spark sql,dataframe,datasets 都是共用 spark sql 這個庫的,三者共享同樣的代碼優化,生成以及執行流程,所以 s…

H.264中的一些易混淆概念

Q:PSNR 峰值信噪比 Q:是根據它來取qp是不是? A:不是, 和QP沒有直接關系, 但是QP的選擇會影響到PSNR Q: 如果不用率失真最優化, 為什么選擇SATD+deltar(mv,mode)作為模式選擇的依據?為什么運…

Java中final關鍵字的幾種用法

在java的關鍵字中,static和final是兩個我們必須掌握的關鍵字。不同于其他關鍵字,他們都有多種用法,而且在一定環境下使用,可以提高程序的運行性能,優化程序的結構。下面我們來了解一下final關鍵字及其用法。 final關鍵…

python pyqt5安裝_Python3 安裝PyQt5及exe打包圖文教程

環境: Python 3.6.4 Pycharm Professional 2017.3.3 PyQt5 PyQt5-tools① Python 3 安裝Python 3.x 安裝時,默認勾選ADD Python 3.6 to PATH和ADD Python to environment variables的情況下,系統會向path中增加以下兩個環境變量。D:\Program Files\Py…

《企業軟件交付:敏捷與高效管理精要》——3.4 企業軟件交付的軟件工廠方法...

3.4 企業軟件交付的軟件工廠方法 正如我們前面討論的,今天的機構面對的商業環境正以前所未有的速度發生變化。與此同時,這些機構還要管理和降低整個機構的運營成本。這就直接意味著,他們不僅要最大限度地減少浪費和低效率,還要提…

201706問題記錄

1.四周陰影 box-shadow:0px 0px 10px #f5f5f5; 2. 原生setattribute()方法 jquery的attr()$(.fd-sq-zk).attr("title","收起"); 3.在iframe中獲取外層容器的元素 屬性等 $(parent.document).find("html")..... 4.監聽頁面變大變小事件 /…

一致性hash算法_(圖文案例)一致性哈希算法詳解 一點課堂(多岸教育)

一致性Hash算法關于一致性Hash算法,在我之前的博文中已經有多次提到了,MemCache超詳細解讀一文中”一致性Hash算法”部分,對于為什么要使用一致性Hash算法、一致性Hash算法的算法原理做了詳細的解讀。算法的具體原理這里再次貼上:…

《HTML5 Canvas游戲開發實戰》——2.1 繪制基本圖形

本節書摘來自華章計算機《HTML5 Canvas游戲開發實戰》一書中的第2章,第2.1節,作者:張路斌著, 更多章節內容可以訪問云棲社區“華章計算機”公眾號查看。 2.1 繪制基本圖形 所謂基本圖形,就是指線、矩形、圓等最簡單的圖形&#x…

如何查看Ubuntu版本

有時候需要查看一下系統安裝的Ubuntu的版本,最簡單的方式是輸入lsb_release -a。whatis lsb_release輸出:print distribution-specific information。所以lsb_release這個命令就是用來輸出發行版的信息的。 Open the Terminal enter:lsb_release -a It w…

linux下.a/.so/.la目標庫區別

在linux平臺上編譯時,常會遇到目標庫的疑問,有靜態庫也有動態庫,單個理解都不太難,但是對復雜的工程而言,一旦混合到一起去,對整個工程的理解和調用,將會造成很大困擾,本文就匯總這幾…

python 二元函數繪制_Python繪制二元函數曲面

微實踐:繪制二元函數曲面我們將演示如何借助于ufunc的廣播運算計算下述二元函數的在一個xy平面上的值并將其繪制成3D曲面。其中,x和y的取值范圍均為[-2,2]。為了達到目的,我們需要一個二維的結果數組z,其元素的下標對應參數x,y的取…

Npgsql使用入門(三)【批量導入數據】

Program.cs代碼: class Program{static void Main(string[] args){var test new PgBulkCopyHelper<SingleBuilding>("bld_amap_gzmain");foreach (string pName in test.PropNames){Console.WriteLine("name: {0},\t\ttype: {1}", pName, test.Prop…

遠程網絡視頻監視技術

目前要實現廣域網視頻監視&#xff0c;主要通過三種方式實現&#xff1a;1.硬盤錄像機&#xff1b;2.網絡視頻服務器&#xff1b;3.網絡攝像機。 硬盤錄像機是一個以錄像為主的設備&#xff0c;有的可以支持IE瀏覽。網絡視頻服務器一般前端不錄像&#xff0c;直接將影像傳輸到…

Deepin下java開發環境部署

簡介 本經驗由深度論壇用戶(zhang12345shun)分享&#xff0c;原文地址 正文 SUN JDK&#xff08;現已改名Oracle JDK&#xff09; 1.下載Sun版JDK壓縮包&#xff08;.tar.gz&#xff09;&#xff0c;選擇其中的32/64位Linux版本。 2.將其解壓縮&#xff1a; sudo tar -zx…

判斷ic卡類型

傳15讀卡片數據 判斷data8的status是否為0&#xff0c;是則是ic 否則就是磁條卡 根據二磁道數據識別是IC卡還是磁條卡 根據二磁道符號后面第一位識別。規則是 該數字 6 或者 2 則該卡是IC卡&#xff0c;否則是普通磁條卡 轉載于:https://www.cnblogs.com/wubenhui/p/6956256.h…

python常用代碼_Python常用算法學習(3)(原理+代碼)——最全總結

1&#xff0c;什么是算法的時間和空間復雜度算法(Algorithm)是指用來操作數據&#xff0c;解決程序問題的一組方法&#xff0c;對于同一個問題&#xff0c;使用不同的算法&#xff0c;也許最終得到的結果是一樣的&#xff0c;但是在過程中消耗的資源和時間卻會有很大的區別。那…