Подтвердить что ты не робот

Поддержка jQuery поддержки/защитное программирование?

Есть ли встроенная поддержка в jQuery для базовой проверки утверждений, прежде всего таких вещей, как "ожидаемое количество возвращенных элементов".

Например, у меня может быть простой оператор вроде этого:

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

Теперь существует множество причин, по которым $("#btnSignup") может не возвращать ровно 1 элемент:

  • Вы ошибочно указали имя кнопки
  • Кто-то переименовал его по ошибке
  • Он не существует на странице
  • Есть два элемента с этим id по ошибке
  • Вы используете ASP.NET MVC, и вы случайно создали HTML-код для кнопки с HtmlHelper.Button(...) вместо HtmlHelper.Submit(). Метод Button(...) НЕ создает идентификатор для элемента кнопки.

Теперь в этом экземпляре (и во многих экземплярах) мое приложение просто не будет работать, если ТОЧНО один элемент не будет возвращен из селектора. Поэтому я ВСЕГДА хочу сказать, если $("@#btnSignup") не возвращает ровно 1 элемент. Так как я могу это сделать?! Я в порядке, если это исключение или желательно окно предупреждения - так что если я не буду работать в отладчике, тогда мне будет сказано.

Я ищу синтаксис somthing, подобный этому, который похож по функциональности на .NET Single() метод расширения.

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

 or 

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

Я лично был бы в порядке, чтобы этот код ВСЕГДА бежал и рассказывал, кто там, что есть проблема. его явно не проблема для запуска этого дополнительного кода на всю вечность. В этом случае мой код не работает, если #btnSignup не существует.

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

Я не вижу ничего встроенного в jQuery и задаюсь вопросом, какой лучший плагин. Я бы скорее просто что-то на странице, которая может "следить" за мной и говорить мне, если проблема. Я бы даже не возражал против вызова AJAX в службу отчетов об ошибках.

4b9b3361

Ответ 1

Не похоже, что есть что-то встроенное. Но писать расширение не так сложно:

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

Использование точно так же, как вы предлагаете в своем вопросе.

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

Обратите внимание, что в его текущей форме функция возвращается успешно, даже если утверждение терпит неудачу. Все, что вы приковали, все равно будет выполнено. Используйте return false; вместо return this;, чтобы остановить дальнейшее выполнение цепочки.

Ответ 2

Усовершенствования ответа Tomalaks: бросить ошибку, чтобы остановить выполнение, включить селектор-нарушитель и добавить вариант 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

Я создал для этого плагин: jquery-assert. Вы можете использовать его следующим образом:

Убедитесь, что один или несколько элементов были найдены, прежде чем вызывать следующую функцию:

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

Убедитесь, что выбран один элемент:

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

Убедитесь, что определенное количество элементов было найдено до вызова дополнительных функций:

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

Ответ 4

Вероятно, вы хотите http://docs.jquery.com/Traversing/eq#index:

Уменьшить набор согласованных элементов до одного элемента.

Если ваш селектор не возвращает никаких объектов, тогда jQuery просто не будет запускать закодированный код, поскольку он не имеет элементов для запуска их на