1. 程式人生 > >JS原生方法實現JQuery ready()方法

JS原生方法實現JQuery ready()方法

首先說明一下load事件與ready事件的區別

HTML文件載入順序:

①       解析HTML結構

②       載入外部指令碼和樣式表文件

③       解析並執行指令碼程式碼

④       構造HTML DOM模型

⑤       載入圖片等外部檔案

⑥       頁面載入完畢

Load事件是在頁面載入完畢後觸發;ready事件是在DOM模型構造完畢,載入外部檔案前觸發;

JQuery的ready事件實際上是對IE的readystatechange事件和DOM的DOMContentLoaded事件進行封裝,這兩事件都是在DOM樹結構下載並解析完畢後觸發。程式碼如下:

 <script>
	var $ = ready = window.ready = function(fn){
		if(document.addEventListener){//相容非IE
			document.addEventListener("DOMContentLoaded",function(){
				//登出事件,避免反覆觸發
				document.removeEventListener("DOMContentLoaded",arguments.callee,false);
				fn();//呼叫引數函式
			},false);
		}else if(document.attachEvent){//相容IE
			document.attachEvent("onreadystatechange",function(){
				if(document.readyState==="complete"){
					document.detachEvent("onreadystatechange",arguments.callee);
					fn();
				}
			});
		}
	}

	$(function(){alert("ok1");});
  </script>

另附1:document.readyState屬性

document.readyState:判斷文件是否載入完成。firefox不支援。

這個屬性是隻讀的,傳回值有以下的可能:

0-UNINITIALIZED:XML 物件被產生,但沒有任何檔案被載入。
1-LOADING:載入程式進行中,但檔案尚未開始解析。
2-LOADED:部分的檔案已經載入且進行解析,但物件模型尚未生效。
3-INTERACTIVE:僅對已載入的部分檔案有效,在此情況下,物件模型是有效但只讀的。
4-COMPLETED:檔案已完全載入,代表載入成功。

另附2:幾個重要屬性方法

一、Arguments
該物件代表正在執行的函式和呼叫他的函式的引數。
[function.]arguments[n]
引數function :選項。當前正在執行的 Function 物件的名字。
n :選項。要傳遞給 Function 物件的從0開始的引數值索引。
說明:Arguments是進行函式呼叫時,除了指定的引數外,還另外建立的一個隱藏物件。
Arguments是個類似陣列但不是陣列的物件,說他類似陣列是因為其具備陣列相同的訪問性質及方式,能夠由arguments[n]來訪問對應的單個引數的值,並擁有陣列長度屬性length。還有就是arguments物件儲存的是實際傳遞給函式的引數,而不侷限於函式宣告所定義的引數列表,而且不能顯式建立 arguments 物件。
在此添加了一個說明arguments不是陣列(Array類)的程式碼:
Array.prototype.selfvalue = 1;
alert(new Array().selfvalue);
function testAguments(){
        alert(arguments.selfvalue);
}
執行程式碼您會發現第一個alert顯示1,這表示陣列物件擁有selfvalue屬性,值為1,而當您呼叫函式testAguments時,您會發現顯示的是“undefined”,說明了不是arguments的屬性,即arguments並不是個數組物件。

二、caller
返回一個對函式的引用,該函式呼叫了當前函式。
   functionName.caller
   functionName 物件是所執行函式的名稱。
說明:對於函式來說,caller 屬性只有在函式執行時才有定義。假如函式是由頂層呼叫的,那麼 caller 包含的就是 null 。假如在字串上下文中使用 caller 屬性,那麼結果和 functionName.toString 相同,也就是說,顯示的是函式的反編譯文字。
下面的例子說明了 caller 屬性的用法:
function callerDemo() {
  if (callerDemo.caller) {
      var a= callerDemo.caller.toString();
      alert(a);
 } else{
    alert("this is a top function");
 }
}
function handleCaller() {
    callerDemo();
}
三、callee
返回正被執行的 Function 物件,也就是所指定的 Function 物件的正文。
[function.]arguments.callee
可選項 function 引數是當前正在執行的 Function 物件的名稱。
說明:callee 屬性的初始值就是正被執行的 Function 物件。
callee 屬性是 arguments 物件的一個成員,他表示對函式物件本身的引用,這有利於匿名函式的遞迴或確保函式的封裝性,例如下邊示例的遞迴計算1到n的自然數之和。而該屬性僅當相關函式正在執行時才可用。更有需要注意的是callee擁有length屬性,這個屬性有時候用於驗證還是比較好的。arguments.length是實參度,arguments.callee.length是形參長度,由此能夠判斷呼叫時形參長度是否和實參長度一致。

