2009-07-06 52 views
0

在所附的Flex代碼,我試圖調用它的HTML包裝器的JavaScript函數。 的例子也住在: http://www.cse.epicenterlabs.com/mbm/ajax_api.html 我面對的是,我必須按一下按鈕兩次 以獲得所需的輸出的問題。似乎在設置 「輸出」變量時有一些延遲。我怎樣才能在一次點擊中獲得javascript函數的輸出?問題從javascript函數返回值彎曲

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
<mx:TextArea x="209" y="139" height="245" width="318" id="text1" fontSize="28"/> 
    <mx:Script> 
     <![CDATA[ 
       import mx.rpc.events.ResultEvent; 
    import flash.external.*; 

    public function callWrapper():void { 
     var s:String; 
     if (ExternalInterface.available) { 
      var wrapperFunction:String = "initialize"; 
      s = ExternalInterface.call(wrapperFunction,text1.text); 
      text1.text = s; 

     } else { 
      s = "Wrapper not available"; 
     } 
     trace(s); 
    } 

       ]]> 
    </mx:Script> 
    <mx:Button x="92" y="118" label="Transliterate" click="callWrapper()"/> 
</mx:Application> 

HTML包裝:

<!-- saved from url=(0014)about:internet --> 
<html lang="en"> 

<!-- 
Smart developers always View Source. 

This application was built using Adobe Flex, an open source framework 
for building rich Internet applications that get delivered via the 
Flash Player or to desktops via Adobe AIR. 

Learn more about Flex at http://flex.org 
// --> 

<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

<!-- BEGIN Browser History required section --> 
<link rel="stylesheet" type="text/css" href="history/history.css" /> 
<!-- END Browser History required section --> 

<title></title> 
<script src="AC_OETags.js" language="javascript"></script> 

<!-- BEGIN Browser History required section --> 
<script src="history/history.js" language="javascript"></script> 
<!-- END Browser History required section --> 

<style> 
body { margin: 0px; overflow:hidden } 
</style> 
<script language="JavaScript" type="text/javascript"> 
<!-- 
// ----------------------------------------------------------------------------- 
// Globals 
// Major version of Flash required 
var requiredMajorVersion = 9; 
// Minor version of Flash required 
var requiredMinorVersion = 0; 
// Minor version of Flash required 
var requiredRevision = 28; 
// ----------------------------------------------------------------------------- 
// --> 
</script> 
</head> 

<body scroll="no"> 
     <script type="text/javascript" src="http://www.google.com/jsapi"></script> 
    <script type="text/javascript"> 

    google.load("language", "1"); 

     var output; 
    function initialize(input) { 
     google.language.transliterate([input], "en", "hi", function(result) { 
     if (!result.error) { 
      if (result.transliterations && result.transliterations.length > 0 && 
      result.transliterations[0].transliteratedWords.length > 0) { 
      output = result.transliterations[0].transliteratedWords[0]; 
      } 
     } 
     }); 
    return output; 
    } 
    </script> 
    <script language="JavaScript" type="text/javascript"> 
<!-- 
// Version check for the Flash Player that has the ability to start Player Product Install (6.0r65) 
var hasProductInstall = DetectFlashVer(6, 0, 65); 

// Version check based upon the values defined in globals 
var hasRequestedVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision); 

if (hasProductInstall && !hasRequestedVersion) { 
    // DO NOT MODIFY THE FOLLOWING FOUR LINES 
    // Location visited after installation is complete if installation is required 
    var MMPlayerType = (isIE == true) ? "ActiveX" : "PlugIn"; 
    var MMredirectURL = window.location; 
    document.title = document.title.slice(0, 47) + " - Flash Player Installation"; 
    var MMdoctitle = document.title; 

    AC_FL_RunContent(
     "src", "playerProductInstall", 
     "FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"", 
     "width", "100%", 
     "height", "100%", 
     "align", "middle", 
     "id", "ajax_api", 
     "quality", "high", 
     "bgcolor", "#869ca7", 
     "name", "ajax_api", 
     "allowScriptAccess","sameDomain", 
     "type", "application/x-shockwave-flash", 
     "pluginspage", "http://www.adobe.com/go/getflashplayer" 
    ); 
} else if (hasRequestedVersion) { 
    // if we've detected an acceptable version 
    // embed the Flash Content SWF when all tests are passed 
    AC_FL_RunContent(
      "src", "ajax_api", 
      "width", "100%", 
      "height", "100%", 
      "align", "middle", 
      "id", "ajax_api", 
      "quality", "high", 
      "bgcolor", "#869ca7", 
      "name", "ajax_api", 
      "allowScriptAccess","sameDomain", 
      "type", "application/x-shockwave-flash", 
      "pluginspage", "http://www.adobe.com/go/getflashplayer" 
    ); 
    } else { // flash is too old or we can't detect the plugin 
    var alternateContent = 'Alternate HTML content should be placed here. ' 
    + 'This content requires the Adobe Flash Player. ' 
    + '<a href=http://www.adobe.com/go/getflash/>Get Flash</a>'; 
    document.write(alternateContent); // insert non-flash content 
    } 
