2012-07-17 25 views
0

不工作我有此Javascript這裏:的Javascript子和的indexOf在IE9

function getTxt(obj) { 
var first = obj.innerHTML.substring(0, obj.innerHTML.indexOf('<span class=\"item2\">')); 
var second = obj.innerHTML.substring(obj.innerHTML.indexOf('<span class=\"item2\">')); 
var f = first.replace(/(<([^>]+)>)/ig,''); 
var s = second.replace(/(<([^>]+)>)/ig,''); 
alert(first + "\n" + second + "\n" + f + "\n" + s); 
} 

和HTML:

<span class="item" onclick="getTxt(this)"><span class="item1">MyName</span><span class="item2">555-555-5555</span></span> 

在大多數瀏覽器(火狐,Chrome,Safari瀏覽器,Opera)的它會提醒:

<span class="item1">MyName</span> 
<span class="item2">555-555-5555</span> 
MyName 
555-555-5555 

如預期的那樣。然而,在IE9它提醒:

<span class="item1">MyName</span><span class="item2">555-555-5555</span> 

MyName555-555-5555 

所以它把瓦爾「第一」,「第二」一起到VAR「第一」,並把「F」和「S」彙集成變種「F」。

我想知道是否有任何糾正此問題的IE9(也可能是其他版本的IE)在其他瀏覽器中的工作方式。

+0

它不應該是'obj.innerHTML.indexOf(「的「)''而不是'obj.innerHTML.indexOf('>')'注意雙引號而不是單個 – Musa 2012-07-17 20:37:43

回答

4

模式匹配innerHTML在IE中是一個特別的問題,通常是一個壞主意。 IE通常不會返回與頁面中原來相同的HTML。它通常會重新引用或刪除引號,更改屬性的順序,更改大小寫等等...... IE清楚地重新構建了HTML,而不是將頁面中最初的內容還給您。因此,您無法在IE中可靠地模式匹配innerHTML。有些特定的東西可以匹配(標籤的開始),但不能期望屬性位於特定位置或具有特定格式。

如果你在IE中使用console.log(obj.innerHTML),你可能會看到我在說什麼。它看起來不一樣。

更健壯的解決方案是使用DOM功能導航特定元素或CSS選擇器以查找特定對象,然後在單個特定元素上更改屬性或innerHTML。讓DOM導航爲你找到正確的元素,而不是自己解析HTML。

如果您提供了所需的HTML樣本,並描述了您想要完成的任務,那麼這裏的人可能可以幫助您完成DOM操作而不是HTML解析。

我不知道你有選擇的庫提供給您或瀏覽器你的目標,但在jQuery的,你可以這樣做是這樣的:

function getText(obj) { 
    return $(obj).find(".item1").text(); 
} 

在普通的JavaScript,在IE8和上述和其他所有現代瀏覽器,您可以使用此:

function getText(obj) { 
    return obj.querySelectorAll(".item1").innerHTML; 
} 

如果你必須支持回IE6還是IE7,我建議讓滋滋聲圖書館和使用,爲您的查詢:

function getText(obj) { 
    return Sizzle(".item1", obj)[0].innerHTML; 
} 
+0

啊,是的,我明白你的意思了。它大寫標籤名稱,並從spans類中刪除引號。至少我知道現在是什麼造成的。謝謝。 – Tomjr260 2012-07-17 20:34:47

+0

我有一個名單和電話號碼跨度的列表。我正在做的是點擊一個人時,從被點擊的範圍(在這種情況下,var「f」)獲取名稱以傳遞以打開特定頁面。 – Tomjr260 2012-07-17 20:40:48

+0

@ Tomjr260 - 我已經添加了幾個代碼示例,瞭解如何使用DOM訪問而不是HTML解析來獲取名稱。 – jfriend00 2012-07-17 20:55:10

0

這是因爲Internet Explorer中的「古怪模式」。它的屁股一個巨大的痛苦,但你可以在IE DevTools,或通過添加這個元標記到您的網頁禁用它:

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />