2012-03-18 57 views
1

我开始使用滑稽猴子脚本。您可以使用命令GM_xmlhttprequest并能够获取跨域数据。我原来的代码在Greasemonkey下面工作,现在我已经超越了通用的信誉,我需要把它移到插件SDK。FireFox扩展SDK将GM_xmlhttprequest转换为与插件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])) 

我需要发布一个项目命名它结束了编码“链接=钳”并获取php页面生成的时间日期结果,并通过格式化代码运行它,然后在原始网页中添加该数据。

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

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

回答

1

您应该使用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); 
}); 

https://builder.addons.mozilla.org/addon/1040966/latest/

不是window.setTimeout - 我认为这是必要的,这种情况下,因为所有被观察时新负载执行JS的推特。我是不同的OS和浏览器之间的必然性。 :D

+0

所以在内容脚本末尾我有'var cells = document.getElementsByTagName('td'); (i = 0; i Kendrick 2012-03-22 01:12:46

+0

// 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:功能(工人) \t \t \t { \t \t \t worker.port。上( '细胞',getItemPage(小区) \t \t \t \t { \t \t \t \t变种链路= cell.getElementsByTagName( 'A')[0] .href; //获取从细胞 变种itemDir链接=链接的ToString()分割( “/”);。 \t \t \t \t请求({'中所见inital交 – Kendrick 2012-03-22 01:15:49

+0

// item.js在端 '// \t getItemPage(细胞[I]); \t self.port.emit('cells',true); \t self.port.on('itemDir',?); \t self.port.on('cellInfo',? ); \t a = document.createElement('a'); \t a.href =“http://10.1.1.1/items/"+ itemDir [4]; \t a.innerHTML = cellInfo; \t cell.appendChild(a); \t \t \t} \t \t} \t}' 不完全知道如何返回itemDir和cellInfo或者如果我可以将它们合并一些如何。 – Kendrick 2012-03-22 01:25:47