29

Неужели правда, что команда 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?

+2

Немного обоим - IE7 несовместим, но jQuery все равно должен его обрабатывать. – Keith

+0

Это происходит и в IE8, как я узнал недавно. Не уверен, какой тег удалить, чтобы добавить его. Определенно не ограничиваясь только jQuery. Случается при использовании getAttributeNode ("href"). –

ответ

18

Это, конечно, не ошибка в 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

+0

Не было вопроса о том, как получить опорную часть href. Я подумал об этом. Мне просто было интересно, почему существует разница. Но большое спасибо за ответ в любом случае. Мне нужно было получить опорную часть, поэтому я просто использовал подстроку для извлечения правильного значения :) – EmKay

+0

Я столкнулся с этой проблемой сегодня с IE8. мы признаем, что если бы мы использовали полное доменное имя, то есть http://app.somedomain.com/virtualDir/page.aspx, то текст атрибута был возвращен. однако, если мы использовали только имя машины netbios, тогда возвращался абсолютный URL-адрес ... причудливый. – CedricB

+6

jQuery мог бы помочь стандартизировать поведение, как и для объектов Event. –

1

Я использую:

var hrefArr = $(this).attr('href').split('/'); 
var id = hrefArr[hrefArr.length-1]; 

, когда мне нужно все после того, как последний "/".

+0

Но тогда, если href «http://example.com/folder/page.htm» или просто «/ folder/page .htm "? Тогда вы получите только «page.htm», и это неверно. – EmKay

+0

Это было просто, чтобы показать простой пример. У меня здесь нет кода, но вы можете запустить массив и проверить строки. Например, все строки после подстановки, содержащие «.com» в конце. Прямо вперед .... – chrwahl

+0

Вы должны использовать регулярные выражения для таких вещей. Гораздо реже ломается. – Keyo

4

Я считаю, что это реализовано так же, как и во всех IE 7+.

Я использую:

var href=jQuery('#foo').attr('href'); 
href=href.substring(href.indexOf('#')); 

Надеется, что это помогает! Cheers.

+0

(Похоже, что есть свойство this.hash, которое можно использовать тоже, см. На странице Библии JavaScript 603 (http://goo.gl/OF16Q), в большинстве браузеров, по крайней мере, в IE 7. Затем вы не захотите, t нужно вызвать 'substr'.) – KajMagnus

2

Я нашел ошибку, связанную с этой проблемой: http://bugs.jquery.com/ticket/2747 jQuery реализовал обходной путь для IE7 'bug'. Однако в jQuery 1.7.1 эта ошибка была повторно введена. Я создал новую ошибку для 1.7.1: http://bugs.jquery.com/ticket/11129

+2

Я заметил, что ошибка была закрыта, поскольку« невозможно воспроизвести », но тестовый пример, который они дали, был неисправен. Я создал новый тест JSFiddle, чтобы проиллюстрировать ошибку - надеюсь, билет будет вновь открыт. –

+0

..... aaaaaand снова закрыт .... –

+0

Случается для меня в 1.7.1 также – Armand

0

Я в конечном итоге создать переменную с помощью PHP, а затем с помощью 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> 
1

другой путь для использования атрибута данных вместо href

<a data-href="#anchor-0">example</a> 

.

var href = $(this).attr('data-href'); 
-1

Проблема в том, что IE7 и IE8 изменяют также текст.Поэтому неплохо обходимо это сделать

$('#linkId').attr('href','newlink').text('oldtext');