Неправильное извлечение .attr(“href”) в IE7 по сравнению со всеми другими браузерами?
-
22-09-2019 - |
Вопрос
Действительно ли это правда, что attr("href")
команда для ссылки обрабатывается в IE7 совсем по-другому по сравнению со всеми другими браузерами?
Допустим, у меня есть страница по адресу http://example.com/page.html и у меня есть этот HTML:
<a href="#someAnchor" class="lnkTest">Link text</a>
и этот jQuery:
var strHref = $(".lnkTest").attr("href");
Тогда в IE7 значение strHref
переменная будет "http://example.com/page.htm#someAnchor"
но в других браузерах это будет "#someAnchor"
.
Я считаю, что последний упомянутый случай является наиболее правильным, так это просто случай, когда IE7 — плохой мальчик, или это ошибка в jQuery?
Решение
Это конечно нет ошибка в jQuery, но вместо этого в браузерах возникают противоречивые реализации .getAttribute('href')
- Я предлагаю использовать просто .get(0).href
для последовательности.
Похоже, вы можете получить доступ к тексту атрибута в IE и Mozilla, используя .get(0).getAttribute('href', 2)
если вам не нужен абсолютный URI.Однако обратите внимание, что это не будет работать в Opera, и я не тестировал в Safari/Chrome/чем-либо еще.
Вы также можете удалить домен или разделить его на «#» для .get(0).href
и используйте вторую часть массива, предполагая, что она даже содержит '#' (проверьте .length
).
Другие советы
Я считаю, что это реализовано так во всех IE 7+.
Я использую:
var href=jQuery('#foo').attr('href');
href=href.substring(href.indexOf('#'));
Надеюсь, поможет!Ваше здоровье.
Я нашел ошибку, связанную с этой проблемой: http://bugs.jquery.com/ticket/2747 jQuery реализовал обходной путь для «ошибки» IE7.Однако в jQuery 1.7.1 эта ошибка снова появилась.Я создал новую ошибку для 1.7.1: http://bugs.jquery.com/ticket/11129
Я использую:
var hrefArr = $(this).attr('href').split('/');
var id = hrefArr[hrefArr.length-1];
когда мне нужно все после последнего "/".
другой способ — просто использовать атрибут данных вместо href
<a data-href="#anchor-0">example</a>
.
var href = $(this).attr('data-href');
В итоге я создал переменную через PHP, а затем с помощью метода javascript replace() удалил ее из href:
<script>var domain = 'http://<?=$_SERVER['HTTP_HOST']?>';</script>
<script>
$(function(){
/* prevent default action of all anchors with hash class */
$('#canvas').on('click', 'a.hash', function(event) {
event.preventDefault();
// get the href of the anchor
var hash = '!' + $(this).attr('href');
// remove the absolute url if it exists
hash = hash.replace( domain, '' );
// redirect
window.location.hash = hash;
});
});
</script>
Проблема в том, что IE7 и IE8 также меняют текст.Итак, хороший обходной путь - сделать вот так
$('#linkId').attr('href','newlink').text('oldtext');