2015-10-31 2 views
0

Как я могу slideUp() ли элемент на второй клик?slideUp() при втором щелчке jQuery

Я попытался с .data() для сбора нескольких кликов, но этот метод разбивает мой css (border), примененный с помощью jQuery.

var paragraph = $('p'); 
 
var paragraphParent = $('li'); 
 

 
paragraph.addClass('displayNone'); 
 
    
 
paragraphParent.on('click', function() { 
 
paragraph.stop().slideUp(); 
 
$(this).children().stop().slideDown(); 
 
});
.displayNone{ 
 
    display:none; 
 
} 
 

 
ul{ 
 
    list-style-type: none; 
 
    padding: 0; 
 
    margin: 0; 
 
} 
 

 
li{ 
 
    width: 200px; 
 
    font-size: 20px; 
 
    background-color: lightblue; 
 
    color: black; 
 
    text-align: center; 
 
    margin-top: 5px; 
 
    padding-bottom: 3px; 
 
} 
 

 
li:hover{ 
 
    cursor: pointer; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul> 
 
    <li>Item 1 
 
     <p>Lorem ipsum...</p> 
 
    </li> 
 
    <li>Item 2 
 
     <p>Lorem ipsum...</p> 
 
    </li> 
 
    <li>Item 3 
 
     <p>Lorem ipsum...</p> 
 
    </li> 
 
    <li>Item 4 
 
     <p>Lorem ipsum...</p> 
 
    </li> 
 
</ul>

+0

Где код, который подсчитывает количество кликов? Я предполагаю, что попытка будет более актуальной. – Jon

+1

Вы пытаетесь использовать 'slideToggle'? – KeepMove

+0

Да, и поведение действительно странно, поскольку оно заменяет любой «Item» текстом абзаца. @Jon 'var $ this = $ (this); var clickCount = ($ this.data ("click-count") || 0) + 1; $ this.data ("click-count", clickCount); ' – nehel

ответ

2

вы можете попробовать

paragraphParent.on('click', function() { 
     paragraph.not($(this).children('p')).slideUp(); 
     $(this).children().slideToggle(); 
    }); 

    paragraph.on('click', function (e) { 
     e.stopPropagation(); 
    }); 

DEMO

и для подсчета вы можете использовать этот код

var paragraph = $('p'); 
var paragraphParent = $('li'); 

paragraph.addClass('displayNone'); 
paragraphParent.on('click', function() { 
    paragraph.not($(this).children('p')).slideUp(); 
    $(this).children().slideToggle(); 
    // count number of clicks 
    var click_num = parseInt($(this).attr('data-count')); 
    $(this).attr('data-count' , click_num + 1); 
    alert($(this).attr('data-count')); 

}); 
paragraph.on('click', function (e) { 
    e.stopPropagation(); 
}); 

DEMO

+0

Я пробовал это, но он заменяет все, что не в'

'+ иногда он может сломаться и не работать показать что угодно, как пустой прямоугольник без названия. – nehel

+0

@nehel это то, что вы хотите ??? http://jsfiddle.net/mohamedyousef1980/hgwmLp4o/ .. вы можете проверить мой обновленный ответ и демонстрацию –

+0

Ммм да, похоже, мне придется удалить свои заголовки, так как я забыл добавить свой фрагмент их ... http: // jsfiddle.net/hgwmLp4o/2/ – nehel

0

вы можете использовать JQuery .data API, как вы пытались.

$(function() { 
 
    $('ul li').find('p').hide(); 
 

 
    $('ul').on('click', 'li', function() { 
 
    var count = $(this).data('count') + 1; 
 
    $(this).data('count', count) 
 
    if (count == 2) { 
 
     $(this).data('count', 0).find('p').stop().slideDown(); 
 
     $('ul li').not(this).find('p').slideUp(); 
 
    } 
 
    }) 
 
})
.displayNone { 
 
    display: none; 
 
} 
 
ul { 
 
    list-style-type: none; 
 
    padding: 0; 
 
    margin: 0; 
 
} 
 
li { 
 
    width: 200px; 
 
    font-size: 20px; 
 
    background-color: lightblue; 
 
    color: black; 
 
    text-align: center; 
 
    margin-top: 5px; 
 
    padding-bottom: 3px; 
 
} 
 
li:hover { 
 
    cursor: pointer; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul> 
 
    <li data-count="0">Item 1 
 
    <p>Lorem ipsum...</p> 
 
    </li> 
 
    <li data-count="0">Item 2 
 
    <p>Lorem ipsum...</p> 
 
    </li> 
 
    <li data-count="0">Item 3 
 
    <p>Lorem ipsum...</p> 
 
    </li> 
 
    <li data-count="0">Item 4 
 
    <p>Lorem ipsum...</p> 
 
    </li> 
 
</ul>

1

Попробуйте это. здесь я использовал самозагрузку коллапса

.displayNone { 
 
    display:none; 
 
} 
 
ul { 
 
    list-style-type: none; 
 
    padding: 0; 
 
    margin: 0; 
 
} 
 
li { 
 
    width: 200px; 
 
    font-size: 20px; 
 
    background-color: lightblue; 
 
    color: black; 
 
    text-align: center; 
 
    margin-top: 5px; 
 
    padding-bottom: 3px; 
 
} 
 
li:hover { 
 
    cursor: pointer; 
 
}
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
 
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 
 
<div class="container"> 
 
    <ul> 
 
     <li data-toggle="collapse" data-target="#demo1"><a>Item 1</a> 
 

 
      <p class="collapse" id="demo1">Lorem ipsum...</p> 
 
     </li> 
 
     <li data-toggle="collapse" data-target="#demo2"><a>Item 2</a> 
 

 
      <p class="collapse" id="demo2">Lorem ipsum...</p> 
 
     </li> 
 
     <li data-toggle="collapse" data-target="#demo3"><a>Item 3</a> 
 

 
      <p class="collapse" id="demo3">Lorem ipsum...</p> 
 
     </li> 
 
    </ul> 
 
</div>

+0

Идея заключалась в том, чтобы не вводить 'id', так как у меня есть около 20 из этих элементов' li', но я уверен, что это будет иметь в виду для дальнейших небольших проектов! Благодаря! С другой стороны, я вижу, что при резком сползании элемент имеет небольшой эффект отскока. Это намеренно? – nehel

+0

yup its cool. я просто предлагаю вам простой способ, поскольку в примере есть только . –

+0

извините, я не имею ни малейшего представления об этом эффекте. –