2009-07-06 48 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>