2014-02-07 122 views
7

我想加載我寫的插件中的datatables JavaScript庫。問題是我在加載外部資源時遇到衝突,因爲當我調用require時,datatables與某些內容衝突。加載外部腳本與requirejs無需訪問配置

<!-- DataTables --> 
<script type="text/javascript" charset="utf8" src="//cdnjs.cloudflare.com/ajax/libs/datatables/1.9.4/jquery.dataTables.min.js"></script> 
... 
<script type="text/javascript"> 
    require(['forum/admin/footer']); <-- crashes here, line 281 
</script> 

這裏的錯誤消息:

Uncaught Error: Mismatched anonymous define() module: function (h){var j=function(e){function o(a,b){var c=j.defaults.columns,d=a.aoColumns.length,c=h.extend({},j.models.oColumn,c,{sSortingClass:a.oClasses.sSortable,sSortingClassJUI:a.oClasses.sSor...<omitted>...ch require.js:8 
B require.js:8 
M require.js:15 
d require.js:26 
requirejs require.js:31 
(anonymous function) (index):281 

由於這是一個插件,我有限制,我試圖解決,如不能夠在調用require.config()開始爲資源指定路徑。我看到有人使用define這樣的電話,如 define('resource', ['http://cdn.ajax.blah']); in this blog 但它看起來不像它可以這樣使用,因爲每個其他例子都有一個函數作爲第二個參數。

回答

6

問題中使用的方法不起作用,因爲DataTables支持AMD。如果它檢測到有一個AMD風格的加載器(RequireJS是),那麼它將自己定義爲一個模塊。但是,無效爲AMD模塊將被加載<script>,因此錯誤消息。

forum/admin/footer模塊應限定爲需要數據表:(有沒有需要對應的數據表模塊,因爲它是一個jQuery插件參數)

define([..., 
     '//cdnjs.cloudflare.com/ajax/libs/datatables/1.9.4/jquery.dataTables.min.js'], 
     function (...) { 
}); 

數關於將此插件集成到已配置RequireJS的站點的更廣泛問題的其他說明:

  1. 可以多次調用來添加配置。然而,如果插件和主代碼之間沒有協調,這可能被認爲是不可接受的。

  2. RequireJS有一個context的概念。該文件談到它加載多個版本,但也許可以有效地適應插件特定的配置。

+0

我可以在require調用中打開函數參數的內部,並加載所有腳本(jquery.js,jquery-ui.js,code.jquery.com/jquery-1.7.2.min.js,jquery.min .js,jquery.datatables.js)但現在我仍然遇到問題,其中dataTable()不是來自jquery對象的可調用函數。 – BrDaHa

+0

jQuery是否不止一次加載?你提到的這種設置就是這種情況發生的風險很高。例如,如果主代碼加載jQuery並使其可以作爲「jquery」模塊訪問,並且您的插件*也加載jQuery但從CDN加載它,那麼DataTables插件將自行安裝在主要加載的jQuery模塊上代碼,而不是插件加載的代碼。 – Louis

+0

我會深入瞭解爲什麼這些都是加載。我實際上更多地使用了它,並且讓它起作用,但是你能否告訴我爲什麼這會起作用:http://jsfiddle.net/zMqZ3/7/而這個不是:http:// jsfiddle。 net/zMqZ3/5/ – BrDaHa

5

有你只是試圖簡單:

require(['//cdnjs.cloudflare.com/ajax/libs/datatables/1.9.4/jquery.dataTables.min.js']); 

它適用於本地文件毫無疑問。

+0

這實際上的工作,只是不是我需要它的方式。它會加載庫很好,但由於它是異步的,在腳本加載之前,$(document).ready()函數會觸發(我在調用數據表插件的地方)。 – BrDaHa