Неправильное извлечение.attr("href") в IE7 против всех других браузеров?
Неужели это правда, что 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?
7 ответов
Это, конечно, не ошибка в 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
Другой способ - просто использовать атрибут данных вместо href.
<a data-href="#anchor-0">example</a>
,
var href = $(this).attr('data-href');
Я использую:
var hrefArr = $(this).attr('href').split('/');
var id = hrefArr[hrefArr.length-1];
когда мне нужно все после последнего "/".
В итоге я создал переменную через PHP, а затем с помощью метода replace () javascript удалил ее из 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');