2009-01-31 11 views
18

¿Existe algún soporte incorporado en jQuery para la comprobación básica de las afirmaciones, principalmente de elementos como "número esperado de elementos devueltos".jQuery assertion support/programación defensiva?

Por ejemplo es posible que tenga una declaración simple como esto:

$("#btnSignup").click(function() { 
    return validateForm(); 
); 

Ahora theres un montón de razones por las $("#btnSignup") puede no volver exactamente 1 punto:

  • Usted ha escrito mal el nombre botón Identificación
  • Alguien lo renombró por error
  • No existe en la página
  • Hay dos elementos con esa identificación por error
  • Está utilizando ASP.NET MVC y ha generado accidentalmente el código HTML para el botón con HtmlHelper.Button(...) en lugar de HtmlHelper.Submit(). El método Button(...) NO crea una ID para el elemento del botón.

Ahora en esta instancia (y en muchas instancias) mi aplicación simplemente no funcionará a menos que EXACTAMENTE se devuelva un elemento del selector. Entonces SIEMPRE quiero que me digan si $("@#btnSignup") no devuelve exactamente 1 artículo. Entonces, ¿cómo puedo hacer esto? Estoy bien si se trata de una excepción o, preferiblemente, un cuadro de alerta, así que si no estoy ejecutando un depurador, entonces se me puede decir.

Estoy buscando sintaxis algo así - que es similar en funcionalidad al método de extensión .NET Single().

$("#btnSignup").assertSingle().click(function() { 
    return validateForm(); 
); 

or 

$("#btnSignup").assertSize(1).click(function() { 
    return validateForm(); 
); 

Estaría bien si este código SIEMPRE se ejecuta y le dice a quien sea que hay un problema. obviamente no es un performance issue para ejecutar este código adicional para toda la eternidad. En este caso, mi código se rompe si #btnSignup no existe.

Estoy seguro de que este problema ha sido golpeado hasta la muerte y hay muchas soluciones, pero ¿alguien puede señalarme algunas de ellas?

No veo nada incorporado en jQuery y me pregunto cuál es el mejor complemento. Prefiero tener algo en la página que pueda seguir 'mirándome' y decirme si hay algún problema. Ni siquiera me opondría a que se realice una llamada AJAX a un servicio de informe de errores.

+0

No es que mi vida dependa de ello, sino un voto positivo/acce pt sería bueno, sin embargo. ;-) – Tomalak

+0

@tomalak, sabes que realmente creo que HAGO clic en él, pero creo que fue porque mi intenet estaba siendo escamosa y estaba demasiado ocupado probándolo para darme cuenta de que tu voto no fue aprobado. Obtuve 7kb/s en sentido ascendente y 58.34kb/s en sentido descendente en un cablemódem. en cualquier caso eres bienvenido y gracias de nuevo! –

+1

Internet todavía escamosa? ;) – Tomalak

Respuesta

15

Parece que no hay nada incorporado. Pero escribir una extensión no es demasiado difícil:

$.fn.assertSize = function(size) { 
    if (this.length != size) { 
    alert("Expected " + size + " elements, but got " + this.length + "."); 
    // or whatever, maybe use console.log to be more unobtrusive 
    } 
    return this; 
}; 

El uso es exactamente como usted propone en su pregunta.

$("#btnSignup").assertSize(1).click(function() { 
    return validateForm(); 
); 

Tenga en cuenta que, en su forma actual, la función vuelve a funcionar incluso si falla la aserción. Todo lo que hayas encadenado seguirá ejecutándose. Use return false; en lugar de return this; para detener la ejecución adicional de la cadena.

+0

gracias! hay un alcance casi infinito para cómo registrarlo o informarlo, ¡pero una alerta lo hará por ahora! Solo esperaba que alguien ya hubiera escrito un complemento. Me estoy enfermando y cansando de ver errores de javascript en las compañías de Fortune 100. Y quiero que mis páginas estén lo más libres de errores posibles. –

+0

Ah, y este tipo de afirmaciones me parecieron muy valiosas. quisiera ponerlos en jquery de alguna manera, pero nunca lo sugirieron y las comprobaciones en tiempo de ejecución económicas son una buena forma de encontrar errores de refactorización –

+2

$ .fn.assertSingle = function() {return this.assertSize (1); }; –

-3

es probable que desee http://docs.jquery.com/Traversing/eq#index:

Reducir el conjunto de elementos emparejados a un solo elemento.

Si el selector no devolvió los objetos a continuación, jQuery, simplemente no se ejecutará el código encadenado ya que no tiene elementos para ejecutarlos en

+0

esto no es exactamente lo que estoy buscando, pero de todos modos era algo de lo que no era consciente, y podría ser algo que utilizaría para construir una biblioteca de aserciones si construyo una. explícitamente quiero un error y no un nulo. gran peligro con jQuery es que la gente no tiende a la realidad verifica lo que devuelve –

8

Mejoras a la respuesta de Tomalak: tirar el error de detener la ejecución, incluya el infractor selector y agregue la variante assertSingle.

$.fn.assertSize = function(size) { 
    if (this.length != size) { 
     throw "Expected " + size + " elements, but selector '" + this.selector + "' found " + this.length + "."; 
    } 
    return this; 
}; 
$.fn.assertSingle = function() { return this.assertSize(1); }; 
3

creé un plugin para que: jquery-assert. Se podía utilizar de esta manera:

Asegúrese, se encontraron uno o más elementos, antes de llamar a la siguiente función:

$('#element01').assertFound().val('x') 

Afirmar que fue seleccionado 1 elemento:

$('#element01').assertOne(); // same as assertFound(1) 

Asegúrese se encontró un número determinado de elementos antes de llamar a funciones adicionales:

$('.item').assertFound(10).find('p').assertFound(10).data(...) 
Cuestiones relacionadas