//callee能夠列印其本身
function calleeDemo() {
  alert(arguments.callee);
}
//遞迴計算
var sum = function(n){
  if (n <= 0) return 1;
  else return n +arguments.callee(n - 1)
}
比較一般的遞迴函式:
var sum = function(n){
  if (1==n) return 1;
  else return n + sum (n-1);
}
呼叫時:alert(sum(100));
其中函式內部包含了對sum自身的引用,函式名僅僅是個變數名,在函式內部呼叫sum即相當於呼叫一個全域性變數,不能很好的體現出是呼叫自身,這時使用callee會是個比較好的方法。

四、apply and call
他們的作用都是將函式繫結到另外一個物件上去執行,兩者僅在定義引數方式有所區分:
     apply(thisArg,argArray);
     call(thisArg[,arg1,arg2…] ]);
即任何函式內部的this指標都會被賦值為thisArg,這可實現將函式作為另外一個物件的方法執行的目的
apply的說明:假如 argArray 不是個有效的陣列或不是 arguments 物件,那麼將導致一個 TypeError。
假如沒有提供 argArray 和 thisArg任何一個引數,那麼 Global 物件將被用作 thisArg,並且無法被傳遞任何引數。
call的說明:call 方法可將一個函式的物件上下文從初始的上下文改變為由thisArg指定的新物件。
假如沒有提供thisArg引數,那麼Global物件被用作thisArg
相關技巧:應用call和apply有一個技巧在裡面,就是用call和apply應用另一個函式(類)以後,當前的
函式(類)就具備了另一個函式(類)的方法或是屬性,這也能夠稱之為“繼承”。看下面示例:

// 繼承的演示
function base() {
  this.member = " dnnsun_Member";
  this.method = function() {
     window.alert(this.member);
  }
}
function extend() {
  base.call(this);
  window.alert(member);
  window.alert(this.method);
}
上面的例子能夠看出,通過call之後,extend能夠繼承到base的方法和屬性。
順便提一下,在javascript框架prototype裡就使用apply來建立一個定義類的模式,
其實現程式碼如下:
var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
}
解析:從程式碼看,該物件僅包含一個方法:Create,其返回一個函式,即類。但這也同時是類的建構函式,其中呼叫initialize,而這個方法是在類建立時定義的初始化函式。通過如此途徑,就能夠實現prototype中的類建立模式

相關推薦

JS原生方法實現JQuery ready()方法

首先說明一下load事件與ready事件的區別 HTML文件載入順序: ①       解析HTML結構 ②       載入外部指令碼和樣式表文件 ③       解析並執行指令碼程式碼 ④       構造HTML DOM模型 ⑤       載入圖片等外部檔

jQuery ready方法實現

很早之前就留下了這個問題,趕上五一放假,好好研究總結一下吧。 首先jq中ready方法和window的onload方法的不同這裡再提一下,首先ready只是dom樹載入完畢,一些img等資源可能還沒載入完成,而onload則是全部載入成功。而且ready方法可以有多個,而onload只能寫一個。還有一個區別

Js原生Ajax和Jquery的Ajax

fun 一個 表示 post 發的 nco 自動 操作 類型轉換 一、Ajax概述 1.什麽是同步,什麽是異步 同步現象:客戶端發送請求到服務器端,當服務器返回響應之前,客戶端都處於等待卡死狀態 異步現象:客戶端發送請求到服務器端,無論服務器是否返回響應,客戶端都可以隨意做

JS原生Ajax&Jquery的Ajax技術&Json

  1.介紹Ajax Ajax = 非同步 JavaScript 和 XML Ajax是一種建立快速動態網頁的技術 通過在後臺與伺服器進行少量資料交換,Ajax 可以使網頁實現非同步更新。這意味著可以不用整個頁面進行重新整理而是可以進行區域性重新整理。這也是使用Ajax

使用原生JavaScript實現jQuery的css選擇器

