2015-01-10 47 views
1

所以我有這樣的HTML:如何在Javascript中獲取兄弟元素(div)?

<div class="tip-box"> 
    <div class="tip-title" onclick="toggleTip()"> 
     <h2>Tip 1</h2> 
    </div> 
    <div class="tip-content hidden"> 
     <p>Tip 1 content</p> 
    </div> 
</div> 

而且此Javascript:

function toggleTip() { 
    $(this).siblings(".tip-content").toggleClass("hidden"); 
} 

希望很明顯這是什麼是應該做的,但它不工作。使用.siblings()似乎不能以這種方式工作。

這是什麼正確的解決方案?爲了獲得某種類型的下一個兄弟姐妹或某個班級,然後隱藏/顯示它?

+2

像[this](http://jsfiddle.net/f9tcurhk/)? –

+2

問題是'this'不是你所期望的。 – nnnnnn

+0

@JoshCrozier在這裏有正確的想法。你只是忘了將點擊的上下文傳遞給函數。 – stewart715

回答

1

您可以使用Jquery函數。

<div class="tip-box"> 
    <div class="tip-title"> 
     <h2>Tip 1</h2> 
    </div> 
    <div class="tip-content hidden"> 
     <p>Tip 1 content</p> 
    </div> 
</div> 

$(document).ready(function(){ 
    $('.tip-title').click(function(){ 
     $(this).siblings(".tip-content").toggleClass("hidden"); 
    }); 
}); 

,你也可以使用這個

<div class="tip-box"> 
    <div class="tip-title" onclick="toggloTip(this)"> 
     <h2>Tip 1</h2> 
    </div> 
    <div class="tip-content hidden"> 
     <p>Tip 1 content</p> 
    </div> 
</div> 


<script> 
function toggloTip(elm) { 
    $(elm).siblings(".tip-content").toggleClass("hidden"); 
} 
</script> 
1

這個怎麼樣的JavaScript:

$(function(){ 
    $('.tip-box').on('click', '.tip-title', function(){ 
     $(this).next('.tip-content').toggleClass('hidden'); 
    }); 
}); 

刪除與onclick屬性的工作,當你使用jQuery的想法。

+0

委派的事件處理程序看起來過度殺傷,但比Kamruzzaman的* serial-upvoted *回答更明智。 +1 –

0

你可以使用純javaScript與nextElementSibling節點的東西像下面的屬性, 我想你想與兄弟姐妹做這個操作。

function getChildrens(n, selector) { 
 
    var nodes = []; 
 
    while (n.nextElementSibling != null) { 
 
    if (n.nextElementSibling.hasOwnProperty('classList')) { 
 
     if (n.nextElementSibling.classList.contains(selector)) { 
 
     //return n.nextElementSibling; 
 
     nodes.push(n.nextElementSibling); 
 
     } 
 
    } 
 
    n = n.nextElementSibling; 
 
    } 
 
    return nodes; 
 
}; 
 

 
function getSiblings(n, selector) { 
 
    return getChildrens(n, selector); 
 
} 
 

 
function toggleTip(elem) { 
 
    var siblings = getSiblings(elem, "tip-content"); 
 
    if (siblings.length > 0) { 
 
    for (var i = 0; i < siblings.length; i++) { 
 
     siblings[i].classList.toggle("hidden"); 
 
    } 
 
    } 
 
}
.hidden { 
 
    display: none; 
 
}
<div class="tip-box"> 
 
    <div class="tip-title" onclick="toggleTip(this)"> 
 
    <h2>Tip 1</h2> 
 
    </div> 
 
    <div class="tip-content hidden"> 
 
    <p>Tip 1 content</p> 
 
    </div> 
 
</div>

+0

你*可以使用純Javascript *,但是爲什麼當他們已經使用*一行jQuery *(目前只是不正確)時,你會引入那麼多新代碼?這不是實用的,更不用說有用。抱歉。 –

+0

你可能是對的,但我只是給另一個可能對其他人有用的替代解決方案。 –

+0

不在提問的範圍內。任何發現這種情況的人都會看到一個「'onclick =」「'調用沒有正確'this''的問題的jQuery,而不是擔心重新實現一行jQuery超過20行的原始JS。對不起:( –

1

無以前的答案,甚至不是串行upvoted一個),實際上說明了這個問題,並爲什麼他們的解決方案的工作。

問題是,內聯onclick處理程序不會傳遞其當前上下文。在onclick=""內部,JavaScript代碼this是單擊的元素。一旦你調用一個全局函數(如你的toggleTip),那個上下文就會丟失。該函數接收的thiswindow而不是元素。

原始JavaScript代碼的常見快速修復方法是將this作爲參數傳遞給全局函數。

例如

onclick="toggleTip(this)" 

,並接受這樣的函數中的參數:

function toggleTip(element) { 
    $(element).siblings(".tip-content").toggleClass("hidden"); 
} 

然而,因爲你是使用jQuery,內聯事件處理程序實際上是一個壞主意。它們將事件註冊與事件處理程序代碼無關地分開,並且不允許同一元素上具有相同類型的多個事件處理程序。他們也繞過了jQuery使用的相當酷的事件冒泡系統。

的優選的替代方案,使用jQuery,是使用jQuery選擇元件和jQuery到事件在一個步驟連接:

jQuery(function($){ 
    $('.tip-title').click(function(){ 
     $(this).siblings(".tip-content").toggleClass("hidden"); 
    }); 
}); 

由於只想下面的元件,並有可能將添加更多對,更好的選項將使用nextAllfirst(),使用相同的jQuery過濾器,而不是siblings

例如

jQuery(function($){ 
    $('.tip-title').click(function(){ 
     $(this).nextAll(".tip-content").first().toggleClass("hidden"); 
    }); 
}); 

或者,你能保證它是下一個元素,使用next作爲@Tim費爾馬倫那樣(有或無的選擇並沒有區別,那麼不妨將其省略):

jQuery(function($){ 
    $('.tip-title').click(function(){ 
     $(this).next().toggleClass("hidden"); 
    }); 
}); 

注意:在這個例子中jQuery(function($){DOM準備的事件處理程序這是相當方便快捷版$(document).ready(function(){YOUR CODE});,這也傳遞一個局部範圍$值。對於那些錯誤代碼錯誤IIFE,這裏是一個工作示例:http://jsfiddle.net/TrueBlueAussie/az4r27uz/

+0

我必須刮你的背部爲高架解釋「爲什麼「不使用內聯的onclick處理程序,但有一個問題,jQuery的DOM準備工作有很多快捷方式,但你的看起來有點不對......如果我正確的話,'$'不會被傳遞,正確的方法應該是一個IIFE = >'(function($){}(window.jQuery));' –

+0

@Tim Vermaelen:Nope,它不是* IIFE,它是一個快捷的DOM就緒函數,jQuery提供了將自身引用傳遞給第一個參數:) –

+0

我知道他們,這就是爲什麼它有一定的氣味......如果你得到我的漂移......讓我測試一下,真的很快。 –