无法发出http请求javascript ns错误失败

无法发出http请求javascript ns错误失败,javascript,json,firefox,firefox-addon,firefox-addon-sdk,Javascript,Json,Firefox,Firefox Addon,Firefox Addon Sdk,我开始学习使用插件sdk开发插件。我正在写一个小插件脚本,显示当前网页的IP地址 我使用了一个提供JSON数据值的网站。 现在的问题是,当我发出XMLHttp请求以获取JSON值时,它会显示0x80004005(NS\u错误\u失败) 消息:[异常…“故障”nsresult:“0x80004005 (NS_错误_失败)“位置:……::httpGet::第30行” 数据:否] 这是我的脚本代码 function getDomainInfo(url) { var a = document.

我开始学习使用插件sdk开发插件。我正在写一个小插件脚本,显示当前网页的IP地址

我使用了一个提供JSON数据值的网站。

现在的问题是,当我发出XMLHttp请求以获取JSON值时,它会显示
0x80004005(NS\u错误\u失败)

消息:[异常…“故障”nsresult:“0x80004005 (NS_错误_失败)“位置:……::httpGet::第30行” 数据:否]

这是我的脚本代码

function getDomainInfo(url) {
    var a = document.createElement('a');
    a.href = url;

    var domain = a.hostname;
    var requestURL = "http://dazzlepod.com/ip/"+domain+".json";
    //alert(requestURL);
    return httpGet(requestURL);
}

function httpGet(theUrl)
{
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            return xmlhttp.responseText;
        }
    }
    xmlhttp.open("GET", theUrl, false );
    xmlhttp.send();    
}

var check = self.port.on("clicked", function(url) {
    var json = getDomainInfo(url);
    //alert(json);
});
有人能解释为什么会发生这种情况,我该怎么办吗?
我对插件开发有点陌生。
多谢各位


GitHUb-Link

您遇到安全错误,因为您无法在另一个域上对另一个域进行xmlhttprequest。请尝试加载带有
http://dazzlepod.com
作为url,然后从scratchpad运行代码,这样就可以了

如果要跨站点,请尝试使用mozSystem属性:

好的,这样您就不会出现安全错误。reuest成功通过:

我想知道x-frame-options:deny是否与正在发生的事情有关

不管怎样,由于以下原因,您会得到ns failur错误:

Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help http://xhr.spec.whatwg.org/ click_handler.js:31
所以你必须把第三个参数设为“开”为“真”

但是我还是得到了一堆没有响应的xml或responeText或event responeType或respone

很奇怪

我刚刚修改了click_handler.js中的代码,还有它的怪异之处,但是console.log在这里不起作用,至少在aurora中是这样

function getDomainInfo(url) {
    var a = document.createElement('a');
    a.href = url;

    var domain = a.hostname;
    var requestURL = "http://dazzlepod.com/ip/"+domain+".json";
    alert(requestURL);
    return httpGet(requestURL);
}

function httpGet(theUrl)
{
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onload = function() {
        alert('onload done ' + '\n' + xmlhttp.readyState + '\n' + xmlhttp.status + '\n' + xmlhttp.responseText + '\n' + xmlhttp.response + '\n' + xmlhttp.responseType + '\n' + xmlhttp.responseXML);
        alert('onload done ' + '\n' + this.readyState + '\n' + this.status + '\n' + this.responseText + '\n' + this.response + '\n' + this.responseType + '\n' + this.responseXML);
    }
    xmlhttp.onreadystatechange=function()
    {
        alert('onreadystatechange' + '\n' + xmlhttp.readyState + '\n' + xmlhttp.status + '\n' + xmlhttp.responseText + '\n' + xmlhttp.response + '\n' + xmlhttp.responseType + '\n' + xmlhttp.responseXML);
            alert('onreadystatechange this ' + '\n' + this.readyState + '\n' + this.status + '\n' + this.responseText + '\n' + this.response + '\n' + this.responseType + '\n' + this.responseXML);
        if (xmlhttp.readyState==4)
        {
            alert('onreadystatechange READYSTE==4' + '\n' + xmlhttp.readyState + '\n' + xmlhttp.status + '\n' + xmlhttp.responseText + '\n' + xmlhttp.response + '\n' + xmlhttp.responseType + '\n' + xmlhttp.responseXML);
            return xmlhttp.responseText;
        }
    }
    xmlhttp.open("GET", theUrl, true );
    alert('xmlhttp = ', xmlhttp);
    xmlhttp.send();    
}

