2008-12-15 94 views
7

我想在drupal站點執行jQuery $(document).ready()。雖然我知道我可以將它粘貼在索引頁面上,但這實在太麻煩了,而且很破爛。jQuery和Drupal頁面加載

我想知道的是在哪裏把這個正確的位置,這也將需要特定的主題,因爲我不希望所有的主題都使用它。

在此先感謝您的幫助。


甜蜜的成功,謝謝你們的幫助,我只是最後一次修正這個問題。現在,我已經得到了這麼多,我需要執行jQuery代碼來更新文檔,我可以使用上下文來修改文檔嗎?

回答

2

VonC充分回答了問題的「如何」部分,因此我將重點討論「where」部分。

如果腳本是主題特定的,那麼放置腳本文件的自然地方就在您的主題中。問題在於,當Drupal進入主題時,$scripts變量已經被「渲染」(用Drupal的說法)成HTML。要在主題圖層中添加腳本,您需要添加腳本並重建變量$scripts

假設你正在使用的Drupal 6,這會去你的theme_preprocess_page()功能:

drupal_add_js(drupal_get_path('theme', 'theme_name') .'/example.js', 'theme'); 
$variables['scripts'] = drupal_get_js(); 

只是改變drupal_get_path()的第二個參數來反映你的主題的名稱,然後更改腳本文件的名稱從example.js到任何你命名你的腳本。

7

不是Drupal的專家,但是這個blog entry建議,從Drupal 6開始,你根本不需要在我們的jQuery代碼中包含$(document).ready()函數。

相反,你可以把所有的代碼,您作爲分配的Drupal.behaviors一個屬性的函數裏面。

在的misc/ directory Drupal的安裝,我們不僅擁有的jquery.js文件,但我們也有drupal.js(和其他一些js文件,控制功能,針對特定網頁或管理功能,如上傳。 js),它管理着Drupal中jQuery的一般用法。

它聲明包含需要被訪問和其他JS文件使用的屬性的目的Drupal的JavaScript對象。例如,Drupal.settings屬性用於將模塊設置數組傳遞給該模塊的js代碼。你這樣做只是在你的PHP代碼中調用drupal_add_js(),並確保第二個參數傳遞的「設置」,例如:

drupal_add_js(array('mymodule' => $array_of_settings), 'setting'); 

在你的js文件,然後,您可以訪問這些設置在Drupal.settings.mymodule。因此,您已經使用mymodule屬性擴展了Drupal.settings對象,mymodule屬性本身就是一個包含所有設置的對象。

Drupal對象的另一個屬性是行爲對象,即Drupal.behaviors,當我們希望我們的模塊添加新的jQuery行爲時,我們只需擴展此對象。爲您的模塊,整個jQuery代碼可以構造這樣的:

Drupal.behaviors.myModuleBehavior = function (context) 
{ 
    //do some fancy stuff 
}; 

但是,你可能不知道,一切確實是一個函數聲明 - 它是如何甚至可以叫什麼名字?那麼,這一切都在drupal.js中查看。它有一個$(document).ready函數調用Drupal.attachBehaviors函數,該函數在通過Drupal.behaviors對象調用它的屬性中的每一個轉週期,通過各種模塊如上宣佈這些全部爲功能,並且在文檔中通過作爲上下文

這樣做的原因是,如果您的jQuery代碼使得AJAX調用導致新的DOM元素被添加到頁面中,您可能需要將您的行爲(例如隱藏所有h3元素或其他)附加到新的內容也是如此。但是,由於它在DOM加載時不存在,並且Drupal.attachBehaviors運行,它沒有附加任何行爲。但是,通過上述設置,您只需撥打Drupal.behaviors.myModuleBehavior(newcontext)即可,其中newcontext是新的AJAX交付內容,因此可以確保這些行爲不會重複整個文檔。請參閱此處以瞭解如何使用此代碼的完整示例。

+0

實際上,您應該調用Drupal.attachBehaviors(newcontext)讓所有註冊的行爲處理newcontext元素(及其子元素)。 – 2011-11-30 18:18:58