jQuery断言支持/防御性编程?

jQuery中是否有任何内置支持用于基本断言检查,主要是“预期的返回元素数量”等内容。

例如,我可能有这样一个简单的声明:

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

现在有很多理由说明$("#btnSignup")可能无法正确返回1项:

  • 您错误输入了按钮ID名称
  • 有人错误地重命名了
  • 它不存在于页面上
  • 错误地有两个带有id的元素
  • 您正在使用ASP.NET MVC,并且您不小心使用HtmlHelper.Button(...)而不是HtmlHelper.Submit()为按钮生成了HTML。 Button(...)方法不会为按钮元素创建ID。

现在在这个实例(和许多实例)中,我的应用程序根本无法工作,除非从选择器返回一个项目。 所以我总是想告诉你$("@#btnSignup")是不是只返回1项。 那我怎么能这样做?! 我很好,如果这是一个例外或最好是一个警告框 – 所以如果我没有在调试器中运行,那么我可以被告知。

我正在寻找像这样的语法 – 它的function类似于.NET的Single()扩展方法。

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

我个人很好,因为这段代码总是运行并告诉那里有谁有问题。 对于所有永恒运行这个额外代码显然不是性能问题 。 在这种情况下,如果#btnSignup不存在,我的代码就会被破坏。

我确信这个问题已经被打死了,并且有很多解决方案 – 但是有人能指出我的一些吗?

我没有看到任何内置于jQuery中的内容,并想知道最好的插件是什么。 我宁愿只是在页面上有一些可以“监视”我的东西并告诉我是否有问题。 我甚至不反对对错误报告服务进行AJAX调用。

看起来没有任何内置的东西。 但写一个扩展并不太难:

 $.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(); ); 

请注意,即使断言失败,在当前forms下函数也会成功返回。 你链接的任何东西仍然会被执行。 使用return false; 而不是return this; 停止进一步执行链。

Tomalak的答案增强:抛出错误以暂停执行,包括违规选择器并添加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); }; 

我为此创建了一个插件: jquery-assert 。 你可以像这样使用它:

在调用下一个函数之前,确保找到一个或多个元素:

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

断言选择了1个元素:

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

在调用其他函数之前,请确保找到给定数量的元素:

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

你可能想要http://docs.jquery.com/Traversing/eq#index :

将匹配元素集减少为单个元素。

如果你的选择器没有返回任何对象,那么jQuery就不会运行链式代码,因为它没有运行它们的元素