Поддержка утверждений jQuery / защитное программирование? - PullRequest
18 голосов
/ 31 января 2009

Существует ли какая-либо встроенная поддержка в jQuery для базовой проверки утверждений, в первую очередь, таких как «ожидаемое количество возвращаемых элементов».

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

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

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

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

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

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

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

 or 

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

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

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

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

Ответы [ 4 ]

15 голосов
/ 31 января 2009

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

$.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;, чтобы остановить дальнейшее выполнение цепочки.

8 голосов
/ 29 июня 2011

Улучшения в ответе Томалака: сбросьте ошибку, чтобы остановить выполнение, включите селектор, вызвавший ошибку, и добавьте вариант 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 голосов
/ 28 февраля 2013

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

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

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

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

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

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

$('.item').assertFound(10).find('p').assertFound(10).data(...)
0 голосов
/ 31 января 2009

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

Сократить набор соответствующих элементов до одного элемента.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...