2010-06-04 7 views
32

Это не работает, не так ли? Или вы можете остановить ошибку, если другая линия может сделать то же самое:тест, если дисплей = нет

function doTheHighlightning(searchTerms) { 
    // loop through input array of search terms 
    myArray = searchTerms.split(" "); 
    for(i=0;i<myArray.length;i++) 
    { 
     // works. this line works if not out commented. Will highlight all words, also in the hidden elements 
     //$('tbody').highlight(myArray[i]); 

     // not working when trying to skip elements with display none... 
     $('tbody').css('display') != 'none').highlight(myArray[i]); 
    } 

    // set background to yellow for highlighted words 
    $(".highlight").css({ backgroundColor: "#FFFF88" }); 
} 

Мне нужно фильтровать строки в таблице и цвет какое-то слово. Эти данные стали способом для раскраски, если выбрано много слов. Поэтому я постараюсь ограничить раскраску, пройдя только никакие скрытые элементы.

ответ

44

Если вы хотите, чтобы получить видимые tbody элементы, вы можете сделать это:

$('tbody:visible').highlight(myArray[i]); 

It похоже на ответ, который дал Agent_9191, но этот удаляет пространство из селектора, что делает его выбирает видимые tbody элементы вместо видимых потомков.


EDIT:

Если вы специально хотели использовать тест на display CSS свойстве tbody элементов, вы можете сделать это:

$('tbody').filter(function() { 
    return $(this).css('display') != 'none'; 
}).highlight(myArray[i]); 
+0

Привет. Тон: видимый делает трюк очень красиво. Можно искать огромный объем данных и выделять только отображаемый текст. Отлично. – Tillebeck

+3

@ Тиллебек. Именно поэтому вы понимаете, что «пространство» в селекторе является важным оператором. Это означает, что вы ищете потомка. Поэтому 'tbody: visible' ищет элементы' tbody', которые являются 'visible', а' tbody: visible' ищет * потомков * of the tbody', которые являются ': visible'. Удачи! :) – user113716

5

Попробуйте это вместо того, чтобы выбрать только видимые элементы под tbody:

$('tbody :visible').highlight(myArray[i]); 
+0

По какой-то причине это не работает. При удалении пространства между tbody и: visible (tbody: visible), тогда он работает. Я не могу сказать, должен ли он работать (возможно, у меня работает некорректное программное обеспечение, не знаю). Но большое спасибо за ваш ответ. Извините, но я отметил, что patricks отвечает как правильно, хотя это был почти ваш клон ;-) – Tillebeck

43

Использование так:

if($('#foo').is(':visible')) { 
    // it's visible, do something 
} 
else { 
    // it's not visible so do something else 
} 

H Это помогает!

+3

Не лучшая практика, но я думаю, что это лучший способ для новичков. – tersakyan

+0

Это отлично работает для slideToggle и IE8, потому что IE считает, что заполнение должно быть высотой #justSayin –

+3

@tersakyan Что такое лучшая практика здесь? –

1

Как @ Agent_9191 и @partick упомянули вы должны использовать

$('tbody :visible').highlight(myArray[i]); // works for all children of tbody that are visible 

или

$('tbody:visible').highlight(myArray[i]); // works for all visible tbodys 

Кроме того, так как вы, кажется, применяя класс выделенных слов, вместо того, чтобы использовать JQuery, чтобы изменить фон для всех согласованных бликов, просто создайте правило css с цветом фона, который вам нужен, и он будет применяться сразу после назначения класса.

.highlight { background-color: #FFFF88; } 
+0

Супер. Спасибо за объяснение.Это может объяснить, почему работает только последний (видимые tbodys). И да. CSS должен войти в файл CSS и не определен в различных js-файлах. И для производительности, и для того, чтобы парни дизайна не расстраивались :-) Сделаю. – Tillebeck

Смежные вопросы