如何根据点击的目标使用 navigateToURL 将用户发送到不同的 URL?

Posted

技术标签:

【中文标题】如何根据点击的目标使用 navigateToURL 将用户发送到不同的 URL?【英文标题】:How can I send the user to a different URL using navigateToURL depending on clicked target? 【发布时间】:2017-03-26 13:50:03 【问题描述】:

我有一个包含不同位置的“虚拟地图”的 SWF 文件。当每个位置被点击时,用户被重定向到一个超链接。

如何使每个位置重定向到不同的超链接?

如果点击喷泉,用户将被重定向到http://different.com 如果城堡被点击,用户将被重定向到http://something.com

您可以从here 下载 SWF 或在线查看:http://www.fastswf.com/NInMHKU

这里是 ActionScript 代码,它可以让用户在点击某个位置时被重定向:

package

   import flash.net.URLRequest;
   import flash.net.navigateToURL;
   import flash.events.MouseEvent;

   public class Map
   
       public function Map()
       
       

       public function gotoLocation(param1:int) : void
       
           if(param1 != 999)
           
               navigateToURL(new URLRequest("http://www.baidu.com"),"_blank");
            
        

        private function closeMap(param1:MouseEvent = null) : void
        

        
    


在使用名为 JPEXS Free Flash Decompiler 的程序对 SWF 文件进行反编译后,我发现地图上的每个位置都有两个不同的 AS 文件。例如,下面是喷泉的文件。

来源:Flumsfountain_499.as

package SkylandersSuperchargersMap_26_10_15_fla

   import flash.display.MovieClip;

   public dynamic class Flumsfountain_499 extends MovieClip
   


      public function Flumsfountain_499()
      
         super();
         addFrameScript(0,this.frame1,1,this.frame2);
      

      function frame1() : *
      
         stop();
      

      function frame2() : *
      
         stop();
      
   

来源:flumsfountainlPU_520.as

package SkylandersSuperchargersMap_26_10_15_fla

   import flash.display.MovieClip;

   public dynamic class flumsfountainlPU_520 extends MovieClip
   


      public function flumsfountainlPU_520()
      
         super();
         addFrameScript(18,this.frame19);
      

      function frame19() : *
      
         stop();
      
   


之前我尝试过...

我能够使用RABCDAsm 将 SWF 反编译成许多不同的文件,这是由顶部的 AS3 项目生成的代码(源文件:Map.class.asasm)这个问题:

  trait method QName(PackageNamespace(""), "gotoLocation")
   method
    name "gotoLocation"
    refid "TestGotoLocationFunction/instance/gotoLocation"
    param QName(PackageNamespace(""), "int")
    returns QName(PackageNamespace(""), "void")
    flag HAS_PARAM_NAMES
    paramname "param1"
    body
     maxstack 4
     localcount 2
     initscopedepth 0
     maxscopedepth 1
     code
      getlocal0
      pushscope

      getlocal1
      pushshort           999
      ifeq                L13

      getlex              QName(PackageNamespace("flash.net"), "navigateToURL")
      getglobalscope
      findpropstrict      QName(PackageNamespace("flash.net"), "URLRequest")
      pushstring          "http://www.baidu.com"
      constructprop       QName(PackageNamespace("flash.net"), "URLRequest"), 1
      pushstring          "_blank"
      call                2
      pop
L13:
      returnvoid
     end ; code
    end ; body
   end ; method
  end ; trait 

【问题讨论】:

注意 : (1) 确保您测试是否可以从该JPEXS反编译代码。 (2) 此外,FastSWF.com 链接提供了一个“修改过的”SWF(例如 base64 等?),因此当它从站点保存时,它无法在反编译器中作为有效的 SWF 打开(字节甚至不以预期的“CWS”或“FWS”字节值开头)。我已将 FastSWF 链接替换为您之前问题中的可测试链接。最后确认可以成功重新编译一个新的SWF。然后我们会知道您在哪里需要什么答案,否则编辑 .ASasm 代码是您的最佳选择。 @VC.One 您好,之所以有一个修改后的 SWF 链接,是因为您在帖子中编辑的正确链接在单击位置时不会重定向到相同的 URL。你能推荐我一个可以将修改后的 SWF 上传到的网站,该网站可以在反编译器中作为有效的 SWF 打开吗?我将研究是否可以重新编译 SWF。 我的意思是网站本身正在对上传的 swf 进行某种复制保护(尝试保存 swf 用于测试目的只会得到一个加密文件)。如果仅在线查看不是问题,但应答者需要通过反编译原始 swf 来重新创建您的问题。 @VC.One 我已经更新了我的帖子,其中包含一个下载 SWF 的链接。我发现使用 JPEXS 可以直接编辑 AS 代码并保存,而不是反编译和重新编译,这将更新 SWF 文件。 您是否有权修改您拥有的 swf 文件? 【参考方案1】:

