2016-12-19 2 views
1

Ich mache einige einfache div Filterung mit jQuery und Eingabefeld. Es funktioniert, aber es erkennt nicht, dass es leer ist, wenn ich die Eingabe mit "Ctrl + a + Rücktaste" entfernen, mit anderen Worten, wenn ich den gesamten Text auswählen und entfernen. Was verursacht das?Die Eingabe erkennt nicht, dass es leer ist, wenn Sie Text mit "Strg + a + Rücktaste" entfernen

Es ist nicht neu divs zurück auf Standard, wenn Sie die Tastaturbefehle, aber geht zurück zum normalen, wenn Sie Backspace jedes Zeichen.

Dies ist, wie ich es tun:

$('#brandSearch').keyup(function() { 
    var valThis = $(this).val().toLowerCase(); 
    if (valThis.length == 0) { 
     $('.card').show(); 
    } else { 
     $('.card').each(function() { 
      var text = $(this).text().toLowerCase(); 
      (text.indexOf(valThis) >= 0) ? $(this).parent().show(): $(this).parent().hide(); 
     }); 
    }; 
}); 
+3

* "Wenn ich die Eingabe mit" Strg + a "entferne" "*' CTRL + A' entfernt die Eingabe nicht. –

+0

und drücken Sie die Rücktaste. Es tut uns leid! –

+1

Nicht, dass es in diesem Fall wichtig wäre ... aber warum nicht das 'input' Ereignis statt' keyup' verwenden, frage ich mich? – canon

Antwort

1

Ihr if Block, der die leere Zeichenfolge behandelt wird nicht angezeigt die gleichen Elemente, die der else Block verbirgt. Der Baustein else ruft .parent() auf, der Baustein if jedoch nicht.

So ist der else Fall zeigt oder versteckt die Mutter jedes .card Element, aber der if Fall zeigt die .card Elemente selbst — ohne ihre Eltern Einblenden. Sehen Sie meine Kommentare zum Code hinzugefügt (I umformatiert auch den bedingten Ausdruck in den else für Klarheit):

$('#brandSearch').keyup(function() { 
    var valThis = $(this).val().toLowerCase(); 
    if (valThis.length == 0) { 
     // Show all of the .card elements 
     $('.card').show(); 
    } else { 
     $('.card').each(function() { 
      var text = $(this).text().toLowerCase(); 
      // Show or hide the *parent* of this .card element 
      text.indexOf(valThis) >= 0 ? 
       $(this).parent().show() : 
       $(this).parent().hide(); 
     }); 
    }; 
}); 

Da es wie der Nicht-leer-String Fall klingt richtig funktioniert, soll es nur eine Frage sein, Hinzufügen .parent() im if Block, so dass es die anderen Spiele:

$('#brandSearch').keyup(function() { 
    var valThis = $(this).val().toLowerCase(); 
    if (valThis.length == 0) { 
     // Show the parent of each .card element 
     $('.card').parent().show(); 
    } else { 
     // Show or hide the parent of each .card element 
     $('.card').each(function() { 
      var text = $(this).text().toLowerCase(); 
      text.indexOf(valThis) >= 0 ? 
       $(this).parent().show() : 
       $(this).parent().hide(); 
     }); 
    }; 
}); 

Dies ist die Art von Situation, in der Vertrautheit mit Debugging-Tool Ihres Browsers große Zeit auszahlen würde. Die Methoden .show() oder manipulieren das DOM, und mithilfe des DOM-Inspektors können Sie leicht erkennen, welche Elemente ausgeblendet und angezeigt werden.

In der Tat, als eine Lernübung empfehle ich, den Fehler vorübergehend zu beheben, indem Sie zu Ihrem ursprünglichen Code zurückkehren, und öffnen Sie dann den DOM-Inspektor und sehen, wie es das Problem aufdeckt. Während Sie dort sind, können Sie auch den JavaScript-Debugger und andere Tools ausprobieren.

Wenn Sie Chrome verwenden, ist hier ein introduction to the Chrome Developer Tools. Andere Browser haben ähnliche Tools und Dokumentation für sie.

+0

Sie haben absolut Recht. Ich habe deinen Kommentar vorher noch nicht gesehen. Aber was ist der Unterschied zwischen '.length == 0' und' val == "" '? –

+0

Ich sehe nicht 'val ==" "' im Code, aber das würde testen, ob 'val' eine Zeichenfolge ist, die aus einem einzelnen Leerzeichen besteht. Wenn Sie nach 'val ==" "' fragen, wäre das im Wesentlichen dasselbe wie "val.length == 0", vorausgesetzt, dass "val" eine Zeichenkette ist. –

+0

Okay, danke, dass du das geklärt hast, ich habe gerade die Jquery- und JavaScript-Sprache gestartet und es gibt so viele Möglichkeiten, Dinge zu deklarieren. –

1

Es scheint ganz gut zu funktionieren:

$('#brandSearch').keyup(function() { 
 
    var valThis = $(this).val().toLowerCase(); 
 
    if (valThis.length == 0) { 
 
     $('.card').show(); 
 
     console.log("input is empty"); 
 
    } else { 
 
     console.log("input is not empty");     
 
     $('.card').each(function() { 
 
      var text = $(this).text().toLowerCase(); 
 
      (text.indexOf(valThis) >= 0) ? $(this).parent().show(): $(this).parent().hide(); 
 
     }); 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input id="brandSearch">

+0

Seltsam, es funktioniert wirklich. Ist es möglich, dass es weil ist Ich benutze materializecss Eingabefeld? Ich sehe, dass Konsole zeigt, dass die Eingabe nicht leer ist, aber es geht nicht zurück. Es zeigt nicht alle divs wieder. –

+0

Ich bin nicht vertraut mit dieser Art von Eingabe, aber es ist sicherlich möglich, dass es nur auslöst, wenn ein druckbares Zeichen gedrückt wird. –

+0

Auch ".keyup" ist nicht das beste Ereignis, um sich zu registrieren, wenn Sie Änderungen rechtzeitig erkennen möchten. –

Verwandte Themen