2009-11-06 15 views
20

Estoy contando palabras en un campo de texto y después de cierta cantidad de palabras, utilizo prevenir el valor predeterminado. En el resto, me gustaría cambiar el nombre de los comandos predeterminados.¿Hay una función opuesta a preventDefault() en JavaScript?

¿preventDefault() tiene una función opuesta?

Aquí hay un código de ejemplo:

<!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> 

Parece que funciona en IE, Firefox, pero no le gusta.

Respuesta

9

creo que el problema que tiene es que no se está buscando la tecla de borrar. Preventdefault no cancela el controlador de eventos todos juntos. Pero con su código una vez que llegue a la longitud máxima de su campo, el usuario ya no podrá borrar ningún carácter porque la cancelación de la tecla se está cancelando.

La razón por la que funciona en IE es porque IE no activa el evento de pulsación de teclas para eliminar, finalizar, ingresar, escapar, teclas de función, inicio, insertar, página Arriba/Abajo y tabulación. En Safari, el código clave para eliminar es incorrecto en el evento de pulsación de tecla.

Por estas razones tengo una doble sugerencia; primero, utilice el evento de tecla alternativa para que obtenga los códigos clave correctos.

En segundo lugar, mire el código clave y si es eliminar o retroceder, no lo impida.

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

Buena explicación, creo que has encontrado el verdadero problema aquí. – Kobi

+0

Esto es exactamente lo que necesitaba que sucediera. Gracias. – Wilkins

8

No debería

if maxwords 
    preventDefault 
else 
    return true 

hacer el truco?

+8

Ni siquiera necesita devolver cierto. – Quentin

+0

Pensé lo mismo, pero estoy usando el método de pulsación de teclas de jQuery. Entonces, una vez que se alcanza el objetivo, no hay forma de "deshacerlo". – Wilkins

4

simplemente use return true; al final de su manejador de eventos. Eso abriría el evento al navegador.

3

no se parece a ella, https://developer.mozilla.org/en/DOM/event, pero que acaba de no se puede llamar ...

+0

@Downvoter - Mi respuesta fue escrita antes de que se publicara el código, y el código sugiere confusión en el mejor de los casos. Lo contrario de preventDefault es el valor predeterminado: no hacer nada. – 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(); 
     });
Cuestiones relacionadas