2013-02-16 108 views
0

我一直在嘗試parent()/ children()/ find()和選擇器語法的太陽下的每個組合.show()我隱藏在文檔準備好的網頁元素,但我只能不要讓它工作!我會很感激,如果有人可以看看..選擇要顯示和隱藏的元素,遍歷問題! (jQuery)

如果你去投資組合部分,你可以看到它住在這裏 - >http://holly.im/

在任何情況下,HTML看起來是這樣的:

<div id="portfolio"> 
<h1>Heading</h1> 
<div class ="little_column"> 
    <div class="project"> 
    <a href="#c++_games_engine_construction" class="projlink"> click </a> 
    </div>  
</div> 
<div id="c++_games_engine_construction" class="big_column"> 
    <?php include "projects/C++_game_engine_construction.php"; ?> 
</div> 
</div> 

以及相關的jQuery:

$(document).ready(function() { 
    //hide all the big_columns/
    // project details within the portfolio page 
    $('#portfolio').find('.big_column').hide(); //This seems to be working 
}); 
$(function(){ 
    $('.project').click(function() { 
     var selectedProject = 
      $(this).children('a.projlink').attr('href'); 
     $(this).parent().parent().find(selectedProject).show(); //My most recent attempt, I though maybe i needed to go up the heirachy then back down? But whatever i try it doesn't show. 
     return false; 
    }); 
}); 

這是真的,謝謝!

回答

3

問題在於選擇器中的+。它需要被轉義,因爲它在選擇器API 中有特殊含義(並且對於ID無效)

如果您移除了hrefid++,它的工作原理。


或者,你可以做.replace(/\+/g, "\\+")

var selectedProject = $(this).children('a.projlink').attr('href').replace(/\+/g, "\\+") 

題外話:你並不需要兩個.ready()通話,這是你所擁有的,但使用不同的語法。

+0

乾杯我很傻! :)另外我想也許窗口加載和準備文件可能會稍微不同的東西(準備好我意味着,如果你明白我的意思,一切都會加載)。無論如何,我應該檢查,謝謝你讓我知道。 – Holly 2013-02-16 19:33:47

+1

@霍利:是的,'window'和'document'加載確實有不同的含義,但是你使用的兩種語法都意味着'文檔'準備就緒。第二個是寫第一個的簡短方法。 – 2013-02-16 19:35:37

4

具有一個元素的ID的字符+導致因爲+字符被保留用於Next Adjacent Selector jQuery來變得混亂。

如果您從代碼中刪除這些字符,它就可以正常工作。正如在這個答案的評論之一中提到的,由於href基本上是要顯示的項目的ID,所以您可以直接選擇它。

HTML

<div id="portfolio" class="section"> 

    <h1>Heading</h1> 

    <div class="little_column"> 
     <div class="project"> <a href="#c_games_engine_construction" class="projlink"> click </a> 

     </div> 
    </div> 
    <div id="c_games_engine_construction" class="big_column"> 
     I'm hidden at first! 
    </div> 
</div> 

JS

$(document).ready(function() { 
    //hide all the big_columns/
    // project details within the portfolio page 
    $('#portfolio').find('.big_column').hide(); //This seems to be working 
}); 
$(function() { 
    $('.project').click(function() { 
     var selectedProject = $(this).children('a.projlink').attr('href'); 
     $(selectedProject).show(); //My most recent attempt, I though maybe i needed to go up the heirachy then back down? But whatever i try it doesn't show. 
     return false; 
    }); 
}); 

jsfiddle

+2

爲什麼使用'find()'?這是一個有效而獨特的選擇器。 – Bergi 2013-02-16 19:26:38

+0

謝謝,因爲沒有想到這一點而感到無聊! – Holly 2013-02-16 19:31:24

+1

@Bergi:你確定ID在修改後仍然是唯一的嗎?畢竟,也有'c'語言。 – 2013-02-16 19:32:42

1

正如其他人所說,你的問題是+字符的jQuery虐待。所以簡單的解決方案是:不要使用jQuery - 或者至少不選擇選擇器。由於您擁有的每個目標都是一個ID選擇器,因此我們可以輕鬆將其更改爲

$(document).ready(function() { 
    $('#portfolio').find('.big_column').hide(); 

    $('.project').click(function() { 
     var selectedProject = $(this).find('a').attr('href'); // a littebit simplified 

     var el = document.getElementById(selectedProject.slice(1)); 
     $(el).show(); 
     return false; 
    }); 
}); 
+1

「+」不是HTML5之外的ID的有效字符。 – 2013-02-16 19:34:13

+0

...雖然我不知道是否有任何瀏覽器實際上在它們的'getElementById()'方法中窒息。 – 2013-02-16 19:39:35

+0

@ thesystem:當然,但是這不應該在這裏。 OP應該替換它,但我猜想即使沒有作爲HTML5交付,它也不會在體面的瀏覽器中造成問題。 – Bergi 2013-02-16 19:43:45