Неправильное извлечение.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).

http://www.glennjones.net/Post/809/getAttributehrefbug.htm

Я считаю, что это реализовано во всех 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');
Другие вопросы по тегам