从Actionscript检测Javascript的可用性?

从Actionscript检测Javascript的可用性?,javascript,flash,actionscript,actionscript-2,Javascript,Flash,Actionscript,Actionscript 2,我想从我的Flash项目中打开外部URL。我通常使用这样的方式: getURL("javascript:newwin=window.open('http://someurl.com','','');"); 但是,如果Javascript不可用(在SWF未嵌入HTML的情况下),那么这将失败。如何检测Javascript是否可用?如果它不可用,我可能只使用getURL并给它一个直接的URL,尽管我只想在不可能使用Javascript方法的情况下这样做。谢谢 要完成您描述的内容,最好的方法是让Fl

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

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

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

要完成您描述的内容,最好的方法是让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);
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;
}
在JavaScript中:

var js_available = false;

function receiveJSNotification(str:String):void {
 _root.js_available = true;
}

ExternalInterface.addCallback("notifyFlash", receiveJSNotification);
ExternalInterface.call("pingJavaScript", null);
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;
}

我发现实际上有一种更简单的方法来实现这一点:

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

这不需要JavaScript后端。它只是始终如一地工作。如果能够调用JavaScript,则意味着必须有一个窗口属性,该属性的位置为非空。href。外部接口也可用于AS2和AS3。

有趣的方法。这会使事情复杂化,但如果这是最好的方法,我可能会采用它。这在ActionScript2中有效吗?谢谢是的,它确实适用于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();”);