// --> 
</script> 
<noscript> 
    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 
      id="ajax_api" width="100%" height="100%" 
      codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab"> 
      <param name="movie" value="ajax_api.swf" /> 
      <param name="quality" value="high" /> 
      <param name="bgcolor" value="#869ca7" /> 
      <param name="allowScriptAccess" value="sameDomain" /> 
      <embed src="ajax_api.swf" quality="high" bgcolor="#869ca7" 
       width="100%" height="100%" name="ajax_api" align="middle" 
       play="true" 
       loop="false" 
       quality="high" 
       allowScriptAccess="sameDomain" 
       type="application/x-shockwave-flash" 
       pluginspage="http://www.adobe.com/go/getflashplayer"> 
      </embed> 
    </object> 
</noscript> 
</body> 
</html> 

回答

2

那是因爲google.language.transliterate不是同步操作。你initialize函數返回之前就google.language.transliterate運行完畢後(這就是爲什麼要連接一個回調函數它完成後運行)。

你需要音譯完成後回調的動作功能。探索ExternalInterface.addCallback()以添加可從javascript調用的動作函數。

1

在JavaScript代碼google.language.transliterate的調用是異步的,這就是爲什麼它好像你必須按下按鈕兩次。作爲第四個參數傳遞的匿名函數在加載某些數據之前不會運行。

也許你應該只調用google.language.transliterate,然後躲在它在處理之前表現出一定的負荷指標?這樣你會看到它何時加載數據。

0

謝謝你們,它的工作。 我在這裏附上了工作代碼:

Flex代碼:(ajax_api.mxml

<?xml version="1.0" encoding="utf-8"?> 
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
     <mx:TextArea x="209" y="139" height="245" width="318" id="text1" fontSize="28"/> 
     <mx:Script> 
      <![CDATA[ 
       import mx.rpc.events.ResultEvent; 
     import flash.external.*; 

     public function callWrapper():void { 
      var s:String; 
      if (ExternalInterface.available) { 
     ExternalInterface.addCallback("g", g); 
       var wrapperFunction:String = "initialize"; 
       ExternalInterface.call(wrapperFunction,text1.text); 

      } else { 
       s = "Wrapper not available"; 
      } 
      trace(s); 
     } 
     public function g(str:String):void 
     { 
      text1.text = str; 
     } 

       ]]> 
     </mx:Script> 
     <mx:Button x="75" y="50" label="Enter some text and click this button to see the transliteration output" click="callWrapper()" height="37"/> 
    </mx:Application> 

HTML包裝:

<!-- saved from url=(0014)about:internet --> 
<html lang="en"> 

<!-- 
Smart developers always View Source. 

This application was built using Adobe Flex, an open source framework 
for building rich Internet applications that get delivered via the 
Flash Player or to desktops via Adobe AIR. 

Learn more about Flex at http://flex.org 
// --> 

<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

<!-- BEGIN Browser History required section --> 
<link rel="stylesheet" type="text/css" href="history/history.css" /> 
<!-- END Browser History required section --> 

<title>ajax_api</title> 
<script src="AC_OETags.js" language="javascript"></script> 

<!-- BEGIN Browser History required section --> 
<script src="history/history.js" language="javascript"></script> 
<!-- END Browser History required section --> 

<style> 
body { margin: 0px; overflow:hidden } 
</style> 
<script language="JavaScript" type="text/javascript"> 
<!-- 
// ----------------------------------------------------------------------------- 
// Globals 
// Major version of Flash required 
var requiredMajorVersion = 9; 
// Minor version of Flash required 
var requiredMinorVersion = 0; 
// Minor version of Flash required 
var requiredRevision = 28; 
// ----------------------------------------------------------------------------- 
// --> 
</script> 
</head> 

<body scroll="no"> 
     <script type="text/javascript" src="http://www.google.com/jsapi"></script> 
    <script type="text/javascript"> 

    google.load("language", "1"); 
function thisMovie(movieName) 
{ 

    if(navigator.appName.indexOf("Microsoft")!=-1) 
    { 
     alert("microsoft"); 
     return window[movieName]; 
    } 
    else 
    { 
     return document[movieName]; 
    } 
} 

function initialize(input) { 
     google.language.transliterate([input], "en", "hi", function(result) { 
     if (!result.error) { 
      var container = document.getElementById("transliteration"); 
      if (result.transliterations && result.transliterations.length > 0 && 
      result.transliterations[0].transliteratedWords.length > 0) { 
      output = result.transliterations[0].transliteratedWords[0]; 
     thisMovie("ajax_api").g(output); 
      } 
     } 
     }); 
    } 

    </script> 
    <script language="JavaScript" type="text/javascript"> 
<!-- 
// Version check for the Flash Player that has the ability to start Player Product Install (6.0r65) 
var hasProductInstall = DetectFlashVer(6, 0, 65); 

// Version check based upon the values defined in globals 
var hasRequestedVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision); 

