JQuery: содержит одно из следующих слов - PullRequest
2 голосов
/ 29 января 2012

В этой строке я пытаюсь выбрать <tr>, которые содержат одно из этих слов, но не содержат изображения, но оно не работает, в основном, когда я использую его на странице, страница пуста.

$('#SubscribersManageList tr:contains("CIUDAD EVITA"), tr:contains("MORENO"), tr:contains("CORRIENTES"), tr:contains("LA MATANZA"), tr:contains("QUILMES"), tr:contains("LOMAS DE ZAMORA"), tr:contains("LANUS"), tr:contains("AVELLANEDA"), tr:contains("CORDOBA"), tr:contains("CAPITAL FEDERAL"), tr:contains("RAMOS MEJIA"):not(:has(img[src*="images/plus.gif"]))').css("background-color", "red").insertAfter("tr.Heading3:last");

Как это сделать, возможно, более простым способом, если строка содержит одно из следующих слов?

Вы можете проверить здесь: http://jsfiddle.net/cwar3/1/

Ответы [ 3 ]

2 голосов
/ 29 января 2012

Вы должны либо иметь #SubscribersManageList с каждой частью запятой отдельно, либо вы можете сделать, как я сделал ниже, и передать его только один раз в качестве контекста.Я, вероятно, написал бы это так (разбито на несколько строк только для удобства чтения - вы должны поместить его обратно на одну строку, чтобы использовать его):

$('tr:contains("CIUDAD EVITA"), 
   tr:contains("MORENO"), 
   tr:contains("CORRIENTES"), 
   tr:contains("LA MATANZA"), 
   tr:contains("QUILMES"), 
   tr:contains("LOMAS DE ZAMORA"), 
   tr:contains("LANUS"), 
   tr:contains("AVELLANEDA"), 
   tr:contains("CORDOBA"), 
   tr:contains("CAPITAL FEDERAL"), 
   tr:contains("RAMOS MEJIA")', $("#SubscribersManageList"))
       .not('img[src*="images/plus.gif"]')
       .css("background-color", "red")
       .insertAfter("tr.Heading3:last");

Для ваших комментариев, если вы хотите вставитьих обратно в DOM в определенном порядке, я бы предложил это:

var containValues = [
   "CIUDAD EVITA",
   "MORENO", 
   "CORRIENTES", 
   "LA MATANZA", 
   "QUILMES", 
   "LOMAS DE ZAMORA", 
   "LANUS", 
   "AVELLANEDA", 
   "CORDOBA", 
   "CAPITAL FEDERAL", 
   "RAMOS MEJIA" 
];

var context = $("#SubscribersManageList");
var target = context.find("tr.Heading3:last");
for (var i = containValues.length - 1; i >= 0; i--) {
    context.find('tr:contains("' + containValues[i] + '")')
        .not('img[src*="images/plus.gif"]')
        .css("background-color", "red")
        .insertAfter(target);
}

Вы можете увидеть, как это работает здесь: http://jsfiddle.net/jfriend00/MzgbV/.

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

1 голос
/ 29 января 2012

Этот фильтр становится настолько сложным, что вы можете подумать об использовании функции jQuery.fn.filter:

$('#SubscribersManageList tr').filter(function(){
  if($(this).has('img[src*="images/plus.gif"]')){
    return false;
  }
  return ($(this).text().search(/(CIUDAD EVITA|MORENO|CORRIENTES|etc)/) > -1);
})
.css("background-color", "red")
.insertAfter("tr.Heading3:last");
0 голосов
/ 29 января 2012

Вместо использования :contains вы можете использовать регулярное выражение в вызове .filter():

$(selector).filter(function() 
{
    return /some regex/.test( $(this).text() );
});

Так это будет выглядеть так:

$('#SubscribersManageList tr').filter(function() 
{
    return /CIUDAD EVITA|MORENO/.test( $(this).text() );
});
...