代码之家  ›  专栏  ›  技术社区  ›  mati

避免jQuery silent失败的模式

  •  6
  • mati  · 技术社区  · 15 年前

    例如:

    $('.this #is:my(complexSelector)').doSomething();
    

    我知道,每次执行这一行时,选择器都要匹配至少一个元素或一定数量的元素。有没有什么标准或好的方法来验证这一点?

    var $matchedElements = $('.this #is:my(complexSelector)');
    if ($matchedElements.length < 1)
        throw 'No matched elements';
    $matchedElements.doSomething();
    

    我还认为单元测试是一个有效的选择,而不是把代码弄乱。

    我的问题可能很傻,但我想知道是否有比我现在做的事情更好的选择。另外,可能我检查任何元素是否与我的选择器匹配的方法是错误的。但是,随着页面的不断增长,选择器可能会停止匹配某些元素,并且功能可能会在无意中停止工作。

    3 回复  |  直到 15 年前
        1
  •  6
  •   Matt user129975    15 年前

    你可以写一个插件:

    jQuery.fn.requireElements = function (amount, exactMatch) {
        if (amount === undefined) {
            amount = 1;
        };
    
        if (this.length < amount || this.length > amount && exactMatch) {
            throw new Error(this.length " elements instead of " (exactMatch ? "at least " : "") + amount);
        };
    
        return this;
    };
    

    $('yourSelector').requireElements(2).bind('click', function () {
    
    });
    
        2
  •  6
  •   Pointy    15 年前

    不一定 当选择器不匹配时;这取决于你的申请。您可以编写自己的validateNonEmpty插件:

    jQuery.fn.validateNonEmpty = function() {
      if (this.length == 0)
        throw "Empty list detected - selector: " + this.selector;
      return this; // thanks @Matt
    };
    

    然后你可以做:

    $('something something').validateNonEmpty().doSomething();
    

    另外,请注意,要检查长度是否为0,而不是小于0。

        3
  •  2
  •   azatoth    15 年前

    我建议使用 jQuery lint .

    $(function(){
      var foo = $('.this #is:my(complexSelector)');
    });
    

    将抱怨您有一个无效的选择器(如给定的示例所示,选择器事实上是无效的,尽管我假设您知道:)),并且没有在事实上找到的元素。

    看到了吗 http://js.azatoth.net/test/lint.html