Javascript 在Firefox OS设备上通过AJAX执行脚本

Javascript 在Firefox OS设备上通过AJAX执行脚本,javascript,jquery,ajax,firefox-os,Javascript,Jquery,Ajax,Firefox Os,我的问题与应用程序CSP有关 在这里,它表示所有远程脚本、内联脚本、javascript URI和其他安全问题都无法在Firefox OS应用程序上工作 因此,我尝试下载我的应用程序(Flurry和广告服务)所需的脚本,但这两个脚本都无法在设备上运行。我调用的方式是使用AJAX,这样我就避免了远程和内联脚本编写,而这两种脚本都无法使用。在模拟器中工作得很好,但在设备上,广告永远不会显示,Flurry会话永远不会启动 下面是我对Flurry进行AJAX调用的代码部分: $.ajax({

我的问题与应用程序CSP有关

在这里,它表示所有远程脚本、内联脚本、javascript URI和其他安全问题都无法在Firefox OS应用程序上工作

因此,我尝试下载我的应用程序(Flurry和广告服务)所需的脚本,但这两个脚本都无法在设备上运行。我调用的方式是使用AJAX,这样我就避免了远程和内联脚本编写,而这两种脚本都无法使用。在模拟器中工作得很好,但在设备上,广告永远不会显示,Flurry会话永远不会启动

下面是我对Flurry进行AJAX调用的代码部分:

$.ajax({
            url: 'https://cdn.flurry.com/js/flurry.js',
            dataType: "script",
            xhrFields: {
                mozSystem: true
            },
            success: function(msg){
                console && console.log("Script de Flurry: luego de la descarga en AJAX "+msg);
                flurryLibrary = true;
                FlurryAgent.startSession("7ZFX9Z4CVT66KJBVP7CF");
            },
            error:function(object,status,errortxt){
                console && console.log("The script wasn't downloaded as text. The error:" +errortxt);
                flurryLibrary = false;
            },
            always: function(object,status,errortxt){
                console && console.log("The script may or may not be downloaded or executed. The error could be:" +errortxt);
            }
        });
在我的应用程序中,我使用systemXHR权限,并使用以下线路呼叫其他网站:

request = new XMLHttpRequest({ mozSystem: true });
Wich与在AJAX调用中使用xhrFields{mozSystem:true}相同

我相信这不是一个跨域问题,因为在我的应用程序的其余部分中,我调用了不在我的域中的xml文件,并且成功地返回了调用

所以,我的问题是,Firefox OS应用程序能否执行通过AJAX下载的脚本?有办法解决这个问题吗

谢谢你抽出时间


注:我忘了补充我的应用程序是特权的,以防你问我,我相信这是一个安全功能,你的问题的简短答案是否定的。引用你链接到自己的CSP文档:

不能将点指向远程JavaScript文件。这意味着您引用的所有JS文件都必须包含在应用程序包中


如果使用ajax从远程服务器加载JS文件,则该JS不会包含在应用程序包中。您应该小心遵守CSP限制。在开发过程中,在不完全遵循CSP的情况下,可以在模拟器甚至手机中运行许多东西,但这并不意味着它是可以的。当你将来将你的应用提交给任何可信的市场(如Firefox marketplace)时,它将被仔细审查,以确保它不会违反CSP限制。作为一般的经验法则,我认为任何动态评估JS代码的尝试都会带来安全风险,而且很可能会被CSP法规禁止。

首先,我要指出您的两个示例

request = new XMLHttpRequest();
request.mozSystem = true;
这和

request = new XMLHttpRequest({ mozSystem: true });
相反,我们可以按照链接错误报告中的建议,在应用程序加载时运行以下操作:

$.ajaxSetup( {
  xhr: function() {
    return new window.XMLHttpRequest( {
      mozSystem: true
    } );
  }
} );
仅此一项就可以解决您的问题。但是,如果它不起作用,那么这里的下一个解决方法是以纯文本的形式获取脚本资源,然后将该文本内容作为脚本加载

但是,内联脚本和
数据:
URL是特权Firefox OS应用程序的禁区。我们仍然可以通过
blob:
URL来实现这一目标,但是:

window.URL = window.URL || window.webkitURL;

var request = new XMLHttpRequest({ mozSystem: true });
request.open("GET", "https://cdn.flurry.com/js/flurry.js");

// when the Ajax request resolves, load content into a <script> tag
request.addEventListener("load", function() {
    // make a new blob whose content is the script
    var blob = new Blob([request.textContent], {type: 'text/javascript'});

    var script = document.createElement('script');
    script.src = window.URL.createObjectURL(blob);

    // after the script finishes, do something else
    script.addEventListener("load", function() {
        flurryLibrary = true;
        FlurryAgent.startSession("7ZFX9Z4CVT66KJBVP7CF");
    });
    document.body.appendChild(script);
});
window.URL=window.URL | | window.webkitURL;
var-request=newXMLHttpRequest({mozSystem:true});
请求。打开(“获取”https://cdn.flurry.com/js/flurry.js");
//Ajax请求解析后,将内容加载到标记中
addEventListener(“加载”,函数(){
//创建一个内容为脚本的新blob
var blob=new blob([request.textContent],{type:'text/javascript'});
var script=document.createElement('script');
script.src=window.URL.createObjectURL(blob);
//脚本完成后,执行其他操作
script.addEventListener(“加载”,函数(){
flurryLibrary=true;
FlurryAgent.startSession(“7ZFX9Z4CVT66KJBVP7CF”);
});
document.body.appendChild(脚本);
});

但是,如果脚本本身执行CSP不允许的操作,那么您肯定是运气不好。

您必须使用mozSystem和mozAnon属性,例如:

var xMLHttpRequest=新的xMLHttpRequest({ 莫扎农:没错, 莫扎特系统:正确
});

很遗憾这是一个问题,我希望loadScript能够正常工作,因为firefoxOS是一个环境,在我的应用程序中,所有的应用程序代码都是HTML5和本地的,当前的规则是所有的脚本都需要一次加载到内存中,除非你用url加载一个完整的页面,这意味着你不能在网站上有一个持久化的包装器,需要时,在页面中使用关联脚本和ajax。您可能认为firefox至少为脚本启用了本地延迟加载。可以在chrome上运行,但不能在firefox上运行。

谢谢,我想这可能是解决我问题的唯一办法。。。那么,有没有办法在不违反CSP的情况下调用此脚本?也许是一个iframe?@Mavi不-这已经回答了。您不能使用外部JS加载,仅此而已!没有iFrame,没有带有外部源的标记。Olny本地js文件。我尝试了iframe,它确实加载了外部的.js文件,但结果发现Flurry库违反了CSP(使用document.createElement()生成了一个源于我项目外部的脚本),所以这两种方式都不起作用。谢谢不管怎样,它失败是因为脚本根本不会加载,还是因为脚本(成功加载后)做了不允许的事情?@apsillers脚本根本不会加载。这是因为由于安全原因,应用程序无法调用远程脚本。我会试试你在回答中所说的,并让你知道它是如何运行的。这个脚本不应该与CSP一起运行。这只是因为模拟器中的一个错误。如果你想在你的应用程序中使用第三方JavaScript,你必须将它作为一个文件包含进去。iframes确实可以,但是脚本做了CSP不允许的事情,所以我没有出路。无论如何谢谢你
window.URL = window.URL || window.webkitURL;

var request = new XMLHttpRequest({ mozSystem: true });
request.open("GET", "https://cdn.flurry.com/js/flurry.js");

// when the Ajax request resolves, load content into a <script> tag
request.addEventListener("load", function() {
    // make a new blob whose content is the script
    var blob = new Blob([request.textContent], {type: 'text/javascript'});

    var script = document.createElement('script');
    script.src = window.URL.createObjectURL(blob);

    // after the script finishes, do something else
    script.addEventListener("load", function() {
        flurryLibrary = true;
        FlurryAgent.startSession("7ZFX9Z4CVT66KJBVP7CF");
    });
    document.body.appendChild(script);
});