使用原生JS實現jQuery的css選擇器,考慮以下幾個問題: 1.jQuery用$符號傳參的形式獲取節點的物件:1)傳參有可能是字串;2)有可能是一個節點物件;3)有可能直接是一個函式,就是$(fu

js原生程式碼實現滑鼠拖拽(超簡單)

首先先來看這一張圖 在這種圖中,盒子的大小為512px,並且margin-left:-250px margin-top:140px;並通過一些樣式讓其在中部顯示 這些樣式都不是重要的,這裡加個margin是為了讓其出現拖拽的時候出現滑鼠偏移,好做演示而已,不然margin:0 auto 就可以實現盒子

JS原生程式碼實現輪播圖(無左右滑動,底下圓點按鈕)

先上效果圖: 由於動態圖太大,所以只能截圖了;大致效果,圖片輪播的過程中,底下的灰色提示漸漸出現; 現在來說實現思路:        HTML部分: <div id="content"> <img id="img1" /> &

JS原生程式碼實現圖片輪播無縫切換的一種思路

JS實現圖片輪播是個老生常談的問題,也是新手的必由之路,在這裡提供一種思路,供大家參考: 1.生成DIV做外框,並設定overflow:hidden;  // 每個方法都必須有的 2.建立一個數組arr,放置圖片地址 3.生成兩個並排的圖片img1,img2,初始化圖片地址

在類中定義抽象方法,同時在子類中通過重寫的方法實現該抽象方法

建立抽象類: package my; abstract class Fruit { public String color; public Fruit(){ color="綠色"; } public abstract voi

JS原生編寫實現留言板功能

實現這個留言板功能比較簡單,所以先上效果圖: 實現使用者留言內容,留言具體時間。 <script> window.onload = function(){ var oMess

跨域問題相關知識詳解(原生jsjquery兩種方法實現jsonp跨域)

syn con 加載 developer 兩種方法 ray exe 編寫 分組 1、同源策略 同源策略(Same origin policy),它是由Netscape提出的一個著名的安全策略。同源策略是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽

原生js實現jquery的insertBefore 和insertAfter 方法(四)

網上實現類似方法都是針對相應dom節點進行操作,但許多情況下,會拼接好相應html以字串方式直接插入。 前不久做去jquery的時候用到類似方法,這裡簡單的記錄下,直接上程式碼吧 insertAfter方法實現 //某個元素後插入 insert

Node.js原生及Express方法實現註冊登錄原理

美化 set head ack function charset stat input col 由於本文只是實現其原理,所以沒有使用數據庫,只是在js裏面模擬數據庫,當然實際中還是需要用數據庫的。 1.node.js原生方法 ①html頁面,非常簡單,沒有一絲美化~我們叫它

簡單的實現圖片預覽, 通過原生ajax以及 jQuery兩種方法實現圖片預覽,有更好的辦法可以留言喔................

XML HP OS image end php代碼 append sda ext 1.原生寫ajax實現圖片預覽:   結構:     <input type="file">       <img src="" > JavaScri

原生js替換jQuery各種方法-中文版

You Don't Need jQuery 前端發展很快,現代瀏覽器原生 API 已經足夠好用。我們並不需要為了操作 DOM、Event 等再學習一下 jQuery 的 API。同時由於 React、Angular、Vue 等框架的流行,直接操作 DOM

js原生方法 在元素外部或內部實現新增元素功能(類似jq 的 insert 和 append)

介紹的這個方法是:insetAdjacentHTML() 方法 此方法接收兩個引數: 第一個引數必為下列值: beforebegin:在呼叫的元素外部的前面新增一個目標元素 afterend:在呼叫元素外部的後面新增一個目標元素   afterbegin:在呼叫元素

jQueryready方法原生load的區別

DOM文件載入的步驟為: 解析HTML結構。 載入外部指令碼和樣式表文件。 解析並執行指令碼程式碼。 DOM樹構建完成。//DOMContentLoade 載入圖片等外部檔案。 頁面載入完畢。//load jQuery的ready方法:僅當DOM載入完成

jQuery基於json與cookie實現購物車的方法

構造 exp als com else cookies 一個 可選參數 int /** * 添加商品及數量到購物車cookie中,返回當前商品在cookie中的總數 */ function AddToShoppingCar(id, num, t

js通過一個方法實現對象的深淺拷貝。

str else xtend color extend log typeof ror defined 眾所周知,對象的深淺拷貝是工作中肯定會遇到的問題。所以,今天考慮寫個小的功能來記錄一下 //type:boolean,true-deep,true為深拷貝, functi

C#在WinForm中使用WebKit傳遞js對象實現與網頁交互的方法

復制代碼 dll ssa 所有 添加 spa load net clas 這篇文章主要介紹了C#在WinForm中使用WebKit傳遞js對象實現與網頁交互的方法,涉及針對WebBroswer控件及WebKit控件的相關使用技巧,需要的朋友可以參考下 本文實例講述了C#在W