2014-03-13 49 views
-1

我想裝飾的jQuery的document.ready功能裝飾的jQuery的document.ready功能

<html> 
<head> 
    <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script> 
    <script type="text/javascript"> 
     $(function() { 
      console.log("ready2"); 
     }); 
    </script> 
    <script type="text/javascript"> 
     $.fn.ready = (function(fn) { 
      return function() { 
       console.log("ready1"); 
       return fn.apply(this, arguments); 
      } 
     })($.fn.ready); 
    </script> 
</head> 
<body> 
    <img src="http://deelay.me/1000?http://my-site.com/image.gif" /> 
</body> 
</html> 

什麼,我期待看到 - 是「就緒1」,並在瀏覽器控制檯「READY2」,但是有隻有「ready2」。我錯過了什麼?

FiddleJS:http://jsfiddle.net/GXCnu/

更新#1: 那麼實際上它很清楚,爲什麼它不工作 - 它的,因爲我打電話準備()首先....然後另外一個問題 - 如何調用自定義函數之前$ .ready()會被觸發嗎?

回答

1

jQuery的只是結合任一或onreadystatechange事件DOMContentLoaded[1]。它檢查是否document.readyState === "complete"

我的一個想法是綁定一個事件來檢查,而不是this.readyState === 'interactive'。這應該在"complete"之前發生。

$(function() { 
    console.log("ready2"); 
}); 

$(document).on('readystatechange', function(){ 
    if(this.readyState === 'interactive'){ 
     console.log('ready1'); 
    } 
}); 

DEMO:http://jsfiddle.net/vP5vZ/

http://james.padolsey.com/jquery/#v=1.6.2&fn=jQuery.bindReady

+0

謝謝 - 它可能是最符合我需求的。好的解決方案 – Vytalyi

+0

我不知道它是否是最好的解決方案(或者它是否可以在所有瀏覽器中運行),但我很高興能夠提供幫助:-) –

2

您先致電ready(),然後才裝飾它。反轉訂單。

+0

在後頭部沒有。就緒$呼叫處理完畢? – Vytalyi

+1

立即調用'$ .ready',並安排您傳遞的任何內容作爲文檔準備就緒時要調用的參數。 – Kos

+0

@Vytalyi:事件在完全處理後觸發,是的。但是'$(function(){'和'$(document).ready(function(){'是一樣的,所以你在修改它之前調用'.ready' * –

-1

這是修復:

$.fn.ready = (function(fn) { 
     return function() { 
      console.log("ready1"); 
      return fn.apply(this, arguments); 
     } 
    })($.fn.ready)(); 

注意()在分號之前右結束。您必須調用返回的內部函數。

+0

不可以。您不想調用內部函數。你希望它被返回並存儲在'$ .fn.ready'中。 –