Javascript onclick с базовым тегом, т.е. с подпапкой

Попробуйте следующее: создайте папку test на своем веб-сайте и поместите в нее этот html-файл (test.html):

<html><head>
<base href="http://www.site.com/" />
</head><body>
<span onclick="window.location.href='test/test.html?done!';return false;">click me</span>
</body></html>

Нажмите на ссылку в вашем любимом браузере. Какой URL?

Щелкните ссылку в IE. Какой URL?

РЕДАКТИРОВАТЬ: IE перенаправляет вас на: http://www.site.com/test/test/test.html?done!

Любой способ исправить это, это не (1) удаление базового тега, (2) изменение onclick для использования функции, которая добавляет правильную базу? Есть ли способ переопределить функцию window.location.href в IE?


person Sean    schedule 20.10.2012    source источник
comment
Я бы, наверное, попытался ответить на этот вопрос, если бы вы сказали, что видите, вместо того, чтобы заставлять меня пробовать это. Риторические вопросы запоминаются, но не очень прозрачны.   -  person Paul Phillips    schedule 20.10.2012
comment
IE перенаправляет вас на: http://www.site.com/test/test/test.html?done!   -  person Sean    schedule 20.10.2012


Ответы (2)


После перемещения моего test.htm в подкаталог с именем test (конечный относительный путь: test/test.htm) я могу подтвердить ошибку (сначала я неправильно понял, о чем вы спрашивали). Гугление также подтверждает, что это ошибка, или по крайней мере, нестандартная реализация тега <base> (это может быть просто еще один случай, когда Microsoft не следует реализациям в соответствии со спецификацией).

IE будет учитывать тег <base> для любых определенных якорей.

<a href="test/test.html">Click me</span>

перейдет к http://www.site.com/test/test.html (при условии, что тег <base> либо не закрыт, либо не закрывается самостоятельно для более старых версий IE), но IE (все версии) будет учитывать базовый тег только для привязок, а не для JavaScript.

Причина, по которой IE добавляет дополнительный test/ к вашему URL-адресу, на самом деле является поведением, соответствующим стандартам. Поскольку IE игнорирует тег <base>, ваша ссылка test/test.html указывает на то, что существует подкаталог с именем test с файлом test.html относительно текущего каталога (test), и IE правильно переходит к `test/test/test.html'.

Насчет того, как это исправить...

  1. Удаление тега <base> не поможет.
  2. Замена onclick на функцию, возвращающую правильный базовый URL, будет работать, но вы заявили, что это неприемлемо.
  3. window.location.href - это строка, а не функция, поэтому "переопределение" ее не запускает.
  4. Изменение onclick для использования абсолютного URL-адреса также сработает.
  5. Удаление всех встроенных атрибутов onclick и назначение их через JavaScript (attachEvent или addEventListener) было бы более эффективным в долгосрочной перспективе (разделение контента/поведения) и позволило бы вам легко прикрепить правильный базовый URL (и метод, который я, вероятно, выбрал бы, хотя Я не знаю ваших конкретных обстоятельств).
  6. Вы можете использовать библиотеку манипулирования DOM, например jQuery/Dojo/Prototype, для циклического перебора любых атрибутов onclick и обновления URL-адреса до абсолютного URL-адреса.
person pete    schedule 20.10.2012
comment
Привет, Пит. Не должно быть файла C:\Users\Pete\Desktop\test.html. Файл test.html должен существовать только в папке test (также есть только 1 файл html, а не test.htm и test.html). В моем реальном приложении у меня есть папка reports. В этой папке у меня есть страница по умолчанию, на которой перечислены и ссылки на все страницы отчетов с относительными URL-адресами и базовым тегом, например reports\report1.html. Если я использую <a href='reports\report1.html'>, тег base учитывается. Но если я использую javascript onlick location.href, он терпит неудачу, потому что пытается перейти к \reports\reports\report1.html. - person Sean; 21.10.2012
comment
@SeanW: Ошибка подтверждена. Обновленный ответ. - person pete; 22.10.2012
comment
Спасибо Пит. Я отметил это как ответ, хотя это не тот ответ, который я хотел. - person Sean; 22.10.2012

Очевидно, это все еще проблема в IE11. Я столкнулся с этим только сейчас. Я сделал следующее:

onclick="window.location=document.getElementsByTagName('base')[0].href+'your_url_destination';"

Это требует изменения строки onclick, но не требует отдельной функции. Он должен работать во всех браузерах, и у меня пока работает.

person CSX321    schedule 01.09.2014