编辑文件com.binweevils.externalUIs.map.Map.as

  public function gotoLocation(param1:int) : void
  
     if(param1 == 190)
     
        navigateToURL(new URLRequest("http://www.different.com"),"_blank");
     
     else if(param1 == 113)
     
        navigateToURL(new URLRequest("http://www.something.com"),"_blank");
     
     else
     
        navigateToURL(new URLRequest("http://www.baidu.com"),"_blank");
     
  

您可以从以下位置找到 param1 的值:

     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.halloween_btn,818));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.sinksSub_btn,116));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.tinksTree_btn,191));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.doshPalace_btn,102));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.gongsPipenest_btn,103));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.shoppingMall_btn,104));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.castleGam_btn,113));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.flem_manor_btn,125));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.partyBox_btn,10013));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.rumsCove_btn,129));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.flumsFountain_btn,190));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.riggsPalladium_btn,111));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.post_btn,120));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.figgsCafe_btn,156));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.grottoClub_btn,109));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.labsLab_btn,172));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.nestStreet_btn,115));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.nest_btn,5));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.binPetsParadiseRight_btn,100));
     this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.binPetsParadiseLeft_btn,101));

每一行:

this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.flumsFountain_btn,190)) ;

提供buttonMCroomID,它们进一步可用作gotoLocation() 的参数1,以有条件地导航浏览器。

你可以从https://drive.google.com/open?id=0B_AKfmXEaZvQUldqNkU3ZW9ZMTg下载swf

注意:你不应该反编译和使用其他属性 许可,除非是出于教育目的。

【讨论】:

感谢您的回答,我正准备试一试。请问您从哪里得到 param1 的值列表? 它们在同一个 Map.as 文件中找到【参考方案2】:

如果可以为城堡或任何其他元素赋予具有唯一字符串值的属性,您可以尝试类似

private function mClick(me:MouseEvent):void
    goToURL(me.target.url_String); 


private function goToURL(urlString:String):void
    navigateToURL(new URLRequest(url_String));

您只需要在城堡是一个实例的类中拥有一个名为url_String 的属性(显然它需要是一个自定义类),并且当您实例化该类时,使用您想要的 url 定义它的属性要去的城堡。喜欢:

 var castle:Location = new Location("http://www.baidu.com");

显然Location 将是您的自定义类,可能看起来像这样:

public class Location extends Sprite 
    public var url_String:String;
    private function Location(s:String):void
        url_String = s;
    

【讨论】:

嗨,尼尔,感谢您的回复!我对 AS 很陌生,但学习起来非常令人兴奋。在我用 RABCDAsm 解码文件后,我在 SkylandersSuperchargersMap_26_10_15_fla 目录中找到了两个城堡文件,分别名为 gamscastle_293.script.asasmgamscastle_293.class.asasm。我会修改哪一个来为元素赋予一个像你提到的那样具有唯一字符串的属性? 哦,应该是第一班 谢谢,我会试试看。你知道我原始帖子中的代码,我应该删除它吗? 我不知道。如前所述,您的某些代码不是 as3。希望您知道这一点并且不会将其放入您的项目中。 mClick 根本不是一个类。这是一个函数

以上是关于如何根据点击的目标使用 navigateToURL 将用户发送到不同的 URL?的主要内容,如果未能解决你的问题,请参考以下文章

#技术分享#Flash与XSS

AS3 getURL/navigateToURL(如何在AS3中创建可单击的链接)

使用URLRequest和navigateToURL的AS3 getURL

如何根据点击的 UITableCell 更改目标视图控制器的内容?

ActionScript 3 AS3 getURL使用URLRequest和navigateToURL

ActionScript 3 NavigateToURL的