18 Stimmen

BASE HREF, javascript und Internet Explorer im Vergleich zu Firefox

Frage:

IE und Firefox/Safari scheinen mit Anfragen vom Typ BASE HREF und Javascript window.location unterschiedlich umzugehen. Erstens, ist dies eine genaue Beschreibung des Problems? Was ist da los? Und was ist die beste browserübergreifende Lösung, um mit dieser Situation umzugehen?

Kontext:

Ich habe eine kleine PHP-Flatfile-Sitelet (es ist eigentlich ein Usability-Test-Prototyp).

Ich generiere den HREF-Wert des BASE-Tags dynamisch in PHP, d.h. wenn es auf dem Server unserer Firma läuft, ist es:

$basehref = 'http://www.example.com/alpha/bravo/UsabilityTest/';

und auf meinem lokalen Entwicklungsrechner ist es:

$basehref = 'http://ellen.local/delta/echo/foxtrot/UsabilityTest/';    

Für eine der Aufgaben sammle ich einige Benutzereingaben, führe einige Transformationen in Javascript durch und sende sie an den Server, indem ich Code wie diesen verwende:

function allDone() {
    // elided code for simplicity of stackoverflow question
    var URI = "ProcessUserInput.php?";
    URI = URI + "alphakeys=" + encodeURI( keys.join(",") );
    URI = URI + "&sortedvalues=" + encodeURI( values.join(",") );
    window.location = URI;
}

Sowohl die Javascript-Datei (mit der Funktion allDone() ) und das verarbeitende PHP-Skript ( ProcessUserInput.php ) befinden sich in einem Unterverzeichnis von UsabilityTest. Mit anderen Worten, ihre tatsächliche URL lautet

http://www.example.com/alpha/bravo/UsabilityTest/ foxtrot/ProcessUserInput.php alias

$basehref . '/foxtrot/ProcessUserInput.php'

Das Problem

Das JavaScript des IE scheint den BASE HREF grundsätzlich zu ignorieren. Das Javascript und der PHP-Prozessor befinden sich im selben Verzeichnis, so dass der Aufruf von ProcessUserInput.php funktioniert gut. Die Eingabe wird verarbeitet und alles funktioniert einwandfrei.

Aber wenn ich mit Firefox teste, wird das JavaScript tut scheinen den BASE HREF zu verwenden, da die Ausgabe des Skripts an

$basehref . '/ProcessUserInput.php'

Dies bricht, weil ProcessUserInput.php befindet sich in einem Unterverzeichnis von basehref. Wenn ich jedoch den Namen des Unterverzeichnisses zum Javascript hinzufüge, funktioniert es im IE nicht mehr.

Lösungen?

Ich kann mir einige Möglichkeiten vorstellen, dieses Problem zu lösen:

  • Lesen Sie in Javascript die HREF-Eigenschaft des BASE-Tags und fügen Sie sie manuell vor var URI in dem Javascript, das eine vollständig aufgelöste absolute URL aufruft
  • Verarbeiten Sie die .js Datei mit PHP und fügen Sie die $basehref Variable in das Skript einfügen
  • Verschieben Sie die Dateien
  • Etwas anderes?

Ich bin sicher, dass es auch andere Möglichkeiten gibt, dieses Problem zu lösen. Was ist der beste Weg, um mit BASE HREF in JavaScript umzugehen, wenn IE und Firefox es unterschiedlich in JavaScript anwenden?

7voto

ElBel Punkte 1922

Die Verwendung des assign Methode von window.location scheint die einfachste Antwort zu sein.

Anstelle von

window.location = URI;

Ich benutze das hier:

window.location.assign( URI ); 

die sowohl im IE als auch in Firefox das Richtige tut.

9 Stimmen

Nein, das löst nicht das base href Problem im IE (ab Version 8). Ich hatte gerade ein Lächeln im Gesicht, als ich sah, wie einfach das gelöst werden kann, aber es dauerte nur eine Minute.

0 Stimmen

Wie von @Halil Özgür erwähnt, sollte dies nicht die akzeptierte Antwort sein.

6voto

bobince Punkte 512550

IE und Firefox/Safari scheinen mit Anfragen vom Typ BASE HREF und Javascript window.location unterschiedlich umzugehen.

Ja, das ist ein langjähriger Unterschied, der bis in die Anfänge von Netscape vs. IE zurückreicht.

Der IE erzwingt base-href nur an dem Punkt, an dem mit einem Dokumentelement interagiert wird. Sie können also createElement('a') setzen Sie eine relative href y click() it*, aber der base-href wird ignoriert; appendChild it an das Dokument, das den base-href enthält, und es wird funktionieren.

Bei den anderen Browsern wird der Basis-Hef als global pro Fenster betrachtet und immer angewendet. Was ist nun richtig? Es scheint nicht spezifiziert zu sein. Die ursprünglichen JavaScript-Dokumente sagen nur, dass location.hash (und damit, location als Zeichenkette angewendet):

steht für eine vollständige URL

Das Setzen auf eine relative URL scheint also ein undefinierter Vorgang zu sein.

(*: link.click() ist eine nicht standardisierte Methode, die von IE und Opera unterstützt wird)

die HREF-Eigenschaft des BASE-Tags lesen und manuell voranstellen

Wahrscheinlich würde ich das tun, ja, wenn du unbedingt <base> verwenden willst.

0 Stimmen

Danke, wie vorgeschlagen... Ich habe es so gemacht window.location.href = document.getElementById("myBase").href + 'Company#!/companylist'; Es funktionierte sowohl auf IE und Chrome

3voto

Dan Lew Punkte 83507

Ich glaube, Sie wollen window.location.pathname ändern, nicht window.location. window.location ist ein Location-Objekt, das mehrere Variablen hat. Folglich sind die Auswirkungen einer Änderung nicht genau definiert. window.location.pathname ist jedoch als Pfad relativ zum Host definiert, und das ist es, was Sie wollen.

Wenn Sie mehr über die vielen Variablen, die Sie in window.location ändern können, nachlesen möchten, lesen Sie bitte aquí . Nach der Dokumentation von Mozilla sollte eine Änderung der Variablen in window.location die Seite mit einer neuen URL laden, die diesen Änderungen entspricht.

1 Stimmen

Schreiben einer Zeichenfolge an einen Ort ist in Ordnung, doc'd zurück so weit wie JS 1.0. Siehe docs.sun.com/source/816-6408-10/location.htm#1193137 - "Wenn Sie der location-Eigenschaft eines Objekts eine Zeichenfolge zuweisen, erstellt JavaScript ein location-Objekt und weist diese Zeichenfolge seiner href-Eigenschaft zu."

3voto

sergio0983 Punkte 1220

Ich hatte das gleiche Problem heute, nach einigen Recherchen, konnte keine Möglichkeit finden, dieses Problem in IE9 zu überschreiben, was eine requiremente für mein Projekt ist, so habe ich den folgenden Ansatz (jquery basiert, aber es ist wirklich einfach, es in einfachen Javascript zu machen).

href = function(url){
    if ($("base").length > 0 ){
        location.href= $("base").attr("href")+url;
    }else{
        location.href = url;
    }
}

Und dann, Veränderung

location.href= 'emp/start' 

zu

href('emp/start');

2voto

nassim aouragh Punkte 21

Einfach hinzufügen $('base').attr('href') vor dem Link. (mit jquery) oder

document.getElementBytagname('base').href

0 Stimmen

Die Zeile oben sollte lauten: document.getElementsByTagName('base')[0].href

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X