作為在SharePoint應用程式中使用JavaScript的第一步,就是要知道如何将一個寫好的.js檔案,引用到頁面上。嗯,你可能覺得這個話題太簡單了,"引用一個.js檔案不就是在頁面上方加一個<script>标簽嗎?"但是我們要考慮的事情,可通常要比這複雜得多。比如,我們大部分的.js檔案,可能都是需要放置在網站中的所有頁面上的,修改網站裡面的每一個.aspx顯然不是好主意,我們需要一個更好、更靈活的方案。
1、直接在母版頁上引用.js檔案
由于SharePoint網站中所有的頁面,都預設使用同一個母版頁(.master檔案),是以在母版頁上去引用一個.js檔案,就會自動讓所有使用這個母版頁的網站頁面,都引用到這個.js檔案。在母版頁的<head>區域,添加相應的<script>标簽,來引用我們所需的.js檔案,如下圖所示。

(雖然上面的截圖是使用了SharePoint Designer,但是我并不建議你在生産環境中,直接使用SPD來對母版頁進行這樣的修改。正确的做法應該是在Visual Studio項目中維護對自定義母版頁的修改,并且以Module方式将自定義母版頁釋出到網站裡面。)
在母版頁中直接引用.js,簡單、直接。這種方法非常适合引用一些幾乎所有頁面上都會用到的JavaScript庫,比如jQuery。在母版頁上完成了對jQuery的引用之後,網站中所有頁面(和頁面上的所有自定義Web Part)中的JavaScript代碼,就都可以直接使用jQuery庫了。整個項目中,如果有一些公用的自定義JavaScript庫檔案,也可以用這種方式來進行引用。
但是要注意的一點是,你需要認真考慮是否将.js檔案的引用放到<head>區域中。這是因為頁面在載入一個.js檔案後,需要等待這個.js檔案運作完成,才能繼續後面HTML内容的渲染 (因為JS代碼有可能修改DOM,是以得等到它運作完成,才能繼續)。如果你的自定義.js檔案中的代碼非常複雜且耗時,那麼會影響整個HTML頁面的渲染速度 (即使伺服器能很快的運作完成頁面後端的代碼并将HTML内容發送回用戶端的浏覽器)。是以如果不是一定需要,你可以将對.js檔案的引用,放到頁面的最後面,這樣頁面可以先将HTML内容渲染出來,然後再載入并運作.js檔案。
2、使用SPWeb.CustomJavaScriptFileUrl屬性
下面的PowerShell腳本示範了如何為SPWeb.CustomJavaScriptFileUrl設定一個值。我使用PowerShell隻是出于示範的目的,在你的項目中,這些代碼通常會用C#實作,并很可能寫在一個Feature的激活事件中,使得Feature被激活時,就設定好網站中所有頁面需要載入的腳本。
SPWeb.CustomJavaScriptFileUrl屬性的一個問題,就是它隻能用來指定一個.js檔案。但是這個問題很容易克服,我們可以讓被引用的.js檔案隻是一個"啟動器",它負責去載入其它必需的.js檔案。就類似這樣:
當然你也可以把這個"啟動器"寫得稍微複雜、靈活一點。
SPWeb.CustomJavaScriptFileUrl屬性的另外一個問題,就是通過它所引用的.js檔案,必然在<head>區域就被加載。之前說過,如果你的.js檔案中的代碼比較複雜耗時,那麼它會影響到頁面的整體加載速度。這個問題可以通過一些JavaScript的技巧來避免。如下圖所示範的代碼,代碼首先立即載入jquery.js檔案,然後在頁面DOM加載完成之後,再載入其它的.js檔案。
3、使用Custom Action
在大部分情況下,使用Custom Action的目的,都是為了向界面上添加自定義的菜單項或其它UI元素,但是Custom Action其實也是可以用來向頁面上添加.js引用的。
在Visual Studio中,向SharePoint項目添加一個"空元素",然後如下所示,在<Elements>元素中添加一個<CustomAction>元素。"Location='ScriptLink'"屬性告訴SharePoint,這個<CustomAction>的目的是為了向頁面"注入"腳本。"ScriptSrc"屬性用來指定要引用的.js檔案的位置。在"ScriptSrc"屬性裡面,是可以使用"~site"和"~sitecollection"标記,用來表示網站和網站集的根目錄的,比如:"ScriptSrc='~site/ScriptLibrary/Start.js'"。
如果要引用多個.js檔案,也很好辦,隻需要添加多個<CustomAction>标簽即可。注意每個<CustomAction>的"Sequence"屬性,這個屬性的值用來辨別每個.js引用的載入順序。SharePoint會按照"Sequence"屬性所指定的順序 (而并非<CustomAction>标簽的聲明順序),依次引用.js檔案。
Custom Action最大的好處,在于你可以将它放在一個Feature裡面。使用者激活Feature,網站就會引用Custom Action所指定的.js檔案,使用者停用Feature,這些.js檔案就不會被引用。這是一個巨大的靈活性。
Custom Action的一個限制,就是它的"ScriptSrc"屬性所引用的.js檔案,要麼位于_layouts中,要麼位于網站或網站集裡面。它是不能用來引用一個外部的.js檔案的,比如,"ScriptSrc=' http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.8.2.min.js'"是不會工作的。當然,你可以使用之前說過的"啟動器"的方案,來解決這個問題,先通過Custom Action引用一個"啟動器".js檔案,然後在這個"啟動器"裡面去載入其它外部的.js檔案。
4、自定義方案
如果上述的方案你都覺得不适合(或不夠強大/靈活…),那麼你可以建構一個自定義的.js檔案載入方案。一個自定義的.js檔案加載方案應該嘗試解決如下問題:
可以引用網站内部、或外部任意位置的.js檔案;
可以指定某個.js檔案的加載時機:在<head>區域/DOM加載完成之後/整個頁面加載完成之後等等
可以指定将某個.js檔案隻加載到特定頁面,比如:清單的Forms頁面/清單的建立清單項頁面(New Form)/某個特定URL的頁面
可以指定多個.js檔案之間的依賴關系,并按照依賴關系順序加載
文本概要的講述了在SharePoint網站中引用.js檔案的幾種常見方式,在後面的文章裡面,我們将繼續講述将.js檔案放置到哪裡比較合适、如何在Web Part上使用JavaScript腳本等話題。
本文轉自SanMaoSpace部落格園部落格,原文連結:http://www.cnblogs.com/SanMaoSpace/p/5055488.html,如需轉載請自行聯系原作者