Javascript onclick с базов етикет в т.е. с подпапка

Опитайте това: създайте папка test във вашия уебсайт и поставете този html файл (test.html) в нея:

<html><head>
<base href="http://www.site.com/" />
</head><body>
<span onclick="window.location.href='/bgtest/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="/bgtest/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