if (hasProductInstall && !hasRequestedVersion) { 
    // DO NOT MODIFY THE FOLLOWING FOUR LINES 
    // Location visited after installation is complete if installation is required 
    var MMPlayerType = (isIE == true) ? "ActiveX" : "PlugIn"; 
    var MMredirectURL = window.location; 
    document.title = document.title.slice(0, 47) + " - Flash Player Installation"; 
    var MMdoctitle = document.title; 

    AC_FL_RunContent(
     "src", "playerProductInstall", 
     "FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"", 
     "width", "100%", 
     "height", "100%", 
     "align", "middle", 
     "id", "ajax_api", 
     "quality", "high", 
     "bgcolor", "#869ca7", 
     "name", "ajax_api", 
     "allowScriptAccess","sameDomain", 
     "type", "application/x-shockwave-flash", 
     "pluginspage", "http://www.adobe.com/go/getflashplayer" 
    ); 
} else if (hasRequestedVersion) { 
    // if we've detected an acceptable version 
    // embed the Flash Content SWF when all tests are passed 
    AC_FL_RunContent(
      "src", "ajax_api", 
      "width", "100%", 
      "height", "100%", 
      "align", "middle", 
      "id", "ajax_api", 
      "quality", "high", 
      "bgcolor", "#869ca7", 
      "name", "ajax_api", 
      "allowScriptAccess","sameDomain", 
      "type", "application/x-shockwave-flash", 
      "pluginspage", "http://www.adobe.com/go/getflashplayer" 
    ); 
    } else { // flash is too old or we can't detect the plugin 
    var alternateContent = 'Alternate HTML content should be placed here. ' 
    + 'This content requires the Adobe Flash Player. ' 
    + '<a href=http://www.adobe.com/go/getflash/>Get Flash</a>'; 
    document.write(alternateContent); // insert non-flash content 
    } 
// --> 
</script> 
<noscript> 
    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 
      id="ajax_api" width="100%" height="100%" 
      codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab"> 
      <param name="movie" value="ajax_api.swf" /> 
      <param name="quality" value="high" /> 
      <param name="bgcolor" value="#869ca7" /> 
      <param name="allowScriptAccess" value="sameDomain" /> 
      <embed src="ajax_api.swf" quality="high" bgcolor="#869ca7" 
       width="100%" height="100%" name="ajax_api" align="middle" 
       play="true" 
       loop="false" 
       quality="high" 
       allowScriptAccess="sameDomain" 
       type="application/x-shockwave-flash" 
       pluginspage="http://www.adobe.com/go/getflashplayer"> 
      </embed> 
    </object> 
</noscript> 
</body> 
</html> 
1

您可以使用腳本來創建一個HTML文件,使用Flex HTML組件。

實施例:

<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:HTML id="html" 
     width="100%" 
     height="100%" 
     location="{serverIp}/Translit.html"/> 
</mx:WindowedApplication>