无法发出http请求javascript ns错误失败
我开始学习使用插件sdk开发插件。我正在写一个小插件脚本,显示当前网页的IP地址 我使用了一个提供JSON数据值的网站。无法发出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.
现在的问题是,当我发出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);
});