如果我們只是做一個單機版的swf,與世隔絕,那么完全不會接觸到接下來我們要說的這么多東西。。。可見提高對你項目的要求是使你學習更多知識的方法。
最常見的,我們有這樣一個主swf(為了簡單說明,再假設只有這么一個swf),另外我們有很多資源:jpg,png,xml,txt,swf等等,我們將之放在一個文件夾Resource下,然后將Resource和主swf放在同一個目錄下,然后我們通過這個swf加載、訪問這些資源,我們發現,非常沒有問題。
然而,當我們最終需要將這個swf放在網頁上,并且將那些資源都放在網頁上,那么他們最好還是跟本地一樣的文件結構存放,但是我們知道,網頁上的swf肯定不會自己跑出來顯示,肯定是要網頁來加載他,在網頁中通過"***.swf?p=...&p2=.."這樣的方式來調用這個swf和傳參數。如果這個網頁也是和swf放在同一個文件夾下,那也是沒問題的。可是我們有可能會有很多這樣的網頁,都放在一個文件夾很難管理,于是我們將他們放在不同的文件,這就會導致這樣的問題:A網頁是放在"../1/2/A",B網頁是"../5/5/B",那么URLRequest的默認路徑是哪個呢?是主swf所在的位置么?錯,其實是看具體調用它的網頁的地址,例如A調用時,URLRequest默認路徑是"../1/2/",這樣的話,如果我們URLRequest()時只會在A或B下面找,而不會在swf所在的目錄中找,自然找不到。所以我們的做法是:獲得主swf的絕對路徑,將之作為URLRequest的路徑。要想獲得該swf的絕對路徑,可以這樣:test = stage.loaderInfo.url; 另外我們要將文件名去掉:
test .slice(0,test.lastIndexOf("/")+1);理論上這在本機上也行得通,但是實際上是:顯示安全沙箱出錯或者是加載資源出錯。為什么呢?
看看這個例子就知道了:
在本機上,我們運行swf,得到的test的值為file:///C://test/test.swf,路徑也就是file:///C://test/
在本機上,我們運行同個目錄下的html文件,發現沙箱問題、加載問題等等問題,test的值是file://C:\test\,這就難怪他找不到了
于是我們要改成:
test .slice(0,test.lastIndexOf("\\")+1); 注意,前面的\只是轉義字符,實際上就是讓路徑遇到最后一個"\"時截止。這樣的話按道理本機運行swf會有問題,但是實際上卻是沒有問題。。。
由于之前這個問題一直纏繞著我,導致我將它和安全沙箱問題混淆了,以為安全沙箱是多么恐怖的事情。
其實安全沙箱很簡單:
當兩個不同文件夾下面的文件(這兩個文件至少一個是swf)要通信時,會出現安全沙箱問題??捎孟旅娴娜我庖粋€方法解決:
1.在swf里面通過Security.allowDomain("另一個文件的地址和名字");
2.在另一個文件所在文件夾下建一個crossdomain.xml,里面寫上:
<cross-domain-policy><allow-access-from domain="允許訪問的對方的地址和名字" /></cross-domain-policy>
3.如果這兩個文件中一個是網頁的話,可以在網頁調用swf的標簽處加上:allowScriptAccess="允許訪問的對方的地址和名字"
4.萬不得已、僅在平時調試時:在C:\windows\system32\Macromed\Flash\FlashPlayerTrust 下面,新建一個隨便的txt文件,里面將你要設置為同個域的文件名(包括路徑),每個一行寫在里面,然后將文件改后綴為.cfg(其實txt應該也沒問題)。