从查询返回loadvars的Actionscript 2问题

时间:2011-01-23 04:40:10

标签: flash actionscript actionscript-2 loadvars

我似乎在对象中有一些无关的字符,我是Actionscript的新手,所以我不知道它们是否属于那里,我似乎无法提取感兴趣的参数。这是代码段:

_root.buttonBkg.onPress = function() {
   var wikiload1:LoadVars = new LoadVars();
   var wikiload2:LoadVars = new LoadVars();
   wikiload1.wikiname = wikiterm;
   wikiload2.onLoad = function(success:Boolean) {
    trace("entered wikiload1.onLoad function")
    if (success) {
     _root.createTextField("wikidisplay", _root.getNextHighestDepth(), 0, 150, 550, 380);
     _root.wikidisplay.html = true;
     _root.wikidisplay.htmlText = wikiload2.displayhtml;
     trace("wikiload2.displayhtml is" + wikiload2.displayhtml);
     trace(wikiload2.toString());
     trace("success route");
    } 
    else {
     _root.createTextField("wikidisplay", _root.getNextHighestDepth(), 0, 150, 550, 380);
     _root.wikidisplay.text = "Error connecting to server.";
     trace("error route");
    }
   };
   wikiload1.sendAndLoad("http://myURL.script.py", wikiload2, "POST");
   trace("?wikiname=" + wikiload1.wikiname);
   trace("did the sendAndLoad")
  }

以下是跟踪结果:

〜/ SRC / Main.as:70:wikiname =咖啡

〜/ src / Main.as:71:发了sendAndLoad

〜/ src / Main.as:53:输入了wikiload1.onLoad函数

〜/ src / Main.as:58:wikiload2.displayhtml isundefined

〜/ SRC / Main.as:59:%0Adisplayhtml =%3CP%3E%板3Cb%3ECoffee%3C%2FB%3E%3C%2FP%3E%3CP%3E%3Cbr%2F%3E%3Cbr%2F %3ECoffee%20is%20a%20brewed%20drink%20prepared%20 [已返回值很多,已经很长] div%3E%0A& onLoad =%5Btype%20Function%5D

〜/ src / Main.as:60:成功路线

为什么wikiload2.displayhtml未定义?这是一个Actionscript错误,还是我调用的脚本(Web服务器上的python脚本)有问题。

1 个答案:

答案 0 :(得分:1)

无论您是否遇到python服务器问题,都应该使用代理嗅探器进行检查,例如CharlesFiddler甚至FireBug。结果看起来很好,虽然我不确定你在跟踪中看到的换行符%0A(wikiload2.toString)是否导致loadVars解析出现问题。首先尝试删除它。

我不确定这是解决方法,但是你说你是AS2的新手,所以让我进一步了解你的代码以供将来参考。我假设您必须在AS2中并且无法使用AS3。但是,即使使用AS2,我也会敦促您研究面向对象的编程。一旦这样做,构建代码,使用第三方框架并在项目中保持一定程度的可维护性将变得更加容易。

例如,在框架中,有一个名为ASAPFramework。它有一个非常简单的对象叫做LoadVarsXML,它允许你将加载结果作为XML对象加载。比python和flash中的loadVars结构更好地调试。

另一个建议;在AS2中,方法调用的范围可以是方法声明的范围之外的另一个范围。换句话说,当您在onLoad等事件回调中传递该方法以执行时,在与该方法相同的对象中定义的变量可能无法访问。解决此问题的一种方法是全局存储每个值,就像使用_root前缀一样。然而,这使您的代码难以阅读,难以理解,并且您已经注意到,难以调试。 * _root的使用通常是一个很大的禁忌* 。如果您继续扩展上面的示例脚本,您最终会发现自己处于一个代码意大利面中,您要求帮助的人无法理解。

解决这个问题的方法是开始使用类而不是框架脚本,但即使你想坚持使用它们,你也可以通过使用Delegate.create(scope,method)包装回调方法来清理一些东西。

以下是您的代码如何使用Delegate.create方法。我还冒昧地将你的wikiLoad1和2变量重写为wikiLoader和wikiResults。这使他们的任务更加清晰。

_root.buttonBkg.onPress = Delegate.create(this, handleButtonPress);

function handleButtonPress():Void {
    var wikiResult:LoadVars = new LoadVars();
    wikiResult.onLoad = Delegate.create(this, handleWikiLoad);

    var wikiLoader:LoadVars = new LoadVars();
    wikiLoader.wikiname = wikiterm;
    wikiLoader.sendAndLoad("http://myURL.script.py",wikiResult,"POST");
    trace("?wikiname=" + wikiLoader.wikiname);
    trace("did the sendAndLoad");
}

function handleWikiLoad(success:Boolean):Void {
    trace("entered wikiLoader.onLoad function");
    if (success) {
        _root.createTextField("wikidisplay",_root.getNextHighestDepth(),0,150,550,380);
        _root.wikidisplay.html = true;
        _root.wikidisplay.htmlText = wikiResult.displayhtml;
        trace("wikiResult.displayhtml is" + wikiResult.displayhtml);
        trace(wikiResult.toString());
        trace("success route");
    } else {
        _root.createTextField("wikidisplay",_root.getNextHighestDepth(),0,150,550,380);
        _root.wikidisplay.text = "Error connecting to server.";
        trace("error route");
    }
}

我认为这看起来更清洁,因此更容易理解。如上所述,尝试删除python中的换行符,如果可以,请从ASAP中查看LoadVarsXML。它将严重简化AS2的生活。