2009-10-20 21 views
29

Có thể thực sự là lệnh attr("href") cho một liên kết được xử lý rất khác trong IE7 so với tất cả các trình duyệt khác không?Khai thác sai .attr ("href") trong IE7 so với tất cả các trình duyệt khác?

Hãy nói rằng tôi có một trang tại http://example.com/page.html và tôi có HTML này:

<a href="#someAnchor" class="lnkTest">Link text</a> 

và jQuery này:

var strHref = $(".lnkTest").attr("href"); 

Sau đó, trong IE7 giá trị của biến strHref sẽ "http://example.com/page.htm#someAnchor" nhưng trong các trình duyệt khác, nó sẽ là "#someAnchor".

Tôi tin rằng trường hợp được đề cập gần đây nhất là trường hợp đúng nhất, vì vậy nó chỉ là một trường hợp IE7 là một cậu bé xấu hay là một lỗi trong jQuery?

+2

Đó là một chút của cả hai - IE7 không nhất quán, nhưng jQuery vẫn nên xử lý. – Keith

+0

Điều này cũng xảy ra trong IE8, như tôi đã phát hiện gần đây. Bạn không chắc chắn nên xóa thẻ nào để thêm thẻ. Chắc chắn không giới hạn jQuery mặc dù. Xảy ra khi sử dụng getAttributeNode ("href"). –

Trả lời

18

Chắc chắn không phải là lỗi trong jQuery nhưng thay vì triển khai không nhất quán của trình duyệt là .getAttribute('href') - Tôi khuyên bạn chỉ nên sử dụng .get(0).href để nhất quán.

Có vẻ như bạn có thể truy cập văn bản thuộc tính trong IE và Mozilla bằng cách sử dụng .get(0).getAttribute('href', 2) nếu bạn không muốn URI tuyệt đối. Lưu ý tuy nhiên điều này sẽ không làm việc trong Opera và tôi đã không được thử nghiệm trong Safari/Chrome/bất cứ điều gì khác.

Bạn cũng có thể loại bỏ miền hoặc chia thành '#' cho .get(0).href và sử dụng phần thứ hai của mảng giả sử thậm chí có chứa '#' (kiểm tra .length).

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

+0

Đó không phải là câu hỏi về cách lấy phần neo của href. Tôi đã tìm ra một bản thân. Tôi chỉ tò mò về lý do tại sao sự khác biệt tồn tại. Nhưng cảm ơn rất nhiều vì đã trả lời. Tôi cần thiết để có được phần neo vì vậy tôi chỉ sử dụng chuỗi con để trích xuất các giá trị chính xác :) – EmKay

+0

tôi chạy vào vấn đề này ngày hôm nay với IE8. chúng tôi xu hướng rằng nếu chúng tôi sử dụng tên miền hoàn toàn đủ điều kiện, ví dụ: http://app.somedomain.com/virtualDir/page.aspx, thì văn bản thuộc tính được trả lại. tuy nhiên, nếu chúng ta chỉ sử dụng tên máy netbios thì url tuyệt đối đã được trả về ... freaky. – CedricB

+6

jQuery có thể đã giúp tiêu chuẩn hóa hành vi giống như đối tượng sự kiện. –

1

tôi sử dụng:

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

khi tôi cần tất cả mọi thứ sau khi người cuối cùng "/".

+0

Nhưng sau đó những gì nếu href là "http://example.com/folder/page.htm" hoặc chỉ đơn giản là "/ thư mục/trang .htm "? Sau đó, bạn sẽ chỉ nhận được "page.htm" và điều này là không chính xác. – EmKay

+0

Đây chỉ là một ví dụ đơn giản. Tôi không có ví dụ mã ở đây, nhưng bạn có thể chạy qua mảng và kiểm tra chuỗi. Ví dụ: tất cả các chuỗi sau một trạm biến chứa ".com" ở cuối. Thẳng về phía trước .... – chrwahl

+0

Bạn nên sử dụng cụm từ thông dụng cho các nội dung như thế này. Ít có khả năng phá vỡ. – Keyo

4

Tôi tin rằng nó được triển khai giống như vậy trong tất cả IE 7+.

tôi sử dụng:

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

Hy vọng nó sẽ giúp! Chúc mừng.

+0

(Có vẻ như có một tài sản 'this.hash' mà người ta cũng có thể sử dụng, xem trang Kinh Thánh JavaScript 603 (http://goo.gl/OF16Q), trong hầu hết các trình duyệt, trong IE 7 ít nhất. Sau đó, bạn sẽ ' t cần phải gọi 'substr'.) – KajMagnus

2

Tôi đã tìm thấy lỗi liên quan đến vấn đề này: http://bugs.jquery.com/ticket/2747 jQuery đã triển khai giải pháp khắc phục lỗi IE7 '. Tuy nhiên trong jQuery 1.7.1 lỗi này đã được giới thiệu lại. Tôi tạo ra một lỗi mới cho 1.7.1: http://bugs.jquery.com/ticket/11129

+2

Tôi nhận thấy lỗi đã được đóng lại là" không thể tái tạo "nhưng trường hợp kiểm tra mà họ đưa ra bị lỗi. Tôi đã tạo một thử nghiệm JSFiddle mới để minh họa cho lỗi - hy vọng vé sẽ được mở lại. –

+0

..... aaaaaand đóng lại ... –

+0

Xảy ra cho tôi trong 1.7.1 cũng – Armand

0

tôi đã kết thúc việc tạo ra một biến qua PHP, sau đó sử dụng javascript replace() phương pháp dải nó ra khỏi 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

cách khác là để chỉ sử dụng thuộc tính dữ liệu, thay vì href

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

.

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

Vấn đề là IE7 và IE8 cũng thay đổi văn bản.Vì vậy, một cách giải quyết tốt là làm như thế này

$('#linkId').attr('href','newlink').text('oldtext'); 
Các vấn đề liên quan