2008-08-30 12 views
6

Ich versuche, eine neue Browser-Registerkarte mit den Ergebnissen einer POST-Anfrage zu öffnen. Ich versuche, so unter Verwendung einer Funktion den folgenden Code zu tun, enthält:Wie machen Sie eine Post-Anfrage in einen neuen Browser-Tab mit JavaScript/XUL?

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); 

Ich bin eine Zeichenfolge als URL verwenden und JSON-Daten als postdata. Gibt es etwas, was ich falsch mache?

Was passiert, wenn ein neuer Tab erstellt wird, zeigt der Speicherort die URL, die ich veröffentlichen möchte, aber das Dokument ist leer. Die Schaltflächen "Zurück", "Weiter" und "Neu laden" sind im Browser ausgegraut. Es scheint, als hätte es alles außer dem POST ausgeführt. Wenn ich den Parameter postData nicht aktiviere, wird ein GET ausgeführt.

Build-Kennung: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv: 1.9.0.1) Gecko/2008070206 Firefox/3.0.1

Antwort

0

versuchen mit addTab statt loadOneTab, und entferne den letzten Parameter.

Überprüfen Sie this page über im Mozilla Development Center für Informationen zum Öffnen von Registerkarten.

könnten Sie diese Funktion verwenden, zum Beispiel:

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); 
    } 
    } 
} 
4

Etwas, das ist weniger Mozilla spezifisch und sollte einigermaßen gut funktionieren mit den meisten Browsern:

  • ein verstecktes Formular erstellen mit den Feldern Richten Sie die Art ein, wie Sie sie benötigen
  • Stellen Sie sicher, dass das Attribut "target" des Formulars auf "_BLANK" gesetzt ist
  • Senden Sie das Formular programmatisch
3

Die Antwort darauf wurde gefunden von shog9. Der postData-Parameter muss ein nsIMIMEInputStream-Objekt sein, wie in here beschrieben.