我们如何使用JavaScript / XUL向新的浏览器标签中发出发布请求?
时间:2020-03-05 18:45:30 来源:igfitidea点击:
我正在尝试使用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,但是文档为空白。在浏览器中,"后退","前进"和"重新加载"按钮均显示为灰色。看起来除了执行POST以外,它已完成所有操作。如果我关闭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); } } }
回答
Mozilla所不具备的某些功能,应该可以在大多数浏览器中正常运行:
- 使用设置所需字段的字段创建隐藏表单
- 确保表单的"目标"属性设置为" _BLANK"
- 以编程方式提交表单
回答
对此的答案是由shog9找到的。 postData参数必须是一个" nsIMIMEInputStream"对象,如此处所述。