2012-03-30 97 views
5

代碼:http://jsfiddle.net/4hV6c/4/ 只是做任何選擇,你會在IE8jQuery在IE8中不支持.has?什麼是解決方法?

我試圖做到這一點得到一個腳本錯誤:

$(end_node.parentNode).has(start_node) 

這在現代瀏覽器(鉻,FF,歌劇等)如果start_node不在end_node.parentNode中,則返回[],並返回該元素(如果它被找到)。

現在,end_node是一個文本元素,parentNode是一個實際的DOM實體。 IE只會執行。只有$(end_node).has(start_node),但這顯然是不同的行爲。

是否有解決此問題的方法?

  • 在IE中小提琴會出錯,其他瀏覽器會用布爾值提醒您。

更新:這裏是圍繞那個覆蓋.has()爲我的具體情況..不知道它是否適用於.has的所有情況,因爲我不知道他們全部。 http://jsfiddle.net/8F57r/13/

+1

如果這是真的,那將是一個大問題,並且還有一個與它關聯的jQuery bug報告,不是嗎? – Sparky 2012-03-30 16:58:07

+0

小提琴不撒謊。 = \我會看看我是否可以在jQuery /聯繫某人。 – NullVoxPopuli 2012-03-30 17:01:49

+0

您的jsFiddle的預期操作順序和預期結果是什麼?無論我做什麼,我都會收到一個包含「false」的警報。使用Safari。 – Sparky 2012-03-30 17:07:12

回答

4

問題是 jQuery的

運行

console.log($("div:has(span)").html()); 
console.log($("div").has($("span")[0]).html()); 

但是,下面拋出一個異常http://jsfiddle.net/mendesjuan/4hV6c/8/

var textNode = $("span")[0].childNodes[0]; 
$("div").has(textNode); 

這意味着您無法將文本節點傳遞到$.has。您應該提交錯誤使用jQuery

被示數出來是給下面的消息

No such interface supported jquery-1.7.1.js, line 5244 character 3

正試圖調用一個節點上的contains方法的行。這意味着這真的是一個IE瀏覽器的錯誤,jQuery沒有解決。我轉載而無需調用$.hashttp://jsfiddle.net/4hV6c/10/

// This is broken in IE 
var textNode = $("span")[0].childNodes[0]; 
var divNode = $("div")[0]; 
divNode.contains(textNode); 

解決方法http://jsfiddle.net/4hV6c/12/

function contains(outer, inner) { 
    var current = inner; 
    do { 
     if (current == outer) { 
      return true; 
     } 
    } while((current = current.parentNode) != document.body); 

    return false; 

} 
rangy.init(); 

$(document).bind("mouseup", function() { 
    var a = rangy.getSelection(); 
    start_node = a.anchorNode; 
    end_node = a.focusNode; 
    var b = a.getRangeAt(0); 
    var c = b.commonAncestorContainer; 
    b.selectNodeContents(c); 
    a.setSingleRange(b); 
    alert(contains(end_node.parentNode, start_node)); 
}); 
+1

它不只是檢測它是否有標籤,我需要檢查特定的元素。因爲如果有多個跨度? 此外,是不是從jQ​​uery選擇器不同? – NullVoxPopuli 2012-03-30 16:53:00

+0

檢查一個特定的元素也工作正常,請參閱我的更新 – 2012-03-30 16:57:13

+0

問題是,在IE8中,end_node.parentNode(這是一個未確定的DOM元素給我,因爲它可能是一個div,跨度或其他)沒有一個.has()方法。你正在調用.has()每一個div ...你也就是硬編碼來獲得第一個跨度匹配...... – NullVoxPopuli 2012-03-30 16:59:34

1

你可以一直DIY嗎? :)我聽說遞歸子索引的工作很快,而且很容易實現。

在這裏看到的優秀教程:

http://blog.swapnilsarwe.com/javascript-traversing-html-dom-recursively.html

+0

@KirkWoll - 「郵寄」? – 2012-03-30 16:51:57

+0

@KirkWoll - 詳情請參閱鏈接,這實際上很容易做到。而不是建立整個樹,你可以檢查天氣節點是你需要的。但是,根據Juan的回答,IE看起來似乎支持'.has()',這使OP沒有必要這樣做。 – 2012-03-30 16:54:20

+1

這與jquery的想法背道而馳,在那裏所有堅韌不拔的東西都是爲了幫助保持自己的代碼更清潔。 – NullVoxPopuli 2012-03-30 16:58:06

0

是否找到你想要什麼問題?

rangy.init(); 

$(document).bind("mouseup", function() { 
    var a = rangy.getSelection(); 
    start_node = a.anchorNode; 
    end_node = a.focusNode; 
    var b = a.getRangeAt(0); 
    var c = b.commonAncestorContainer; 
    b.selectNodeContents(c); 
    a.setSingleRange(b); 
    alert($(end_node.parentNode).find(start_node).length > 0); 
});​ 
+0

「對象不支持此屬性或方法」= ( 雖然在ie8中不起作用。= \ – NullVoxPopuli 2012-03-30 17:05:47

相關問題