Шаблоны для предотвращения jQuery тихие сбои

Там хорошо работает практика, чтобы избежать, чтобы Ваш код jQuery тихо перестал работать?

Например:

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

Я знаю, что каждый раз эта строка выполняется, селектор предназначается для соответствия по крайней мере одному элементу или определенному количеству элементов. Есть ли какой-либо стандартный или хороший способ проверить это?

Я думал о чем-то вроде этого:

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

Также я думаю, что поблочное тестирование было бы допустимой опцией вместо того, чтобы смешать код.

Мой вопрос может быть глупым, но интересно, существует ли более оптимальный вариант, чем вещи, которые я в настоящее время делаю или нет. Кроме того, возможно, я нахожусь в неправильном способе проверить если любое соответствие элемента мой селектор. Однако в то время как страница продолжает расти, селекторы могли прекратить соответствовать некоторым элементам, и части функциональности могли прекратить работать непреднамеренно.

6
задан Matias 15 June 2010 в 19:07
поделиться

3 ответа

Вы можете написать плагин:

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

Затем:

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

});
6
ответ дан 8 December 2019 в 17:18
поделиться

Это не обязательно неправильно , когда селектор ничего не соответствует; это зависит от вашего приложения. Вы можете написать свой собственный плагин validateNonEmpty:

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

Затем вы можете сделать:

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

Также обратите внимание, что вы хотите проверить, равна ли длина 0, не меньше 0.

6
ответ дан 8 December 2019 в 17:18
поделиться

Я бы рекомендовал использовать jQuery lint .

, например,

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

будет жаловаться как на то, что у вас неверный селектор (поскольку данный селектор в данном примере на самом деле недействителен, хотя я предполагаю, что вы это знаете :)), так и на то, что на самом деле не было найдено никаких элементов.

См. http://js.azatoth.net/test/lint.html в качестве примера.

2
ответ дан 8 December 2019 в 17:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: