2009-01-31 12 views
18

Esiste un supporto integrato in jQuery per il controllo dell'asserzione di base, principalmente di "numero previsto di elementi restituiti".jQuery assertion support/programmazione difensiva?

Per esempio io possa avere una dichiarazione semplice come questo:

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

Ora c'è un sacco di motivi per cui $("#btnSignup") potrebbero non tornare esattamente 1 articolo:

  • È sbagliato a digitare il nome id tasto
  • Qualcuno lo ha rinominato per errore
  • Non esiste nella pagina
  • Ci sono DUE elementi con quell'id per errore
  • Si sta utilizzando ASP.NET MVC e l'HTML generato per il pulsante è stato generato accidentalmente con HtmlHelper.Button(...) anziché HtmlHelper.Submit(). Il metodo Button(...) NON crea un ID per l'elemento button.

Ora in questa istanza (e molte istanze) la mia applicazione semplicemente non funzionerà a meno che ESATTAMENTE un elemento non venga restituito dal selettore. Quindi voglio SEMPRE essere informato se $("@#btnSignup") non restituisce esattamente 1 elemento. Quindi, come posso fare questo ?! Sto bene se questa è un'eccezione o preferibilmente una casella di avviso - quindi se non sto correndo in un debugger allora posso dirlo.

Sto cercando una sintassi simile a questa, che è simile nella funzionalità al metodo di estensione .NET Single().

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

or 

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

Sarei personalmente bene per questo codice per eseguire SEMPRE e dire chi è lì che c'è un problema. ovviamente non è un performance issue per eseguire questo codice aggiuntivo per l'eternità. In questo caso il mio codice è rotto se #btnSignup non esiste.

Sono sicuro che questo problema è stato picchiato a morte e ci sono molte soluzioni - ma qualcuno può indicarmi qualcuno di loro?

Non vedo nulla di costruito in jQuery e mi chiedo quale sia il miglior plugin. Preferirei avere qualcosa sulla pagina che possa continuare a "guardarmi" e dirmi se c'è un problema. Non sarei nemmeno contrario a una chiamata AJAX a un servizio di segnalazione degli errori.

+0

Non che la mia vita dipenda da questo, ma un voto ascendente/acce pt sarebbe carino, tuttavia. ;-) – Tomalak

+0

@tomalak sai che in realtà penso di aver fatto clic su di esso, ma penso che fosse perché il mio intentet era traballante e ero troppo impegnato a provarlo per notare che il tuo voto non è andato a buon fine. Avevo 7kb/s in upstream e 58.34kb/s in downstream su un modem via cavo. In entrambi i casi sei il benvenuto e grazie ancora! –

+1

Internet ancora instabile? ;) – Tomalak

risposta

15

Non sembra che ci sia qualcosa di integrato. Ma scrivere un'estensione non è troppo difficile:

$.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; 
}; 

L'utilizzo è esattamente come si propone nella tua domanda.

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

Si noti che nella sua forma corrente la funzione restituisce correttamente anche se l'asserzione non riesce. Tutto ciò che hai incatenato verrà comunque eseguito. Utilizzare return false; anziché return this; per interrompere l'ulteriore esecuzione della catena.

+0

grazie! c'è praticamente infinite possibilità per come registrarlo o segnalarlo, ma per ora un avviso lo farà! Speravo solo che qualcuno avesse già scritto un plugin. mi sto davvero stancando di vedere errori javascript su società Fortune 100 e voglio che le mie pagine siano il più prive di errori possibili –

+0

oh e ho trovato questo tipo di asserzioni molto preziose. vorrebbe portarli in jQuery in qualche modo, ma non è mai riuscito a suggerirli e gli assegni di runtime non costosi sono un buon modo per trovare bug di refactoring –

+2

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

-3

probabilmente avrete bisogno http://docs.jquery.com/Traversing/eq#index:

Ridurre l'insieme di elementi abbinati ad un singolo elemento.

Se il selettore non ha prodotto alcun oggetti poi jQuery semplicemente non eseguire il codice incatenato in quanto privo di elementi per farli funzionare su

+0

questo non è proprio quello che sto cercando, ma nondimeno era qualcosa di cui non ero a conoscenza - e potrebbe essere qualcosa che userei nella costruzione di una tale libreria di asserzioni se ne costruisco uno. Desidero esplicitamente un errore e non null. grande pericolo con jQuery è la gente tende a non vedere la realtà cosa restituisce –

8

Miglioramenti alla risposta di Tomalak: gettare l'errore di fermare l'esecuzione, includere l'incriminato selettore e aggiungere 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

ho creato un plugin per questo: jquery-assert. Si potrebbe utilizzare in questo modo:

Assicurarsi, uno o più elementi sono stati trovati, prima di chiamare la funzione successiva:

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

affermare che 1 elemento è stato selezionato:

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

Assicurarsi un determinato numero di elementi è stato trovato prima di chiamare ulteriori funzioni:

$('.item').assertFound(10).find('p').assertFound(10).data(...) 
Problemi correlati