var check = self.port.on("clicked", function(url) {
    alert(window.location);
    var json = getDomainInfo(url);
});

好的,我解决了这个问题。问题是您无法在驻留在其他域上时向其他域发出XMLHttp请求,因为。
因此,当contentScript向服务器发出XMLHttp请求时,浏览器会抛出
NS\u error\u failure

我找到的解决方案是使用插件SDK。请求对象用于发出GET、POST或PUT网络请求。请求对象不受同源策略的约束。
因此,我没有从contentScript发出Http请求,而是使用了请求API并得到了有效的响应

修改后的代码main.js

var widgets = require("sdk/widget");
var tabs = require("sdk/tabs");
var data = require("sdk/self").data;
var Request = require("sdk/request").Request;

var url;
var domain_name;
var requestURL;

var showipWidget = widgets.Widget({
    id : "show-ip",
    label : "Display IP Address of current Page",
    contentURL : data.url("lens_icon.png"),
    contentScriptFile : [data.url("click_handler.js"),data.url("jquery-1.8.3.min.js")],
    panel : infoPanel,
    onClick : function() {
        var curtab = tabs.activeTab;
        url = curtab.url;
        this.port.emit('getDomain',url);
    }   
});

showipWidget.port.on("setDomain", function(domain) {
    domain_name=domain;
    getDomainInfo(domain_name);
});

function getDomainInfo(domain) {
    requestURL = "http://dazzlepod.com/ip/"+domain+".json";
    //requestDomainInfo.get();

    Request({
      url: requestURL,
      onComplete: function (response) {
        var out = response.json;
        console.log("Response: "+out.ip);
      }
    }).get();

}
然后内容脚本单击_handler.js

function getDomain(url) {
    var a = document.createElement('a');
    a.href = url;
    var domain = a.hostname;
    return domain;
}

var check = self.port.on("getDomain", function(url) {
    var domain = getDomain(url);
    self.port.emit("setDomain",domain);
});
所有文件都在GitHub上。

谢谢大家的帮助。

但如果是插件/扩展,请更新清单文件以获得适当的权限,然后您就可以提出请求。啊,是的,但他是window.XMLHttpRequest,如果他在做私有范围,他不应该这样做:
constxmlhttprequest=Cc[“@mozilla.org/xmlexts/XMLHttpRequest;1”];
?不确定,我只开发Chrome扩展,从未接触过FF插件。@David你能告诉我更新清单的内容吗?我实际上不知道这个方法。我在这里读到:
http://stackoverflow.com/questions/9922101/get-json-data-from-external-url-and-display-a-particular-value-by-injecting-it-i
问题出在一些
相同的源代码策略
。他们建议了一些我不理解的JSONP。你能把你的插件上传到github,然后链接我们吗。我很想看看整个事情,看看为什么它不起作用。我把代码上传到github。这是一个非常有趣的链接。你能把它编译成XPI,然后上传,这样我就可以调试了。thxI已经添加了我在GitHub上下载了编译好的XPI。谢谢分享,这肯定会帮助其他人
function getDomain(url) {
    var a = document.createElement('a');
    a.href = url;
    var domain = a.hostname;
    return domain;
}

var check = self.port.on("getDomain", function(url) {
    var domain = getDomain(url);
    self.port.emit("setDomain",domain);
});