#javascript #jquery #css
#javascript #jquery #css
Вопрос:
Как бы я popOver
показывал только тогда, когда после него есть элемент с counter
количеством элементов с тем же именем класса? (Счетчик будет включать первый элемент)
Пример: (Со счетчиком = 3)
bar
bar
foo
bar
foo
foo
bar <-- PopOver would show up here
bar
bar
foo <-- PopOver would show up here
foo
foo
foo
Пример: (Со счетчиком = 2)
bar <-- PopOver would show up here
bar
foo
bar
foo <-- PopOver would show up here
foo
bar <-- PopOver would show up here
bar
bar
foo <-- PopOver would show up here
foo
$(".bar").each(function(){
$(this).append("<div class='popOver'>these would be recommended</div>");
});
.bar {
color: #000;
text-decoration: none;
}
.popOver{
width:400px;
height: 30px;
background: green;
position: absolute;
z-index: 999;
margin-left: 40px;
opacity: 0.5;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="foo">Foo</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="foo">Foo</li>
</ul>
Ответ №1:
Вы можете использовать
оператор. Селектор:
.bar .bar .bar
Выбирает третий подряд .bar
и делает все, что вы хотите сделать.
$(".bar .bar .bar").each(function(){
$(this).append("<div class='popOver'>these would be recommended</div>");
});
.bar {
color: #000;
text-decoration: none;
}
.popOver{
width:400px;
height: 30px;
background: green;
position: absolute;
z-index: 999;
margin-left: 40px;
opacity: 0.5;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="foo">Foo</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="foo">Foo</li>
</ul>
Вы можете использовать .repeat
функцию для ее настройки:
var n = 3;
$(".bar" " .bar".repeat(n - 1)).each(function(){
$(this).append("<div class='popOver'>these would be recommended</div>");
});
.bar {
color: #000;
text-decoration: none;
}
.popOver{
width:400px;
height: 30px;
background: green;
position: absolute;
z-index: 999;
margin-left: 40px;
opacity: 0.5;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="foo">Foo</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="foo">Foo</li>
</ul>
Где n
значением будет количество элементов с тем же классом.
Комментарии:
1. Извините, я только что обновил свой вопрос, добавив немного больше информации.
2. @ChrisBeckett Я обновил свой ответ. Если это выглядит хорошо, пожалуйста, примите это. Заранее спасибо.
:D
3. Взгляните на мой вопрос, я только что обновил его еще больше с помощью краткого примера. Заранее спасибо.
4. @ChrisBeckett Ты сказал подряд !!! И второй пример не согласуется… Запутанный мат.
5. @PraveenKumar Проблема в том, что он хочет всплывающее окно для первого элемента, а не для третьего. Итак, вам нужно проверить, есть ли три, не изменяя текущий выбор.
Ответ №2:
Немного улучшив ответ @Praveen Kumar, эта функция должна делать то, что вы хотите:
function addPopOverEvery(n, selector) {
$(selector).each(function() {
var $original = $(this),
$self = $(this),
$is_pop = true,
i = 0;
if ($original.prev().is(selector)) {
for (i = 1; i < n; i ) {
$self = $self.prev();
if (!$self.is(selector) || $self.find('.popOver').length) {
$is_pop = false;
break;
}
}
}
if ($is_pop) {
$self = $original;
for (i = 1; i < n; i ) {
$self = $self.next();
if (!$self.is(selector)) {
$is_pop = false;
break;
}
}
}
if ($is_pop) {
$original.append("<div class='popOver'><-- these would be recommended</div>");
}
console.log($original.get(0));
});
}
addPopOverEvery(3, '.bar');
.bar {
color: #000;
text-decoration: none;
}
.popOver{
width:300px;
height: 30px;
background: green;
position: absolute;
display: inline-block;
z-index: 999;
margin-left: 40px;
opacity: 0.5;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="foo">Foo</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="foo">Foo</li>
</ul>
С 2:
function addPopOverEvery(n, selector) {
$(selector).each(function() {
var $original = $(this),
$self = $(this),
$is_pop = true,
i = 0;
if ($original.prev().is(selector)) {
for (i = 1; i < n; i ) {
$self = $self.prev();
if (!$self.is(selector) || $self.find('.popOver').length) {
$is_pop = false;
break;
}
}
}
if ($is_pop) {
$self = $original;
for (i = 1; i < n; i ) {
$self = $self.next();
if (!$self.is(selector)) {
$is_pop = false;
break;
}
}
}
if ($is_pop) {
$original.append("<div class='popOver'><-- these would be recommended</div>");
}
console.log($original.get(0));
});
}
addPopOverEvery(2, '.bar');
.bar {
color: #000;
text-decoration: none;
}
.bar {
color: #000;
text-decoration: none;
}
.popOver{
width:300px;
height: 30px;
background: green;
position: absolute;
display: inline-block;
z-index: 999;
margin-left: 40px;
opacity: 0.5;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="foo">Foo</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="foo">Foo</li>
</ul>
Комментарии:
1. Существует проблема с addPopOverEvery(n); Например, как сказал @ZakariaAcharki, вы пробовали addPopOverEvery(2); потому что, если есть 3 элемента с одинаковым классом подряд, первый и второй элемент получают всплывающее окно
2. Добавлены все уловы, спасибо за отзыв. Как насчет сейчас?
3. @Makaze Спасибо за ответ, это то, что я хотел.
4. @Makaze Как я мог это сделать, если бы был такой класс, как
class="bar" class="bar" class="bar foo"
? Я бы хотел, чтобы он разрешал только первые 2 элемента, потому что они безfoo
?5. @Makaze Извините за все комментарии, не беспокойтесь о предыдущем комментарии с вопросом… Я обнаружил, что могу сделать addPopOverEvery(2, ‘.bar:not(.foo)’); — Еще раз спасибо за ответ
Ответ №3:
Это невозможно сделать с помощью
sign, поскольку у вас нет определенного class
, поэтому вам нужно сделать это программно, используя if - else
условие и счетчик, чтобы проверить, равно ли количество последовательных классов нашему счетчику, проверьте пример ниже.
Надеюсь, это поможет.
var nbr = 3;
var count = 0;
var last_class = $('li:first').attr('class');
$('li').each(function(index)
{
if( $(this).attr('class')===last_class )
{
count ;
last_class = $(this).attr('class');
}else{
count=1;
last_class = $(this).attr('class');
}
if(count===nbr){
$('li:eq(' (index-(nbr-1)) ')').append("<span class='popOver'> <= these would be recommended</span>");
count=0;
}
});
.bar {
color: #000;
text-decoration: none;
}
.popOver{
width:250px;
height: 18px;
background: green;
position: absolute;
z-index: 999;
margin-left: 40px;
opacity: 0.5;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="foo">Foo</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="bar">Bar</li>
<li href="#" class="foo">Foo</li>
</ul>