爲了獲取從html傳入的URL參數,一般傳遞的順序是:html容器—>JavaScript—>ExternalInterface—>ActionScriptjavascript
親測方法3可用php
關於flex如何向某個頁面傳遞參數,我之前有這方面的筆記,flex經過非AmfPHP途徑與後臺交互中URLLoader+URLRequest+URLVariables方法也能夠用於向flex頁面傳參數。後臺php端接收參數很簡單,如今討論一下flex端如何處理頁面url傳遞過來的參數。
網上這方面文章很多,不過都多少有些問題,我總結一下,寫在這裏。
方法一:flex接收網頁傳值!~ html
Code
1<?xml version="1.0" encoding="utf-8"?>
2<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
3 applicationComplete="initApp()">
4
5<mx:Label text=
6"Will run the app deployed at http://{serverURL}:{port}/MyGreatApp.html" />
7<mx:Script>
8 <![CDATA[
9 [Bindable]
10 var serverURL:String;
11
12 [Bindable]
13 var port:String;
14
15 function initApp():void{
16 serverURL=Application.application.parameters.serverURL;
17 port=Application.application.parameters.port
18 }
19 ]]>
20</mx:Script>
21</mx:Application>java
做者在文章最後寫:「外部以test.swf?serverURL=String&port=String 的形式在網頁中調用!」
這樣作確實沒有問題,但平時的flex程序都是以html爲容器將swf文件包裝了起來。若是用test.html?serverURL=String&port=String的方式傳遞參數,再用該文章中提供的代碼就不能獲取參數了。數組
方法二:flex 3 從頁面url中取參數取值
這個方法是園子裏的人提出的。
當經過http://xxxxx/xxx.mxml?name=hermit或http://xxxxx/xxx.swf?name=hermit時,能夠直接調用this.parameters.name在flex裏面取url參數。
當經過http://xxxxx/xxx.html?name=hermit時則須要修改js文件才能夠繼續使用this.parameters.name
頁面中加入js方法瀏覽器
function getparafromurl() {
var url,pos,parastr,para;
url = window.location.href;
pos = url.indexOf("?")
parastr = url.substring(pos+1);
return parastr;
}app
在 AC_FL_RunContent中加入函數
"FlashVars", getparafromurl()post
若是頁面是flex builder 經過模板自動生成的
那麼須要在index.template.html文件中加入上面的代碼.
可是若是但願js被禁用的時候,flex依然能工做
則須要把……感興趣的同窗查看原文吧,不太推這種方法。學習
方法三:flex程序如何獲取html容器傳遞的URL參數值
本方法比較成熟了,把原理講的也很清楚。
咱們常常在Flex程序須要用從外部html向swf文件傳遞參數,(相似 test.html?name=jex&address=chengdu 地址中問號後面的參數對值)
首先要明確的是,通常咱們在使用Flex Builder進行Flex開發時,編譯後自動以html容器將swf文件包裝起來了,因此通常來講,咱們直接運行的是html,而非直接運行生成的 swf文件。而Flex應用程序要獲取外部html容器傳入的參數,一般是用JavaScript來獲取到相應參數,再讓javaScript傳遞給 ActionScript。
在Flex應用程序中,咱們一般要用到ExternalInterface類,ExternalInterface主要用來讓 ActionScript直接與Flash Player容器進行通訊。ExernalInterface類一般做爲ActionScript與JavaScript進行通訊的橋樑。
爲了獲取從html傳入的URL參數,一般傳遞的順序是:html容器—>JavaScript—>ExternalInterface—>ActionScript
具體實現:
在Flex中,經過調用ExternalInterface的call方法,參數爲要調用的JavaScript函數,並返回JS函數調用的結果。如:
ExternalInterface.call("JavaScript函數");
在JS中,Window對象用來表明一個Web瀏覽器窗口,而窗口的Location對象則表明了當前顯示的URL,因而,要想獲取URL中的參數,
一般使用下面的語句:
window.location.href.toString //獲得URL的完整文本
window.location.search.substring //獲得問號後面部分的URL文本
注:這裏window屬性引用的Window對象自身,而Window對象的location屬性引用的是Location對象。
一般的參數對以test.html?name=jex&address=chengdu 這樣的形式給出,在獲取到問號後面的URL文本後,還需要對其分解,這時有兩種途徑,一種是分解過程在JS中完成,而後將最終的結果值傳遞給Flex,另外一種是將分解的過程放在Flex中去完成。在這裏使用的後者(這樣只需寫AS代碼,而不用去寫JS代碼了^_^)
Code
1<?xml version="1.0" encoding="utf-8"?>
2<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
3 creationComplete="init()">
4<mx:Script>
5 <![CDATA[
6 import mx.controls.Alert;
7
8 private var params:Object;
9
10 private function init():void {
11 btnID.addEventListener(MouseEvent.CLICK, clickHandler);
12 }
13
14 private function clickHandler(evt:Event):void {
15 var args:Object = getParams();
16 if(args.name != null && args.address != null) {
17 dispID.text = "name:" + args.name + "\n" + "address:" + args.address;
18 }
19 }
20
21 private function getParams():Object {
22 params = {};
23 var query:String = ExternalInterface.call("window.location.search.substring", 1);
24 if(query) {
25 var pairs:Array = query.split("&");
26 for(var i:uint=0; i < pairs.length; i++) {
27 var pos:int = pairs[i].indexOf("=");
28 //Alert.show(String(pos));
29 if(pos != -1) {
30 var argname:String = pairs[i].substring(0, pos);
31 var value:String = pairs[i].substring(pos+1);
32
33 params[argname] = value;
34 }
35 }
36 }
37 return params;
38 }
39 ]]>
40</mx:Script>
41 <mx:Button id="btnID" y="118" label="GetParams" horizontalCenter="0"/>
42 <mx:TextArea id="dispID" y="47" width="200" horizontalCenter="0"/>
43
44</mx:Application>
這個方法的惟一不足在於須要知道傳過來的參數的名字。而我做了一些改動,將其16-18行用一個for/in語句代替:
1 for(var obj:Object in args){
2 dispID.text += obj.toString()+':'+args[obj.toString()]+'\n';
3 }
這其中遇到了object對象的取值問題,參考了:Flex學習--Object&&String
建立Object的方法很簡單,你能夠使用new操做符定義一個Object,以下所示:
var obj:Object = new Object();
obj.name = 「flex」;
obj.version = 「2」;
這裏,咱們生成了一個新Object對象obj,它有兩個屬性name和version。固然,咱們也能夠經過賦初值的方式直接定義Object對象:
var obj:Object = {name: 」flex」, version: 「2」}
可能你已經看到,Object正是FLEX中的關聯數組(對應於Java中的Map)。在上面的示例中,obj對象共定義了兩組鍵、值對,它們分別是(鍵:name,值:flex)以及(鍵:version,值:2)。我還想告訴你的是,Object的使用方式比Map更簡單。你既能夠經過.訪問,也能夠經過[]訪問鍵值。例如:
var myAssocArray:Object = {fname:"John", lname:"Public"};
trace(myAssocArray.fname); // Output: John
trace(myAssocArray["lname"]); // Output: Public
myAssocArray.initial = "Q";
trace(myAssocArray.initial); // Output: Q
今天碰到要在一個頁面獲取另一個頁面url傳過來的參數,一開始很本能的想到了用 split("?")這樣一步步的分解出須要的參數。
後來想了一下,確定會有更加簡單的方法的!因此在網上找到了兩個很又簡單實用的方法,mark下
方法一:正則分析法
function getQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); var r = window.location.search.substr(1).match(reg); if (r != null) return unescape(r[2]); return null; }
這樣調用:
alert(GetQueryString("參數名1")); alert(GetQueryString("參數名2")); alert(GetQueryString("參數名3"));
方法二:
<SPAN style=
"FONT-SIZE: 16px"
><Script language=
"javascript"
>
function
GetRequest() {
var
url = location.search;
var
theRequest =
new
Object();
if
(url.indexOf(
"?"
) != -1) {
var
str = url.substr(1);
strs = str.split(
"&"
);
for
(
var
i = 0; i < strs.length; i ++) {
theRequest[strs[i].split(
"="
)[0]]=unescape(strs[i].split(
"="
)[1]);
}
}
return
theRequest;
}
</Script></SPAN>
|
這樣調用:
<Script language="javascript"> var Request = new Object(); Request = GetRequest(); var 參數1,參數2,參數3,參數N; 參數1 = Request['參數1']; 參數2 = Request['參數2']; 參數3 = Request['參數3']; 參數N = Request['參數N']; </Script>