2010-06-15 14 views
6

Esiste qualche buona pratica per evitare che il codice jQuery fallisca in modo silenzioso?I motivi per evitare jQuery silent non riesce

Ad esempio:

$('.this #is:my(complexSelector)').doSomething(); 

So che ogni volta che questa linea vengono eseguiti, il selettore è destinato a corrispondere almeno un elemento, o certa quantità di elementi. Esiste uno standard o un buon modo per convalidarlo?

ho pensato a qualcosa di simile:

var $matchedElements = $('.this #is:my(complexSelector)'); 
if ($matchedElements.length < 1) 
    throw 'No matched elements'; 
$matchedElements.doSomething(); 

Inoltre penso unit testing sarebbe una scelta valida, invece di rovinare il codice.

La mia domanda può essere sciocca, ma mi chiedo se c'è un'opzione migliore rispetto alle cose che sto facendo o no. Inoltre, forse sono nel modo sbagliato controllando se qualche elemento corrisponde al mio selettore. Tuttavia, man mano che la pagina continua a crescere, i selettori potrebbero smettere di associare alcuni elementi e alcune funzionalità potrebbero smettere di funzionare inavvertitamente.

risposta

6

Si potrebbe scrivere un plugin:

jQuery.fn.requireElements = function (amount, exactMatch) { 
    if (amount === undefined) { 
     amount = 1; 
    }; 

    if (this.length < amount || this.length > amount && exactMatch) { 
     throw new Error(this.length " elements instead of " (exactMatch ? "at least " : "") + amount); 
    }; 

    return this; 
}; 

Poi:

$('yourSelector').requireElements(2).bind('click', function() { 

}); 
6

Non è necessariamente errato quando un selettore non corrisponde a nulla; dipende dalla tua applicazione. Si potrebbe scrivere il proprio plug-in validateNonEmpty:

jQuery.fn.validateNonEmpty = function() { 
    if (this.length == 0) 
    throw "Empty list detected - selector: " + this.selector; 
    return this; // thanks @Matt 
}; 

allora si può fare:

$('something something').validateNonEmpty().doSomething(); 

Inoltre, nota che si desidera controllare per vedere se la lunghezza è 0, non inferiore a 0.

+0

oh sì grazie @Matt !! – Pointy

2

Si consiglia di utilizzare jQuery lint.

ad esempio

$(function(){ 
    var foo = $('.this #is:my(complexSelector)'); 
}); 

si lamentano sia che si dispone di un selettore non valido (come dato selettore esempio è infatti valida, anche se suppongo che voi sapete che :)), e che non gli elementi in cui in effetti trovate .

Vedere http://js.azatoth.net/test/lint.html per un esempio.

+0

haha ​​Volevo solo dare un ridicolo esempio di selettore, grazie! – Matias

Problemi correlati