2009-03-10 2 views
17

Вопрос:БАЗА HREF, JavaScript и Internet Explorer против Firefox

IE и Firefox/Safari, кажется, дело по-разному с базовыми HREF и запросами типа window.location Javascript. Во-первых, это точное описание проблемы? Что происходит? И какое лучшее кросс-браузерное решение для решения этой ситуации?

Контекст:

У меня есть небольшой PHP плоский файл sitelet (это на самом деле тестирование прототипа юзабилити).

Я динамически генерировать значение HREF базового тега в PHP, то есть если он работает на сервере нашей компании, это:

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

и на моем локальном Dev машине, это:

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

Для одна из задач, я собираю некоторый ввод пользователя, делаю некоторые преобразования на нем в Javascript и отправляю серверу с помощью кода:

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

Оба файла javascript (содержащие функцию allDone()) и PHP-скрипт обработки (ProcessUserInput.php) живут в подкаталоге UsabilityTest. Другими словами, их фактический URL является

http://www.example.com/alpha/bravo/UsabilityTest/фокстрот/ProcessUserInput.php ака

$basehref . '/foxtrot/ProcessUserInput.php'

Проблема

JavaScript в IE в основном, кажется, игнорируют БАЗЫ HREF. Javascript и процессор PHP живут в одном каталоге, поэтому вызов ProcessUserInput.php работает отлично. Вход обрабатывается, и все работает нормально.

Но когда я тест на Firefox, то JavaScript делает по всей видимости, использовать базу HREF, потому что выход скрипта отправляется в

$basehref . '/ProcessUserInput.php' 

Это ломается, потому что ProcessUserInput.php находится в подкаталоге из basehref. Однако, если я добавлю имя подкаталога в javascript, он больше не работает в IE.

Решения?

Я могу придумать несколько способов решить эту:

  • В Javascript, читать HREF свойство базового тега и вручную вставляться в var URI в JavaScript, вызов полностью разрешенную абсолютный URL
  • Обработать .js файл с PHP и вставить переменную $basehref в скрипт
  • Переместить файлы около
  • Что-то еще?

Я уверен, что должны быть и другие способы решить эту проблему. Каков наилучший способ справиться с BASE HREF в JavaScript, когда IE и Firefox применяют его по-разному в JavaScript?

ответ

7

Использование метода window.location похоже на самый простой ответ.

Вместо

window.location = URI; 

Я использую это:

window.location.assign(URI); 

, который делает правильную вещь как в IE и Firefox.

+9

Нет, это не решает проблему базового href в IE (начиная с версии 8). У меня появилась улыбка на лице, когда я увидел, насколько просто это можно решить, но это продолжалось всего минуту. –

+0

Как упоминалось @Halil Özgür, это не должен быть принятый ответ. – fritzmg

3

Я считаю, что вы хотите изменить window.location.pathname, а не window.location. window.location - это объект Location, который имеет несколько переменных. В результате эффекты его изменения недостаточно четко определены. Однако window.location.pathname определяется как путь относительно хоста, который вы хотите.

Если вы хотите узнать больше о многих переменных, которые вы можете изменить в window.location, я бы проверил here. Согласно документации Mozilla, изменение любой переменной в window.location должно перезагрузить страницу с новым URL-адресом, соответствующим этим изменениям.

+1

Запись строки в нужное место в порядке, doc'd назад до JS 1.0. См. Http://docs.sun.com/source/816-6408-10/location.htm#1193137 - «Если вы назначаете строку свойству местоположения объекта, JavaScript создает объект местоположения и присваивает эту строку его href property. " – bobince

+2

pathname не решает проблему. –

+0

window.location.pathname работал для меня в IE, спасибо –

6

IE и Firefox/Safari, похоже, по-разному обрабатывают запросы типа BASE HREF и Javascript window.location.

Да, это давняя разница, относящаяся к ранним дням Netscape-vs-IE.

IE активирует base-href только в точке, в которой взаимодействует элемент документа. Итак, вы можете createElement('a'), установите относительный href и click() это *, но base-href будет проигнорирован; appendВведите его в документ, содержащий base-href, и он будет работать.

В других браузерах base-href принимается за глобальное окно и всегда применяется. Какой правильный? Это кажется неуказанным. Исходные документы JavaScript только сказать, что location.hash (и, следовательно, location применяется в виде строки):

представляет собой полный URL

Так установить его в относительный URL, казалось бы, неопределенная операция.

(*: link.click() не является стандартным методом поддерживается IE и Opera)

читать HREF свойство базового тега и вручную предварять

Возможно, что я «Да, да, если вы мертвы, установите < base>.

+0

спасибо, как было предложено ... Я сделал это так: window.location.href = document.getElementById ("myBase"). Href + 'Company #!/Companylist' ; Он работал как на IE, так и на Chrome –

2

просто добавьте $('base').attr('href') перед ссылкой. (С помощью JQuery) или

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

Строка выше должна выглядеть так: document.getElementsByTagName ('base') [0] .href –

2

У меня была такая же проблема сегодня, после некоторого исследования, couldn't findn каким-либо образом, чтобы переопределить этот вопрос в IE9, а что такое requiremente для моего проекта, поэтому, я сделал следующее подход (основанный на jquery, но это очень легко сделать в простом javascript).

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

А затем измените

location.href= 'emp/start' 

в

href('emp/start'); 
0

Вы всегда можете использовать Vanilla JS :)

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

Я надеюсь, что это помогает.

Смежные вопросы