jquery 1.8 содержит нечувствительный к регистру + начинается с

Я ищу плагин/расширение для селектора jquerys :contains, который нечувствителен к регистру и сопоставляет только слова, начинающиеся с текста :contains

Таким образом, если вы наберете «count», вы НЕ получите результаты «account».

заранее спасибо

Изменить: я получил следующее

$.expr.pseudos.Contains = $.expr.createPseudo(function(arg) {
return function(elem) {
  var sentence = $(elem).text().trim().toLowerCase();
  var words = sentence.split(' ');
  arg = arg.toLowerCase();
  var args = arg.split(' ');
  var searchfound = true;

  for(var ix = 0, lx = args.length; ix < lx; ix++) {

    var thisfound = false;

    for(var i = 0, l = words.length; i < l; i++) {
      var wordpos = sentence.indexOf(words[i]);
      var restofsentence = sentence.slice(wordpos, wordpos+args[ix].trim().length);
      if(restofsentence == args[ix].trim() ){             
        thisfound = true;
      }
    }

    if (thisfound == false) {
      searchfound = false;
    }

  }

  return searchfound;  

};
});

Он ищет с начала каждой записи поиска и возвращает true, если есть совпадения, независимо от порядка ввода.


person afcdesign    schedule 21.09.2012    source источник
comment
@JoeFletch Я хочу создать функцию поиска, которая ищет список людей и их профессий.   -  person afcdesign    schedule 21.09.2012


Ответы (1)


Вы можете легко создать свой собственный псевдо-селектор для этого:

$.expr.pseudos.startsWith = $.expr.createPseudo(function(arg) {
    return function(elem) {
        return $(elem).text().trim().slice(0, arg.length).toLowerCase() == arg.toLowerCase();
    };
});

Демо

Для сопоставления любого слова вам нужно разделить их по пробелу и перебрать коллекцию:

$.expr.pseudos.anyWordStartsWith = $.expr.createPseudo(function(arg) {
    return function(elem) {
        var words = $(elem).text().trim().toLowerCase().split(' ');
        arg = arg.toLowerCase();

        for(var i = 0, l = words.length; i < l; i++) {
            if(words[i].slice(0, arg.length) == arg)
                return true;
        }

        return false;
    };
});

Демо

Функция берет содержимое text() предметного элемента, обрезает все пробелы, преобразует его в нижний регистр для сравнения без учета регистра и разбивает строку на массив, где пробел считается разделителем списка ("a b c" => ["a", "b", "c"]).

Затем он преобразует arg, являющуюся вашей поисковой фразой, в нижний регистр, также для сравнения без учета регистра.

Он продолжает перебирать массив слов и сравнивать подстроку каждого слова с целевой фразой. Я использую .slice(0, n), а не .substring(0, n), потому что последний будет жаловаться, если длина строки темы будет меньше n символов.

Если такое совпадение будет найдено, итерация немедленно прервется, вернув значение true, в противном случае она будет перебирать всю коллекцию и дойдет до последней строки, где будет возвращено значение false.

person David Hedlund    schedule 21.09.2012
comment
Это почти то, что я ищу, но это ищет только первое слово - можно ли его изменить, чтобы искать каждое слово в селекторе? :) - person afcdesign; 21.09.2012
comment
Я понимаю только половину - но это работает как шарм - БОЛЬШОЕ СПАСИБО :D - person afcdesign; 21.09.2012
comment
@afcdesign: рад, что вам понравилось, я добавил подробное описание. - person David Hedlund; 21.09.2012
comment
Однако есть одна небольшая проблема - у меня есть имя: «Алекс Цинь», и если я ищу «Алекс» или «Цинь», он появится в результатах, но если я наберу «Алекс Цинь», он не появится - как это можно исправить? - person afcdesign; 21.09.2012
comment
@afcdesign: да, конечно, это потому, что мы теперь ищем каждое отдельное слово, и ни "Alex", ни "Qin" не начинаются с вашего ввода "Alex Qin. Вам придется выполнить оба полнотекстовый поиск из моего первого фрагмента и пословный поиск из моего второго. Я уверен, что вы можете понять, как объединить их в одну функцию. - person David Hedlund; 21.09.2012
comment
@David Спасибо за ответ на мой вопрос :) - Я понял, что мне нужен более сложный поиск, но вы ведете меня на правильный путь :) - person afcdesign; 24.09.2012