我懷疑你dojoConf或數據道場-conf的,使用的是location.pathname
,是正確的?或者可能直接在您的xhr請求中加載WatershedMap.htm?
當您使用http; // www.eg/查看該頁面時,location.pathname
只是一個斜槓「/」。如果這樣,例如,XHR試圖做到這一點:
xhr(location.pathname + "/Templates/WatershedMap.html")...
...那麼請求將真正去//Templates/WatershedMap.html
。
雙斜線表示「protocol relative url」。瀏覽器將採用與當前頁面相同的協議模式(http/https),並在雙斜線後面附加任何內容。
換句話說,這實際上會嘗試向http; //模板發出跨域請求,這會觸發preflight OPTIONS request。
但是,當您的網頁加載http; // www.eg/foo/時,location.pathname
將爲「/ something/something」,並且請求將轉至http; // www.eg/foo/模板/ WatershedMap.htm。
如果您需要幫助來查明問題,您將不得不再分享一些代碼。查看你的代碼location.pathname
,看看你是否找到任何可能相關的東西。
編輯:根據您的意見,您的dojoConf有以下幾點:
packages: [{
name: "Templates",
location: location.pathname.replace(/\/[^/]+$/, "") + "/Templates"
}]
與替換線()中所花費的當前頁面的路徑(例如/foo/bar.htm)並刪除最後一個斜槓及其後的所有內容,然後追加「/ Templates」。
它應該確保無論何時加載的東西,以「模板」啓動(例如,如果你做dojo/text!Templates/Map.htm
,它的外觀在同一個目錄服務器上爲當前頁面。
然而,當你在http; // www.eg/上,路徑名只是一個斜槓,沒有任何東西被刪除,所以你最終得到了「// Templates」,正如前面提到的,這成爲一個協議相對url,模板爲主機名。絕對不是你想要的!另一方面,當你在http; // www.eg/default.htm上時,路徑名是/default.htm,所以所有這些都被剝離了,你只剩下「/模板」。這是你想要的!
你可以通過簡單地替換線解決它:
location: location.pathname.replace(/\/[^/]*$/, "") + "/Templates"
只有一個字符差異(+成爲*)!現在,如果您查看http; // www.eg/,它將刪除單斜槓。
在我看來,最好是使用明確的路徑。如果你知道/模板永遠是http; // www.eg/Templates,你不妨這樣做:
location: "/Templates"
在dojoConfig我指定的包爲: 包:[{ 名:「模板「,位置:location.pathname.replace(/ \/[^ /] + $ /,」「)+」/ Templates「} ]謝謝 – pvitt 2014-10-17 16:31:28
@pvitt我更新了答案(可能太多的細節, :P),看看是否有幫助。 – Frode 2014-10-17 17:15:55
謝謝。這個竅門 - 我將使用服務器上的位置:「/ Templates」 – pvitt 2014-10-17 17:27:20