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就不会运行链式代码,因为它没有运行它们的元素