Búsqueda con Jquery - Trabajo para múltiples términos

Encontré este gran fragmento en línea para una búsqueda de preguntas frecuentes. Sin embargo, me preguntaba si alguien sabía cómo podría modificarse para que funcione con varios términos.

http://jsfiddle.net/pT6dB/

En el ejemplo anterior, me gustaría ingresar "tierra de papel" para obtener ambos resultados de ejemplo. Si ingreso eso ahora, no devuelve nada. Supongo que quiero que sea equivalente a buscar "papel" O "Tierra".

Cualquier ayuda sería muy apreciada.

James

preguntado el 28 de julio de 12 a las 16:07

2 Respuestas

Lo que puede hacer es hacer coincidir la cadena de búsqueda con una expresión regular para obtener todas las palabras. Entonces, para cada li usted verifica si su texto contiene alguna de las palabras y muestra u oculta apropiadamente. he usado array.some Sin embargo, solo está disponible en los navegadores más nuevos.

También lo he arreglado un poco, no todo el código era necesario: http://jsfiddle.net/pT6dB/29/.

// no need for preventDefault here - clicking a <strong> doesn't do anything
$('li strong').click(function(e) {
    $(this).parent().find('em').slideToggle();
});

// the "input" event is available on newer browsers, and is also fired when e.g.
// pasting or dragging text
$('#search').on("input", function(e) {
    // make it case-insensitive, and match against a regexp that matches
    // non-space characters
    var words = $(this).val().toLowerCase().match(/\S+/g);
    if (!words) {  // no match, i.e. no words found
        $('#result li').show();
    } else {
        $('#result li').each(function() {
            var text = $(this).text().toLowerCase();
            var show = words.some(function(word) {
                return ~text.indexOf(word);  // ~ with indexOf means "contains"
            });
            $(this).toggle(show);  // will show or hide depending on "show"
        });
    }
});

Respondido 28 Jul 12, 16:07

Muchas gracias, esta es una respuesta muy detallada. Estoy un poco preocupado por la matriz. Sin embargo, alguna compatibilidad, ¿tiene que usarse esto? - jzil

@James Willson: No, en absoluto. Es una función de conveniencia que devuelve true tan pronto como la función interna regrese true. Podrías reemplazarlo fácilmente con un for círculo. - pimvdb

¿Podría mostrarme cómo? No tengo ni idea sobre estas cosas, entonces le concedería la pregunta ya que ha sido muy diligente para eliminar el código innecesario. - jzil

Debe dividir el valor por el carácter " " utilizando la función javascript string.split. Luego recorra cada elemento para ver si hay una coincidencia.

Por ejemplo:

 $('#search').keyup(function(e) {
        var s = $(this).val().trim();
        if (s === '') {
            $('#result LI').show();
            return true;
        }

        $('#result LI').hide();

        splits = s.split(" ");

        for(x in splits){
            $('#result LI:contains(' + splits[x]+ ')').show();
        }

        return true;
    });

Respondido 28 Jul 12, 16:07

Gracias por su ayuda, lo siento, solo pude elegir uno: jzil

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.