2009-03-10 7 views
17

Pytanie:BASE HREF, javascript i Internet Explorer vs Firefox

IE i Firefox/Safari wydają się radzić sobie inaczej z base href i żądania typu window.location Javascript. Po pierwsze, czy jest to dokładny opis problemu? Co się dzieje? A jakie jest najlepsze rozwiązanie dla różnych przeglądarek, które poradzi sobie z tą sytuacją?

Kontekst:

Mam mały sitelet PHP płaskim pliku (to właściwie prototyp badania usability).

I dynamicznego generowania wartość HREF tagu bazowej w PHP, czyli jeśli jest uruchomiony na serwerze naszej firmy, to:

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

i na moim komputerze lokalnym dev, to:

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

Dla jednym z zadań, zbieram trochę danych wejściowych od użytkownika, wykonuję na nim transformacje w JavaScript i wysyłam na serwer za pomocą kodu takiego:

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

Zarówno plik javascript (zawierający funkcję allDone()), jak i przetwarzający skrypt PHP (ProcessUserInput.php) znajdują się w podkatalogu UsabilityTest. Innymi słowy, ich rzeczywisty adres URL jest

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

$basehref . '/foxtrot/ProcessUserInput.php'

Problem

JavaScript IE wydaje się w zasadzie ignorować href BASE. Javascript i procesor PHP działają w tym samym katalogu, więc wywołanie ProcessUserInput.php działa dobrze. Dane wejściowe są przetwarzane i wszystko działa poprawnie.

Ale kiedy testować na Firefox, kod JavaScript robi pojawiają używać href BASE, ponieważ wyjście skryptu zostanie wysłana do

$basehref . '/ProcessUserInput.php' 

psuje to, bo ProcessUserInput.php jest w podkatalogu z basehref. Jednak jeśli dodaję nazwę podkatalogu do javascript, nie będzie już działać w IE.

Rozwiązania?

mogę myśleć kilka sposobów, aby rozwiązać ten problem:

  • W JavaScript odczytać właściwość HREF znacznika BASE i ręcznie dołączana do var URI w javascript wywołaniem pełni rozwiązane bezwzględny adres URL
  • Przetwórz .js plik z PHP i wstaw zmienną $basehref do skryptu
  • Przenoszenie plików wokół
  • Coś jeszcze?

Jestem pewien, że muszą istnieć inne sposoby rozwiązania tego problemu. Jaki jest najlepszy sposób radzenia sobie z BASE HREF w JavaScript, gdy IE i Firefox stosują go inaczej w JavaScript?

Odpowiedz

7

Metoda window.location wydaje się być najprostszą odpowiedzią.

Zamiast

window.location = URI; 

używam to:

window.location.assign(URI); 

który postępuje słusznie zarówno w IE i Firefox.

+9

Nie, to nie rozwiąże problemu baza href w IE (w wersji 8). Po prostu dostałem uśmiech na mojej twarzy, gdy zobaczyłem, jak łatwo można to rozwiązać, ale trwało to tylko minutę. –

+0

Jak wspomniano w @Halil Özgür, nie powinno to być zaakceptowaną odpowiedzią. – fritzmg

3

Wydaje mi się, że chcesz zmodyfikować window.location.pathname, a nie window.location. window.location to obiekt Location, który ma wiele zmiennych. W rezultacie efekty zmiany nie są dobrze zdefiniowane. Jednak nazwa window.location.path jest zdefiniowana jako ścieżka względem hosta, co jest tym, czego potrzebujesz.

Jeśli chcesz przeczytać więcej na temat wielu zmiennych, które możesz zmienić w window.location, chciałbym sprawdzić here. Zgodnie z dokumentacją Mozilli, zmiana dowolnej zmiennej w window.location powinna przeładować stronę z nowym adresem URL odpowiadającym tym zmianom.

+1

Zapisywanie ciągu znaków w lokalizacji jest w porządku, z powrotem do JS 1.0. Zobacz http://docs.sun.com/source/816-6408-10/location.htm#1193137 - "Jeśli przypiszesz ciąg do właściwości lokalizacji obiektu, JavaScript utworzy obiekt lokalizacji i przypisze ten ciąg do jego Właściwość href. " – bobince

+2

ścieżka dostępu nie rozwiązuje problemu. –

+0

window.location.pathname pracował dla mnie w IE, dzięki –

6

Wygląda na to, że przeglądarki IE i Firefox/Safari różnią się w zależności od żądania BASE HREF i JavaScript window.location.

Tak, to długotrwała różnica sięgająca początków Netscape-vs-IE.

IE wymusza base-href tylko w momencie interakcji elementu dokumentu. Tak więc możesz ustawić createElement('a'), ustawić względny href i click() it *, ale base-href zostanie zignorowany; appendChild go do dokumentu zawierającego base-href, a to zadziała.

W pozostałych przeglądarkach baza-href jest traktowana jako globalna dla każdego okna i zawsze stosowana. Który jest poprawny? Wydaje się nieokreślone. Oryginalne docs JavaScript tylko powiedzieć, że location.hash (a co za tym idzie, location stosowane jako ciąg znaków):

oznacza pełny adres URL

więc ustawienie go do względnego URL wydaje się być zdefiniowana operacja.

(*: link.click() jest niestandardowa metoda obsługiwane przez IE i Opera)

odczytać właściwość HREF znacznika BASE i ręcznie poprzedzić

Prawdopodobnie co ja Daj, tak, jeśli nie żyjesz, skorzystaj z bazy <.

+0

dzięki, jak sugeruje ... Zrobiłem to w ten sposób window.location.href = document.getElementById ("myBase"). Href + 'Company #!/Companylist' ; To działało zarówno na IE i Chrome –

2

po prostu dodaj $('base').attr('href') przed linkiem. (Przy użyciu jQuery) lub

document.getElementBytagname('base').href 
+0

powyższej linii następujący: document.getElementsByTagName ('podstawa') [0] .href –

2

miałem ten sam problem dzisiaj, po pewnym badania, niewdzięcznymi findn dowolny sposób, aby zastąpić tę kwestię w IE9, co jest requiremente dla mojego projektu, więc zrobiłem następujące podejście (oparte na jquery, ale bardzo łatwo zrobić to w prostym javascript).

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

A potem zmień

location.href= 'emp/start' 

do

href('emp/start'); 
0

zawsze można użyć Vanilla JS :)

var href = document.getElementBytagname('base')[0].href 

Mam nadzieję, że to pomaga.

Powiązane problemy