2011-09-01 59 views
3

我正在嘗試使用jQuery設置元素的href。當我在Firefox 6中設置IDN時,href被url編碼。一個例子是IDN http://räksmörgås.se,其被修改爲http://r%C3%A4ksm%C3%B6rg%C3%A5s.se。當我在其他瀏覽器(IE8,Chrome 13,Safari 5.1)中執行相同操作時,IDN未被編碼。國際域名+火狐中的JQuery attr('href')問題

我試圖做到這一點的原因是,我讓用戶更改hrefs,然後通過ajax將一部分頁面內容上傳到Web服務器。然後我有問題,因爲鏈接深埋在一個html字符串中;而且我不想挖掘html字符串中的所有元素。

有沒有辦法在Firefox中設置時禁用hrefs的編碼?或者您有任何其他方式可以解決問題嗎?我注意到如果href是一個有效的punycode國際化域名,即http://www.xn--rksmrgs-5wao1o.se,瀏覽器是好的,花花公子,但我必須做js中的punycode編碼,我不想這樣做;有可能是一個或多個錯誤,並且似乎沒有正式版本的編碼器/解碼器。)

以下html頁面顯示我的問題。如果您輸入國際域名(複製粘貼「http://www.räksmörgås.se」),則#linkHtml將獲得整個元素,包括使用Firefox時的損壞href,以及使用任何其他瀏覽器時的正確href 。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
<script src="http://code.jquery.com/jquery-1.6.2.min.js"></script> 
<script> 
$(document).ready(function(){ 
$("#linkText").focus(); 
$("#linkText").keyup(function() { 
    var href = $(this).val(); 
    $("#link").attr('href', href); 
    $("#linkHtml").text($("#link").parent().html()); 
}); 
}); 
</script> 
</head> 
<body> 
<div><input id="linkText" type=text /></div> 
<div><a id="link" href="#">link</a></div> 
<span id="linkHtml"></span> 
</body> 
</html> 
+0

我已經看到這與未被Mozilla列入白名單的頂級域名(儘管.se應該可以:http://www.mozilla.org/projects/security/tld-idn-policy-list.html),所以也許有什麼類似的錯誤?另見:http://idn.icann.org/Firefox_Information和http://www.slideshare.net/playingwithsid/universal-acceptability – m90

+0

嗯,它看起來對我來說還好(Firefox 6 @ ubuntu) - 更新後的href不是'終止了。 – WTK

+0

@WTK,你是否在跨度或Firebug中檢查輸出?它好像Firebug解碼網址,所以不可能只檢查螢火蟲。 –

回答

0

使用decodeURI(原生功能),如果你關心的是如何顯示這個HREF值。以下顯示在Firefox中確定。

$("#linkHtml").text(decodeURI($("#link").parent().html())); 

Techincally,據我所知,即使是在Firefox中顯示編碼值你應該確定以提交給一些服務器後的數據。

+0

確實,我的示例中的decodeURI正確顯示。但是,我將DOM的子集提交給服務器(即提交$(「#someDistantParentToTheLink」)。html()),我有點擔心這會解碼不應解碼的東西。 –

+0

所以你走了,你不應該解碼它 - 我知道在服務器端的任何東西都可以處理這種解碼。你提到過「,我不想挖掘html字符串中的所有元素。」 - 你是什麼意思 - 挖掘html中的所有元素 - 編碼/解碼是否會改變這個問題? – WTK

+0

好吧,我向服務器提交了一堆html,並且當用戶使用Firefox時,所有IDN鏈接的href都被編碼,但在使用任何其他瀏覽器時都不會。這意味着我不得不通過挖掘服務器端的所有A標籤來解決這個問題,並且如果用戶使用Firefox,html將對它們進行解碼(yay,regex)。 –