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

标签 javascript json firefox firefox-addon firefox-addon-sdk

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

我使用了一个提供 JSON 数据值的网站。
http://dazzlepod.com/ip/stackoverflow.com.json

现在的问题是当我发出 XMLHttp 请求以获取它显示的 JSON 值时 0x80004005 (NS_ERROR_FAILURE)

Message: [Exception... "Failure" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: .... ...... :: httpGet :: line 30" data: no]

这是我的脚本代码

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 链接 https://github.com/kannojia/show-ip

最佳答案

好的,我解决了这个问题。问题是由于 same origin policy,您无法在驻留在其他域时向其他域发出 XMLHttp 请求。 .
因此,当 contentScript 向服务器发出 XMLHttp 请求时,浏览器会抛出 NS_error_failure

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

修改后的代码ma​​in.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();

}

和内容脚本 click_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 上。
谢谢大家的帮助。

关于javascript - 无法发出 http 请求 javascript ns 错误失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22589393/

相关文章:

javascript - 从数组对象获取值

http - 拦截某些 HTTP 请求的 Firefox 插件

javascript - Firefox 11 和 GeoLocation 拒绝回调

javascript - 如何在 Node js spawn 中运行复杂的命令?

javascript - Model.query() 返回 "undefined"错误

java - 如何从 JSON 中提取在同一 JSON 中返回两个字符串的字段

c# - 如何将整数数组的字符串拆分为 List<int[]>?

android - 在 Firefox for Android 中删除元素突出显示

javascript onclick 删除单个复选框

javascript - 如何使 React Native Webview 自动高度