サイトコレクションのURLに関して
SharePoint 2013のサイトコレクションのURLには、
"/"
のほかに、
"/sites/(sc)/"
という形式のものがあります。
"/"
のサイトコレクションのコンテンツエディターWebパーツで、サイトコレクションのスタイルライブラリに配置したJSファイルとCSSファイルを
<script type="text/javascript" src="/Style%20Library/test1.js" /> <link type="text/css" rel="stylesheet" href="/Style%20Library/test2.css" />
という風に記述して読み込んで、後続コードで、これらファイルに定義されている関数を呼び出したりしていました。このコンテンツエディターWebパーツをエクスポートして、後者の形式の環境にアップロードして確認したところ、動きませんでした。。理由は、URLのパスが無効だったからです。以下のように先頭に「/sites/(sc)」を付けて書き換えればOKです。もちろん絶対URLでもOKです。
<script type="text/javascript" src="/sites/(sc)/Style%20Library/test1.js" /> <link type="text/css" rel="stylesheet" href="/sites/(sc)/Style%20Library/test2.css" />
これで解決しましたが、なんかコードの携帯性が悪い気がしたので、どっちの形式でもOKな方法はないか考えてみました。
まず、SharePointのページで、URLがどっちの形式なのかを判別できる
_spPageContextInfo.webServerRelativeUrl
ものがあることがわかりました。(まあ、location.hrefでもsitesがあるかどうかでわかりますが。。)
この部分のパスが取れるようなので、これを使って、JSやCSSを動的にロードしようと思いました。
ただし、ここに入っているのは、
サイトコレクションURL | webServerRelativeUrl |
---|---|
/ | / |
/sites/(sc)/ | /sites/(sc) |
というわけでとりあえず以下のようなコードを考えてみました。これをコンテンツエディターWebパーツのソースの最初のの中に書きます。
(function(){ function LoadJS(src) { var s = document.createElement("script"); s.setAttribute("type", "text/javascript"); s.src = src; document.head.appendChild(s); } function LoadCSS(href) { var l = document.createElement("link"); l.setAttribute("type", "text/css"); l.setAttribute("rel", "stylesheet"); l.setAttribute("href", href); document.head.appendChild(l); } function LoadJSWithSiteUrl(src) { var basePath=_spPageContextInfo.webServerRelativeUrl; LoadJS(((basePath!="/") ? basePath :"")+src); } function LoadCSSWithSiteUrl(href) { var basePath=_spPageContextInfo.webServerRelativeUrl; LoadCSS(((basePath!="/") ? basePath :"")+href); } LoadJSWithSiteUrl("/Style%20Library/test1.js"); LoadCSSWithSiteUrl("/Style%20Library/test2.css"); })();
scriptタグやlinkタグの代わりとしては、長すぎる(やることに対してコードが大袈裟過ぎる)ので実際の業務ではとりあえず使用しないつもりです。(実際の配置環境に応じて書き換えるのが現実的)
もっといい方法がありましたらぜひ教えてください。