2011-07-13 60 views
1

我們正在使用jQuery 1.5.1在我正在使用的網站上。我最近在Internet Explorer 8中發現了一個與我的HTML有關的問題jQuery在Internet Explorer 8的HTML標記中插入nodeIndex屬性

問題是'nodeIndex'屬性被插入到DOM中,大概是由jQuery插入的(請參閱下面有關提到nodeIndex的另一個StackOverflow問題)。該屬性不在頁面源代碼中 - 只有在DOM中,然後使用IE8(真棒)開發人員工具檢查它。

在IE8的DOM:

<DIV nodeIndex="4"> 
    <B nodeIndex="1">bold</B> 
    <BR nodeIndex="2"> 
    <I nodeIndex="3">italics</I> 
    <BR nodeIndex="4"> 
    <U nodeIndex="5">underline</U> 
    <BR nodeIndex="6"> 
</DIV> 

在FF5(和Chrome 12)DOM:

<div> 
    <b>bold</b> 
    <br> 
    <i>italics</i> 
    <br> 
    <u>underline</u> 
    <br> 
</div> 

的問題是,DIV是一個論壇帖子的文字內容。如果用戶想要引用論壇帖子,則帖子的html將被轉換爲BBCode(因爲較舊的論壇帖子使用BBCode標籤進行標記),並保持格式標記,並將其複製到用戶寫入新論壇帖子的文本(包括引用文本)。

使用JavaScript/jQuery可以很簡單地用相應的BBCode標籤替換html標籤,但是添加nodeIndex屬性使得有必要添加nodeIndex屬性的正則表達式替換,這看起來像一個醜陋的黑客。

誰能告訴我爲什麼在IE8(和IE7)中添加nodeIndex屬性,它是jQuery添加它們 - 更重要的是:我可以擺脫它們比使用正則表達式替換更好?

我工作的網站使用了一堆不同的JavaScript/jQuery腳本,因此可能會有衝突或至少是某些意外行爲,這些行爲是腳本組合的結果。

編輯:當在IE中禁用JavaScript時,屬性不存在。

其他StackOverflow的疑問,提到nodeIndex: Is nodeIndex a valid DOM element property in IE?

回答

2

誰能告訴我,爲什麼nodeIndex性質IE8(和IE7)加入了,是不是jQuery的,增加了他們 -

這些屬性是由Sizzle(jQuery選擇器引擎,比較jQuery源中的Sizzle.selectors對象的定義)添加的,推測原因是瀏覽器本身不支持:nth-child CSS僞c1屁股。

更重要的是:我能否以比使用正則表達式替換更好的方式擺脫它們?

乾淨的方法是將HTML代碼片段加載到DOM中,並從中刪除屬性。您可以使用jQuery本身在服務器端或客戶端執行此操作。

var htmlText = '<DIV nodeIndex="4">Some text.<BR nodeIndex="1"></DIV>'; 
var $html = $("<div>" + htmlText + "</div>"); 
$html.find("*[nodeIndex]").removeAttr("nodeIndex"); 
console.log($html.html()); 
// logs "<div>Some text.<br></div>" 
+0

感謝您的解釋@Tomalak。非常有意義的是nodeIndex屬性插入在IE7和8中,而不是在IE9和FF中。我忘記了jQuery中的removeAttr()方法 - 比操作html字符串的正則表達式更脆弱。 – Hildesheim

+0

@Hildesheim:絕對。同樣的事情會在服務器端工作,但絕對是更多的代碼行。但是,如果您已經有了將輸入HTML轉換爲BBcode的服務器端代碼,那麼在客戶端上執行這種操作是沒有意義的。 – Tomalak

+0

在這種情況下,我希望將文本複製到textarea而不必重新加載頁面,所以我最終使用了您建議的jQuery(removeAttr)。完美工作 - 也可以使用在某些情況下插入的'sizcache'和'sizset'屬性。 – Hildesheim

相關問題