2011-03-25 30 views
1

我(非常)緩慢地獲得一個大規模的靜態文件站點與所有最新的好東西。我正在使用yepnope(與新Modernizr.load一起打包)來處理異步依賴加載,同時我需要它與當前代碼庫向後兼容。Yepnope和「代理」 - jQuery的ready()函數

這就要求我要麼包裹在yepnope()的包裝每一個jQuery的調用站點範圍(太大的任務在不遠的將來做),更有創意的解決方案是代理 jQuery的ready()功能通過我自己的,並延遲任何$代碼的執行,直到從yepnope回調準備好了... jQuery的實際ready()函數將是處理程序,一旦yepnope測試滿足jQuery的準備。合理?

問題在手:

我在這裏建立一個災難? 是否適用於我的 短期問題 意大利麪 以DOM爲中心的代碼?

更新#3

一個更想好了,出來的辦法,也佔了不準備在那裏匿名函數剛過直的jQuery。這是第三次嘗試儘可能少地保留$(function(){})調用以及$(document).ready()調用的功能。

(function(window, undefined) { 
    var jQuery = (function(fn) { 
    if (typeof fn === 'function') { 
     yepnope({ 
      test: window.jQuery.length, 
      complete: function() { 
       fn(); 
      } 
     }); 
    } 
    var jQuery = 
     _jQuery = window.jQuery, 
     _$ = window.$; 
    jQuery = jQuery.prototype = { 
     constructor: jQuery, 
     ready: function(fn) { 
      yepnope({ 
       test: window.jQuery.length, 
       complete: function() { 
        fn(); 
       } 
      }); 
     } 
    }; 
    return jQuery; 
    }); 
    window.jQuery = window.$ = jQuery; 
    })(window); 

這是相當性感的,因爲雖然它複製的jQuery的裝載行爲,它不具有的長度,本質上......用yepnope來測試window.jQuery.length,它只會返回true一次REAL加載jQuery(代理沒有length)!

我認真尋求任何批評 - 尤其是來自亞歷克斯·塞克斯頓:)哈哈

+0

我相信這是儘可能我自己。目前,我的主要目標是利用jQuery的'ready'來重寫所有代碼,以便與yepnope一起打包。只是試圖提供一個分階段的方法來立即獲得一些異步優勢。 – philwinkle 2011-03-25 20:29:32

+0

嗨!我想,唯一讓我困惑的是,當jQuery不可用時,這種情況不會馬上執行嗎?也許你會添加一個'load'部件或者其他的東西,但是現在,它總是調用'complete'然後執行。我認爲最好的行動方式是創建一個jsfiddle或一個jsbin示例。我很樂意介紹一些代碼。 – 2011-03-27 02:30:52

回答

5

儘量選用例如philwinkle的,它不工作(至少造成臨時的jQuery可變曾在FF3.6。長度支撐)。

搜索了一段時間,發現jQl, asynchronous jQuery loader,有一種方法可以在實際的jQuery加載之前調用$(document).ready。借了一些代碼,得到:

<script type="text/javascript"> 
var jQ = { 
    queue: [], 
    ready: function (f) { 
     if (typeof f=='function') { 
      jQ.queue.push(f); 
     } 
     return jQ; 
    }, 
    unq: function() { 
     for (var i = 0; i < jQ.queue.length; i++) jQ.queue[i](); 
     jQ.queue = null; 
    } 
}; 
if (typeof window.jQuery == 'undefined') { window.jQuery = window.$ = jQ.ready; } 

yepnope({ 
    load: '//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js', 
    complete: function() { 
     jQ.unq(); 
    } 
}); 
</script> 
相關問題