2009-11-06 8 views
20

ich Wörter in einem Textfeld und nach einer gewissen Menge von Wörtern zu zählen, ich benutze Standard zu verhindern. Im else möchte ich die Standardbefehle renieren.Gibt es eine umgekehrte Funktion von preventDefault() in JavaScript?

Does prevent() eine entgegengesetzte Funktion haben? Hier

ist ein Beispielcode:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>preventDefault</title> 
    <style type="text/css"></style> 
     <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
     <script type="text/javascript"> 
      $(function() { 
       var wordNum = 3; 
       var input_length; 
       $("#max").text("max word(s): " + wordNum); 
       $("#test").keypress(function(event) { 

        input_length = $.trim($(this).val()) 
          .replace(/\s+/g, " ") 
          .split(' ').length; 

        if (input_length > (wordNum - 1)) { 
         event.preventDefault(); 
        } else { 
         return true; 
        } 
       }); 
      }); 

     </script> 
     </head> 
     <body> 
      <div id="max"></div> 
      <textarea id="test" cols="20" rows="5"></textarea> 
</body> 
</html> 

Es scheint auf IE zu arbeiten, aber Firefox mag es nicht.

Antwort

9

Ich denke, rufen Sie das Problem, das Sie haben, ist, dass Sie nicht für die Löschtaste suchen. Preventdefault bricht den Event-Handler nicht alle zusammen ab. Aber mit Ihrem Code, sobald Sie die maximale Länge Ihres Feldes erreicht haben, kann der Benutzer keine Zeichen mehr löschen, da der Lösch-Tastendruck abgebrochen wird.

Der Grund ist es in IE funktioniert, weil IE nicht das KeyPress-Ereignis für Lösch-, Ende abfeuert, geben Sie, Flucht, Funktionstasten, nach Hause, insert, pageUp/Abwärts- und Reiter. In Safari ist der Schlüsselcode für das Löschen im Keypress-Ereignis falsch.

Aus diesen Gründen ich einen doppelten Vorschlag habe; Verwenden Sie stattdessen zuerst das Keydown-Ereignis, damit Sie die richtigen Tastencodes erhalten.

Zweitens sehen Sie den Schlüsselcode und wenn es löscht oder Backspace dann nicht prevent.

if ((event.keyCode != 46 && event.keyCode != 8) || input_length > (wordNum - 1)) { 
    return false; 
} else { 
    return true; 
} 
+1

Schöne Erklärung, ich denke, Sie haben das wahre Problem hier gefunden. – Kobi

+0

Genau das musste ich tun. Vielen Dank. – Wilkins

8

Sollte nicht

if maxwords 
    preventDefault 
else 
    return true 

den Trick tun?

+8

Sie brauchen nicht einmal wahr zurückzukehren. – Quentin

+0

Ich dachte auch, aber ich benutze jQuery's Tastendruck-Methode. Sobald das Ziel erreicht ist, gibt es keine Möglichkeit, es rückgängig zu machen. – Wilkins

4

einfach verwenden return true; am Ende Ihrer Eventhandler. Das würde das Ereignis zum Browser aufblasen.

3

Sieht nicht, https://developer.mozilla.org/en/DOM/event, aber man kann einfach es nicht ...

+0

@Downvoter - Meine Antwort wurde geschrieben, bevor der Code veröffentlicht wurde, und der Code deutet bestenfalls auf Verwirrung hin. Das Gegenteil von preventDefault ist der Standardwert - nichts tun. – Kobi

2
$("#delete_button").click(function(e){ 
      var category = $("#category").val(); 
      var answer = confirm("Are you sure you would like to delete the " + category + " category?"); 
      if (!answer) 
       e.preventDefault(); 
     });
Verwandte Themen