TIPS-小心IE7會偷改Anchor式HREF

今天用jQuery UI Tabs做網頁,其中部分頁籤要動態產生,故現場組裝<li><a href='#divName'><span>tabName</span></a></li>,再呼叫.tabs()達到目的。測試發現,動態產生的頁籤,在IE8開啟IE7相容模式時,點下去會以動態方式載入同一頁面,害網頁中的$(function() { ... })重覆被執行,弄得網頁一團亂。但若使用FF、Chrome甚至切成IE8標準模式執行,則沒有任何問題。

模索了好久,總算找出問題關鍵。

我寫成一小段Code,大家可以自己用Mini jQuery Lab實測一下:

$("body").append("<a href='#aaa'>AAA</span></a>");
alert($("body").html());
$("body").html("<a href='#aaa'>AAA</span></a>");
alert($("body").html());

大家覺得alert出來的結果是什麼,應該是<A href="#aaa">AAA</SPAN></A>吧? 對IE8, FF, Chrome來說是這樣沒錯,但在IE7模式下,卻會得到以下結果(其中htt"q"是故意改掉的,以避免PO文時被自動套上連結):
<A href="httq://www.darkthread.net/minijquerylab/EmptyFrame.htm#aaa">AAA</SPAN></A>

是的,不管用html()或append(),IE7都會很雞婆地套上location.href,而對jQuery UI Tabs來說,看到http開頭就意味著要由外部載入,才搞出這場風波。

最後,我用了以下的寫法含淚躲開...

$("body").append("<a xhref='#aaa'>AAA</span></a>");
$("a[xhref]").each(function() { 
    var a = $(this);
    a.attr("href", a.attr("xhref"));
    a.removeAttr("xhref");
}); 
alert($("body").html());
歡迎推文分享:
Published 02 June 2009 07:03 PM 由 Jeffrey
Filed under: ,
Views: 17,226



意見

# 阿育 said on 02 June, 2009 07:04 AM

嗨!黑暗兄最近才發現這個部落格,真是不錯!

我一直習慣jQuery DOM式的寫法(這名稱是我亂掰的XD),所以沒遇過你說的問題耶

請試試以下寫法,IE6 & 7 都沒問題

a = $('<a></a>');

a.attr("href","#aaa");

$("body").html(a);

alert($("body").html());

a = $('<a></a>');

a.attr("href","#aaa");

$("body").append(a);

alert($("body").html());

另外,您寫的Mini jQuery Lab跟Mini C# Lab都很好用哦,感謝分享

# Jeffrey said on 02 June, 2009 09:28 AM

to 阿育,有趣的地方來了,DOM的寫法(先建元件再設attr)比起直接串好html字串再用html()指定慢上許多(例如: 這篇評比-www.learningjquery.com/.../43439-reasons-to-use-append-correctly),所以我挺習慣先跑迴圈組html再一次設定,結果---有得就有失! 哈!

# 阿育 said on 02 June, 2009 10:07 AM

這個問題我倒是沒注意過,因為平常這種指令每次執行的量不算大,所以沒感覺有差異

也很有趣的是,我習慣這麼寫是因為曾經看過某篇文章,在設定某些屬性的時候,組字串的方法會有問題 XD

聽你這麼說,下次單次執行量大的時候,我會試著用組字串的方法

另外更搞笑的是....剛剛才發現....原來你的文章最後有寫解決方法了,我在做啥啊?太搞笑 XDDDDD

# WD said on 03 June, 2009 12:24 PM

@暗黑

可以先以 $.support.hrefNormalized 來判斷 browser 是否會有以上行為, 再加上先建元件後設attr的方法來達到速度和簡潔.

$("body").append( $.support.hrefNormalized ? ($("<a href='#aaa'></a>")) : ($("<a />").attr("href", "#aaa")));

WD

# Jeffrey said on 03 June, 2009 02:46 PM

to WD, 幹得好!! 這招我學起來了(抄筆記)

# azure said on 09 November, 2009 12:34 AM

不好意思,想請教$.support.hrefNormalized 相關用法..如果他是有階層性的,如:<div><a href='#aaa'></a><div>

$("body").append( $.support.hrefNormalized ? ($("<div><a href='#aaa'></a><div>")) : (這邊我怎麼寫都會有錯誤...));

能請教一下該怎寫嗎?

# Jeffrey said on 09 November, 2009 02:57 AM

to azure, 可以寫成這樣子: $("body").append( $.support.hrefNormalized ? $("<div><a href='#aaa'>AAA</a></div>") : $("<a />").attr("href", "#aaa").text("AAA").wrap("<div></div>").parent() );

# azure said on 09 November, 2009 03:59 AM

原來可以這樣用。。,受教了

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<June 2009>
SunMonTueWedThuFriSat
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication