2012-01-31 11 views
1

當在module_init()函數中調用drupal_add_js()時,加載的JS庫是否具有與其他模塊訪問庫有關的全局存在?module_init()中的drupal_add_js() - 將JS庫加載到所有模塊中?

例子:

假設有兩個模塊 - 每個需要一個JS庫,並且兩個JS庫具有完全相同的名稱。 JS庫存在於它們各自的模塊目錄中。雖然兩個JS庫的命名是相同的,但它們的內容不同,因此每個模塊都不能使用其他模塊的JS庫 - 這樣做會導致模塊失敗。

IF實際上JS庫裝載有遵循上述方法的全球業務將因此產生的問題。當第一個模塊被加載時,其JS庫將被全局應用於所有模塊。接下來,第二個模塊被加載,其JS庫將被全局應用於所有模塊。在這個階段,兩個模塊都處於活動狀態。由於JS庫的命名相同,因此第二個模塊的JS庫將有效替換第一個模塊的JS庫,從而導致第一個模塊失敗。

謝謝!

回答

1

將模塊添加的JavaScript代碼與drupal_add_js()添加到頁面,並且添加到頁面的JavaScript代碼的列表是一個,並且每個模塊都是全局的。這意味着從模塊添加的JavaScript代碼對每個模塊都是可見的。

事實上,該列表包含在由drupal_add_js()使用一個靜態變量,以及JavaScript代碼使用下面的代碼加入到page.tpl.php中文件的頁面:

<?php print $styles; ?> 
    <?php print $scripts; ?> 

$scripts是使用以下代碼在template_preprocess_page()中初始化,該代碼基於該靜態變量的內容返回一個包含用於<script>標記的HTML的字符串。

$variables['styles']   = drupal_get_css(); 
    $variables['scripts']   = drupal_get_js(); 

如果例如,兩個模塊調用與drupal_add_js(drupal_get_path('module', 'first_module') . '/jquery_plugin_tree')的功能,drupal_add_js(drupal_get_path('module', 'second_module') . '/jquery_plugin_tree'),那麼頁面將包含兩個<script>標籤指向兩個文件,即使文件的內容是在兩種情況下相同。

在兩個模塊使用相同的路徑爲JavaScript文件的話,那麼就會出現只是一個<script>標籤添加。

+0

據我所知,這兩個JS腳本文件是全局訪問。那麼,如果兩個JS腳本文件都具有相同名稱但具有不同行爲的函數,會發生什麼?假設兩個模塊都調用一個名爲foobar的函數,並且在兩個JS腳本文件中都存在函數foobar。但是,每個JS腳本文件中的foobar行爲都是不同的,因此每個模塊都不能使用其他模塊的foobar函數 - 這樣做會導致模塊失敗。在這種情況下,根據你的解釋,函數foobar將是模糊的,其中一個模塊會失敗 - 這是正確的嗎? – kaspnord 2012-01-31 19:54:02

+1

當兩個加載的文件定義了相同的函數時,它發生在JavaScript中通常發生的事情:從上次加載的文件定義的函數覆蓋之前定義的函數。顯然,在這種情況下,其中一個模塊無法正常工作,因爲它的JavaScript代碼沒有執行它期望的功能。 – kiamlaluno 2012-01-31 20:44:57

+0

感謝您的澄清! – kaspnord 2012-01-31 23:09:55

相關問題