2009-07-08 8 views
5

Para ser más específicos, estoy hablando acerca de cómo evitar este tipo de código:¿Es imposible separar javascript de HTML?

<input type='text' id='title_33' class='title' 
    onfocus='updateCharsLeft(33);' 
    onkeypress='updateCharsLeft(33);' /> 

Aquí me gustaría poner el caso onfocus y onkeypress maneja por separado, es decir en un archivo .js. De esta manera:

$(document).ready(function() 
    { 
    $(".title").focus(updateCharsLeft); 
    $(".title").keypress(updateCharsLeft); 
); 

Sin embargo aquí el problema es que el ID de la caja de texto tiene que ser pasados ​​a la función updateCharsLeft(). Sería una pena tener que extraer la identificación de la ID del cuadro de texto en esa función, por lo que sería más limpio simplemente poner en los controladores de eventos dentro del código HTML.

¿Pensamientos?

+0

Cuál es el propósito del ello se pasa a la función de actualización? Me puede ser capaz de sugerir algo con un poco más de información. – philnash

+0

No creo que el título o la pregunta realmente reflejen lo que estás preguntando: las respuestas parecen estar en la línea de "sí, HTML separado de los archivos Javascript" que pareces conocer. – roryf

+1

What ¿Su función updateCharsLeft() lo hace? –

Respuesta

2

He tenido que hacer algo similar antes y también no estaba contento con el análisis del valor del atributo ID. Lo mejor que puedo sugerir es que utilice otro atributo para el valor que necesita, al igual que el atributo rel:

<input type='text' id='title_33' class='title' rel='33' /> 

O dependiendo de la religiosa que está a punto de validación, sólo tiene que utilizar un atributo personalizado:

<input type='text' id='title_33' class='title' myval='33' /> 
+0

¿cómo se obtiene el valor de rel en la función? ¿Puedes usar this.rel? –

+1

Dado que ya estás usando jQuery, solo usa $ (this) .attr ('rel') – roryf

7

¿No puede hacer esto:

$(document).ready(function() 
    { 
    $(".title").focus(function() { 
     updateCharsLeft(this.id); 
    }); 
    $(".title").keypress(function() { 
     updateCharsLeft(this.id); 
    }); 
); 

o más claramente:

$(document).ready(function() 
    { 
    $(".title .another .someother .andAnother").focus(function() { 
     updateCharsLeft(this.id); 
    }).keypress(function() { 
     updateCharsLeft(this.id); 
    }); 
); 
+0

Como dije en la pregunta, sería una mierda tener que extraer la identificación numérica de 'title_xx' en la función usando this.id. Y también, esto no es t El único elemento que necesito para configurar un controlador de eventos, tendré que configurarlos en 10 elementos y no quiero duplicar el código para extraer el ID numérico de this.id en cada una de esas funciones –

+0

@Click Upvoto - Así que especifique múltiples elementos dentro de su selector, por ej. $ ('. title .foo .blah .g .f'). keypress (blah ... – karim79

+0

Si no quiere usar un valor contextual (del "este" objeto), entonces esencialmente los valores que está pasando en ("33") son números mágicos. Si quiere refactorizar su código para vincular estos manejadores de eventos de una manera común, necesitará usar algo contextual. Deberá pasar este .Id y procesarlo. A menos que ... vea a continuación ... –

1

definitivamente creo que debe separar el JavaScript y HTML. Será más fácil de encontrar/mantener, y puede editar un lugar en lugar de 10. No se repita.

Me gustaría utilizar jQuery en vivo funcionalidad. Si tiene 10 entradas de texto, agregue 20 manejadores de eventos de esta manera en lugar de 2 (uno para CADA controlador de enfoque en la página y otro para CADA controlador de pulsaciones de tecla en la página).

También tengo tu comentario a karim, no veo por qué te estarías duplicando. Debe ser trivial pasar la identificación o transformarla con una expresión regular si es necesario, siempre y cuando sea coherente en su convención de nomenclatura. Por ejemplo, this.id.replace(/.*(\d+)$/,''). Sin embargo, probablemente sea mejor pasar la referencia directa del elemento DOM en su lugar, y trabajar con eso en su función.

Por último, parece pensar que algún aspecto de esto apestará. Tal vez me esté faltando el punto, pero ¿puedes aclarar qué es tan difícil acerca de cómo mainupalitar el ID o la referencia DOM o cualquier otra cosa que necesites hacer? Tal vez publique una muestra de código más larga de lo que está haciendo a continuación.

+0

No es que sea difícil extraer el id. Numérico de la ID del elemento dom, solo que este código deberá repetirse en todas las funciones de mi controlador de eventos. –

0

Intentaré gestionar todos los eventos desde un solo bloque de JavaScript. Siempre que pueda hacer referencia a elementos en la página, esto debería ser posible.

0

Siempre puede utilizar las funciones de cadena para analizar el valor y pasarlo, p. Ej.

$(".title").focus(function() { 
    var thisid = this.id; 
    updateCharsLeft(thisid.substring(thisid.indexOf("_") + 1)); 
}); 

No estoy seguro de cuáles serían las implicaciones de rendimiento si tuviera que hacer esto para muchos elementos.

1

Si realmente no quiere pasar this.Id entonces se podría añadir un atributo personalizado a la etiqueta de entrada ...

<input type='text' id='title_33' idSuffix='33' class='title'/> 

A continuación, configurar los controladores de eventos como este ...

$(document).ready(function() 
{ 
    $(".title").focus(function() { 
     updateCharsLeft(this.idSuffix); 
    }); 
    $(".title").keypress(function() { 
     updateCharsLeft(this.idSuffix); 
    }); 
); 

A mi personalmente me gustan los atributos personalizados. Proporcionan una forma de proporcionar metadatos personalizados a las etiquetas Html y mantenerlo todo en el marcado. validadores HTML no les gustan, aunque :-(

0
$(document).ready(function(){ 
    var update = function(){ updateCharsLeft(this.id.split("_")[1]); }; 
    $("input.title") 
     .focus(update) 
     .keypress(update); 
}); 
Cuestiones relacionadas