2013-03-07 38 views
1

如果我有以下代碼:檢測prev()項是否在當前元素之前?

<p> 
Suspendisse dictum <span>feugiat</span> nisl ut dapibus. <span>Mauris</span><span> iaculis porttitor</span> posuere. Praesent id metus massa, ut blandit odio. Proin quis tortor orci. 
</p> 

你使用下面的代碼:

$("span").click(function(){ 
    alert($(this).prev().text()); 
}); 

如果你點擊<span> iaculis porttitor</span>,它會提醒Mauris。這是正確的行爲,但我只想檢測prev()元素是否與當前單擊的元素相鄰。由於<span> iaculis porttitor</span>的前一個元素是<span>Mauris</span>,因此這可以正常工作。

但是,如果您點擊<span>Mauris</span>,它會提醒feugiat,因爲這是上一個元素的文本。我想要的是,這將返回false,因爲在<span>Mauris</span>之前沒有元素,只有文本。

這是可能的jQuery?

回答

1

您可以檢查previousSibling是一個文本節點

$("span").click(function(){ 
    if (this.previousSibling){ 
    if (this.previousSibling.nodeType == 3){ 
     alert(false); 
    } 
    else{ 
     alert($(this.previousSibling).text()); 
    } 
    } 
}); 

http://jsfiddle.net/mowglisanu/PUnce/

+0

謝謝,這是有道理的。在我嘗試使用它的設置中,我必須檢測以前的同級選擇的文本是文本節點還是元素節點,但我似乎無法使其工作:http://jsfiddle.net/charlescarver/FLwxj/54 /任何想法,爲什麼這是行不通的? – Charlie 2013-03-07 01:55:09

+0

@Charlie在檢查其節點類型之前檢查前一個兄弟是否存在 – Musa 2013-03-07 02:00:04

+0

我明白,但前一個兄弟存在於我的小提琴中,但它沒有找到previousSibling.nodeType,並且用'TypeError:'undefined'響應不是對象(評估'test.previousSibling.nodeType')'其中'test' ='[ 文本 ]' – Charlie 2013-03-07 02:04:24

0

這是不可能與jQuery。你將不得不求助於本地DOM API。在被點擊的DOM對象上使用previousSibling屬性。您可以通過查詢其屬性nodeType來檢查該元素是文本節點還是元素節點。

0

不知道這是否會幫助,但可能有它的一些里程。

考慮兩個函數(既可能需要調試):

function unwrapUnhighlighted ($container) { 
    $container.find("span.unhighlighted").unwrap(); 
} 

function rewrapUnhighlighted ($container) { 
    $container.contents().each(function(){ 
     if (this.nodeType == 3) { 
      $(this).wrap('<span class="unhighlighted" />') 
     } 
    }); 
} 

現在考慮將新.highlight()跨度和調用rewrapUnhighlighted (...)事後收到主叫unwrapUnhighlighted(...)

因此,您應該保證每個文本片段都包含在<span class="highlight">...</span><span class="unhighlighted">...</span>之內,並且jQuery的.prev().text()將按您最初的預期工作。

對於調試,給.unhighlighted一些背景顏色,使類可觀察。

相關問題