【问题标题】:jQuery assertion support / defensive programming?jQuery 断言支持/防御性编程?
【发布时间】:2009-01-31 07:55:52
【问题描述】:

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

例如,我可能有这样一个简单的语句:

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

现在$("#btnSignup") 可能无法准确返回 1 项的原因有很多:

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

现在在这种情况下(以及许多情况下)我的应用程序根本无法工作,除非从选择器中返回一个项目。所以我总是想被告知$("@#btnSignup") 是否没有准确返回 1 项。那么我该怎么做呢?!如果这是一个异常或者最好是一个警告框,我很好 - 所以如果我没有在调试器中运行,那么我可以被告知。

我正在寻找类似这样的语法——它在功能上类似于 .NET 的 Single() 扩展方法。

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

 or 

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

我个人认为这段代码总是可以运行并告诉那里的任何人有问题。它显然不是 performance issue 永远运行这个额外的代码。在这种情况下,如果#btnSignup 不存在,我的代码就会损坏。

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

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

【问题讨论】:

  • 并不是说我的生活依赖于它,但是赞成/接受仍然会很好。 ;-)
  • @tomalak 你知道我实际上认为我确实点击了它,但我认为这是因为我的互联网不稳定而且我太忙于测试它而没有注意到你的投票没有通过。我在有线调制解调器上获得了 7kb/s 的上行速度和 58.34kb/s 的下行速度。无论哪种情况,都欢迎您,再次感谢!
  • 互联网仍然不稳定? ;)
  • @Tomalak 快 4 年了 :-) !!!我们需要把它变成一个合适的插件

标签: jquery debugging


【解决方案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; 来停止链的进一步执行。

【讨论】:

  • 谢谢!如何记录或报告它的范围几乎是无限的,但现在可以发出警报!我只是希望有人已经写了一个插件。我真的厌倦了看到财富 100 强公司的 javascript 错误 - 我希望我的页面尽可能没有错误
  • 哦,我发现这些断言非常有价值。想以某种方式让它们进入 jquery 本身,但从未提出建议,廉价的运行时检查是查找重构错误的好方法
  • $.fn.assertSingle = function() { return this.assertSize(1); };
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    断言选择了 1 个元素:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 这不是我要寻找的东西,但仍然是我不知道的东西——如果我确实构建了一个断言库,我可能会使用它来构建这样的断言库。我明确想要一个错误而不是空值。 jQuery 的一大危险是人们往往不会去实际检查它返回的内容
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多