如何使用JavaScript/XUL向新的浏览器选项卡发出post请求?

如何使用JavaScript/XUL向新的浏览器选项卡发出post请求?,javascript,firefox,xul,ubiquity,Javascript,Firefox,Xul,Ubiquity,我正在尝试打开一个新的浏览器选项卡,其中包含POST请求的结果。我正在尝试使用包含以下代码的函数执行此操作: var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(Components.interface s.nsIWindowMediator); var browserWindow = windowManager.getMostRecentWindow(

我正在尝试打开一个新的浏览器选项卡,其中包含POST请求的结果。我正在尝试使用包含以下代码的函数执行此操作:

var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"]
    .getService(Components.interface
s.nsIWindowMediator);
var browserWindow = windowManager.getMostRecentWindow("navigator:browser");
var browser = browserWindow.getBrowser();
if(browser.mCurrentBrowser.currentURI.spec == "about:blank")
    browserWindow.loadURI(url, null, postData, false);
else
    browser.loadOneTab(url, null, null, postData, false, false);
我使用字符串作为url,使用JSON数据作为postData。我做错什么了吗

发生的情况是,创建了一个新选项卡,位置显示了我要发布到的URL,但文档为空。浏览器上的“后退”、“前进”和“重新加载”按钮均为灰色。它似乎做了所有的事情,除了执行这项任务。如果我关闭postData参数,那么它将正确运行GET


构建标识符:Mozilla/5.0(Macintosh;U;Intel Mac OS X 10.5;en-US;rv:1.9.0.1)Gecko/2008070206 Firefox/3.0.1

尝试使用addTab代替loadOneTab,并删除最后一个参数

有关如何打开选项卡的信息,请访问Mozilla开发中心

您可以使用此功能,例如:

function openAndReuseOneTabPerURL(url) {
  var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                     .getService(Components.interfaces.nsIWindowMediator);
  var browserEnumerator = wm.getEnumerator("navigator:browser");

  // Check each browser instance for our URL
  var found = false;
  while (!found && browserEnumerator.hasMoreElements()) {
    var browserInstance = browserEnumerator.getNext().getBrowser();

    // Check each tab of this browser instance
    var numTabs = browserInstance.tabContainer.childNodes.length;
    for(var index=0; index<numTabs; index++) {
      var currentBrowser = browserInstance.getBrowserAtIndex(index);
      if ("about:blank" == currentBrowser.currentURI.spec) {

        // The URL is already opened. Select this tab.
        browserInstance.selectedTab = browserInstance.tabContainer.childNodes[index];

        // Focus *this* browser
        browserInstance.focus();
        found = true;
        break;
      }
    }
  }

  // Our URL isn't open. Open it now.
  if (!found) {
    var recentWindow = wm.getMostRecentWindow("navigator:browser");
    if (recentWindow) {
      // Use an existing browser window
      recentWindow.delayedOpenTab(url, null, null, null, null);
    }
    else {
      // No browser windows are open, so open a new one.
      window.open(url);
    }
  }
}
函数openandureonetabperurl(url){
var wm=Components.classes[“@mozilla.org/appshell/windowmediator;1”]
.getService(组件.接口.nsIWindowMediator);
var browserEnumerator=wm.getEnumerator(“导航器:浏览器”);
//检查每个浏览器实例的URL
var=false;
而(!found&&browserEnumerator.hasMoreElements()){
var browserInstance=browserEnumerator.getNext().getBrowser();
//检查此浏览器实例的每个选项卡
var numTabs=browserInstance.tabContainer.childNodes.length;

对于(var index=0;index一些不太特定于Mozilla的东西,应该可以很好地与大多数浏览器配合使用:

  • 创建一个隐藏表单,并按需要设置字段
  • 确保表单的“target”属性设置为“\u BLANK”
  • 按程序提交表格

此问题的答案由找到。postData参数必须是
nsIMIMEInputStream
对象,如中所述