Javascript FireFox扩展SDK将GM_xmlhttprequest转换为与插件SDK兼容的somthing

Javascript FireFox扩展SDK将GM_xmlhttprequest转换为与插件SDK兼容的somthing,javascript,firefox-addon-sdk,Javascript,Firefox Addon Sdk,我从一个油嘴滑舌的剧本开始。在这里,您可以使用命令GM_xmlhttprequest并能够获取跨域数据。我最初在Greasemonkey中使用下面的代码,现在我已经超越了GM的能力,我需要将其转移到插件SDK GM_xmlhttpRequest({ method: 'POST', url: "http://10.1.1.1/app/site_search_info.php", headers: { "Content-Type": "a

我从一个油嘴滑舌的剧本开始。在这里,您可以使用命令GM_xmlhttprequest并能够获取跨域数据。我最初在Greasemonkey中使用下面的代码,现在我已经超越了GM的能力,我需要将其转移到插件SDK

GM_xmlhttpRequest({
      method: 'POST',
      url: "http://10.1.1.1/app/site_search_info.php",
      headers: {
             "Content-Type": "application/x-www-form-urlencoded"
          },
      data: encodeURI("link=" + itemDir[2]),
      onload:function(r)
               {
               ................ original html formating code here...
               }
 });
我能够提取关于每行项目的日期信息,然后让它将该信息附加到每行的当前文本后面。我在main.js中使用了一个pagemod调用来加载我的search.js,其中包含此代码。当我得到一个应该执行xmlhttprequest的页面时,它不会在浏览器错误控制台中显示错误,也不会运行。在XHR出现之前发出警报。由于它是一个跨站点的XHR,我只能假设在尝试替换GM_xmlhttprequest时语法错误,或者它被安全设置阻止

所以对于跨站点请求,我应该使用

var Request = require("request").Request;
    Request({
      url: "http://10.1.1.1/app/site_search_info.php",
      headers: {
             "Content-Type": "application/x-www-form-urlencoded"
          },
      content: encodeURI("link=" + itemDir[2]),
      onload:function(r)
            {
................ original html formating code here... 
          };
}).post();
或者我应该使用类似的东西

var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"] 
                    .createInstance(Components.interfaces.nsIXMLHttpRequest); 
req.open('PUT',"http://10.1.1.1/app/site_search_info.php", false); /* synchronous! */ 
req.onload = function (r)
         { 
................ original html formating code here... 
          }; 
req.setRequestHeader('Content-Type', application/x-www-form-urlencoded); 
req.send(encodeURI("link=" + itemDir[2]))
我需要发布一个项目名称,它最终编码为“link=钳子”,并获取php页面生成的时间-日期结果,然后运行格式化代码,然后将该数据附加到原始网页

由于这是我在sdk中的第一个XHR,我需要弄清楚这是XHR上的语法错误,还是因为安全性阻止了它而使用了错误的XHR类型


如果两者都可以工作,那么它们是否必须放在特定的.js文件中或以特定的方式调用?

您应该使用SDK的请求模块,这是第一个选项。这段代码应该在main.js中,在onComplete处理程序中,您应该将数据发送到内容脚本。下面是一个执行以下操作的工作示例:

// main.js:

let data = require('self').data;

let pm = require("page-mod").PageMod({
    include: /^https:\/\/twitter.com\/.*\/status\/[\d]+$/,
    contentScriptFile: [data.url('jquery-1.7.1.min.js'), data.url('twitter_json.js')],
    onAttach: function(worker) {

        worker.port.on('tweet-loaded', function() {
            let tweet_id = /status\/([\d]+)$/.exec(worker.tab.url).pop();
            if (tweet_id) {
                let twitter_request = require("request").Request({
                    url: 'https://api.twitter.com/statuses/show/' + tweet_id + '.json',
                    onComplete: function(response) {
                        worker.port.emit('got-tweet-json', response.json);
                    }
                }).get();
            }
        });
    }
});


// content script

$(function() {
    // this setTimeout is a dumb hack, it seems we need to wait a bit longer before
    // modifying the page. I blame new twitter.
    window.setTimeout(function() {
        self.port.on('got-tweet-json', function(data) {
            var s_data = JSON.stringify(data, null, '   ');
            $('ul.actions').after('<pre id="json-dump"></pre>');

            $('ul.actions').append('<li><a id="json-link" href="#">View JSON</a></li>');

            $('#json-link').click(function(ev) {
                $('#json-dump').toggle();
                return false;
            });
            $('#json-dump')
                .html(s_data)
                .hide();
        });

        self.port.emit('tweet-loaded', true);


    }, 200);
});
//main.js:
让数据=需要('self')。数据;
设pm=require(“页面修改”).PageMod({
包括:/^https:\/\/twitter.com\/.\/status\/[\d]+$/,
contentScriptFile:[data.url('jquery-1.7.1.min.js')、data.url('twitter_json.js')],
onAttach:功能(工作程序){
worker.port.on('tweet-load',function(){
让tweet_id=/status\/([\d]+)$/.exec(worker.tab.url).pop();
如果(tweet_id){
让twitter_request=require(“request”).request({
网址:'https://api.twitter.com/statuses/show/“+tweet_id+”.json”,
未完成:功能(响应){
emit('get-tweet-json',response.json);
}
}).get();
}
});
}
});
//内容脚本
$(函数(){
//这个setTimeout是一个愚蠢的黑客,看起来我们需要再等一段时间
//修改页面。我责怪新推特。
setTimeout(函数(){
self.port.on('got-tweet-json',函数(数据){
var s_data=JSON.stringify(数据,null,”);
$('ul.actions')。在('')之后;
$('ul.actions')。追加('li>');
$(“#json链接”)。单击(函数(ev){
$('#json dump').toggle();
返回false;
});
$(“#json转储”)
.html(s_数据)
.hide();
});
self.port.emit('tweet-load',true);
}, 200);
});


不是window.setTimeout——我认为这在这种情况下是必要的,因为在查看新twitter时,所有的JS都会在加载时执行。我认为操作系统和浏览器之间的必要性有所不同:D

您应该使用SDK的请求模块,这是第一个选项。这段代码应该在main.js中,在onComplete处理程序中,您应该将数据发送到内容脚本。下面是一个执行以下操作的工作示例:

// main.js:

let data = require('self').data;

let pm = require("page-mod").PageMod({
    include: /^https:\/\/twitter.com\/.*\/status\/[\d]+$/,
    contentScriptFile: [data.url('jquery-1.7.1.min.js'), data.url('twitter_json.js')],
    onAttach: function(worker) {

        worker.port.on('tweet-loaded', function() {
            let tweet_id = /status\/([\d]+)$/.exec(worker.tab.url).pop();
            if (tweet_id) {
                let twitter_request = require("request").Request({
                    url: 'https://api.twitter.com/statuses/show/' + tweet_id + '.json',
                    onComplete: function(response) {
                        worker.port.emit('got-tweet-json', response.json);
                    }
                }).get();
            }
        });
    }
});


// content script

$(function() {
    // this setTimeout is a dumb hack, it seems we need to wait a bit longer before
    // modifying the page. I blame new twitter.
    window.setTimeout(function() {
        self.port.on('got-tweet-json', function(data) {
            var s_data = JSON.stringify(data, null, '   ');
            $('ul.actions').after('<pre id="json-dump"></pre>');

            $('ul.actions').append('<li><a id="json-link" href="#">View JSON</a></li>');

            $('#json-link').click(function(ev) {
                $('#json-dump').toggle();
                return false;
            });
            $('#json-dump')
                .html(s_data)
                .hide();
        });

        self.port.emit('tweet-loaded', true);


    }, 200);
});
//main.js:
让数据=需要('self')。数据;
设pm=require(“页面修改”).PageMod({
包括:/^https:\/\/twitter.com\/.\/status\/[\d]+$/,
contentScriptFile:[data.url('jquery-1.7.1.min.js')、data.url('twitter_json.js')],
onAttach:功能(工作程序){
worker.port.on('tweet-load',function(){
让tweet_id=/status\/([\d]+)$/.exec(worker.tab.url).pop();
如果(tweet_id){
让twitter_request=require(“request”).request({
网址:'https://api.twitter.com/statuses/show/“+tweet_id+”.json”,
未完成:功能(响应){
emit('get-tweet-json',response.json);
}
}).get();
}
});
}
});
//内容脚本
$(函数(){
//这个setTimeout是一个愚蠢的黑客,看起来我们需要再等一段时间
//修改页面。我责怪新推特。
setTimeout(函数(){
self.port.on('got-tweet-json',函数(数据){
var s_data=JSON.stringify(数据,null,”);
$('ul.actions')。在('')之后;
$('ul.actions')。追加('li>');
$(“#json链接”)。单击(函数(ev){
$('#json dump').toggle();
返回false;
});
$(“#json转储”)
.html(s_数据)
.hide();
});
self.port.emit('tweet-load',true);
}, 200);
});


不是window.setTimeout——我认为这在这种情况下是必要的,因为在查看新twitter时,所有的JS都会在加载时执行。我认为操作系统和浏览器之间的必要性有所不同:D

所以在内容脚本的末尾我有
var cells=document.getElementsByTagName('td');对于(i=0;i//Main
var Request=require(“Request”).Request;var pageMod=require(“page mod”);var data=require(“self”).data;pageMod.pageMod({包括:http://site.com/*,contentScriptFile:data.url(“item.js”)onAttach:function(worker){worker.port.on('cell',getItemPage(cell){var link=cell.getElementsByTagName('a')[0]。href;//从cell var itemDir=link.toString().split(“/”)获取链接;请求({
,如init中所示)