【问题标题】:Detect availability of Javascript from Actionscript?从 Actionscript 检测 Javascript 的可用性?
【发布时间】:2009-02-12 15:55:03
【问题描述】:

我想从我的 Flash 项目中打开外部 URL。我通常使用这样的东西:

getURL("javascript:newwin=window.open('http://someurl.com','','');");

但是,如果 Javascript 不可用(在 SWF 未嵌入 HTML 的情况下),那么这将失败。如何检测 Javascript 是否可用?如果它不可用,我可能只是使用 getURL 并给它直接 URL,尽管我只想在无法使用 Javascript 方法的情况下这样做。谢谢!

【问题讨论】:

    标签: javascript flash actionscript actionscript-2


    【解决方案1】:

    要完成您所描述的,最好的方法是让 Flash 调用一个名为“pingJavaScript”的 JavaScript 函数。如果 JavaScript 正在运行,那么该 JavaScript 函数将调用 Flash 电影上的一个名为“receiveJSNotification”的函数。所以在你的 Flash 电影中,如果调用了那个方法,你就知道 JS 正在运行。

    要在 Flash 电影和 JavaScript 之间实现可靠的通信,请在电影第一帧的 Actionscript 顶部添加以下内容:

    import flash.external.ExternalInterface;
    import flash.events.Event;
    

    添加一个函数以从 JavaScript 接收“是的,我还活着”:

    var js_available = false;
    
    function receiveJSNotification(str:String):void {
     _root.js_available = true;
    }
    
    ExternalInterface.addCallback("notifyFlash", receiveJSNotification);
    ExternalInterface.call("pingJavaScript", null);
    

    在 JavaScript 中:

    function pingJavaScript()
    {
        var movie = getFlash();
        movie.notifyFlash();
    }
    
    function getFlash()
    {
        var movie = null;
        if (navigator.appName.indexOf('Microsoft') != -1) {
            movie = window['flashmovie'];
        } else {
            movie = document['flashmovie'];
        }
        return movie;
    }
    

    【讨论】:

    • 有趣的方法。这使事情变得复杂,但如果这是最好的方法,我可能会采用它。这可以在 Actionscript 2 中使用吗?谢谢!
    • 是的,它确实适用于 AS2。我已经将它用于 JS 和 Flash 之间的一些交互。
    • 如果我只是想知道 JS 是否 可用 但 HTML 中没有用于此检测的 JS 代码怎么办?有人可能会通过在 Flash Player 中打开它来使用我的 SWF,或者可能会将它放到一个空白的 HTML 文档中。我可能无法设置 pingJavaScript() 和 getFlash() 但在这种情况下仍然可以使用 JS。
    • 这是不可能的。 Flash 必须直接询问浏览器,并且浏览器发布者没有任何我们可以访问的公共属性来说明 JS 是否可用。
    • 这可能有点愚蠢,但您可能会编写一些 javascript 来创建 pingJavaScript 和 getFlash 函数,然后调用它们?像这样的东西(但具有实际功能): ExternalInterface.call("eval", "function foo(){bar();}function bar(){alert('bar');};foo();");
    【解决方案2】:

    我发现实际上有一种更简单的方法可以做到这一点:

    public function isThereJavaScript():Boolean{
        return Boolean(ExternalInterface.call("window.location.href.toString"));
    }
    

    这不需要 JavaScript 后端。它只是始终如一地工作。如果有调用 JavaScript 的能力,那就意味着必须有一个 window 属性,它有一个非空的 location.href。 ExternalInterface 也可用于 AS2 和 AS3。

    【讨论】:

      猜你喜欢
      • 2011-08-19
      • 1970-01-01
      • 2013-09-07
      • 2015-10-11
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 2011-04-23
      相关资源
      最近更新 更多