【问题标题】:jquery hides simple javascript errorsjquery 隐藏简单的 javascript 错误
【发布时间】:2011-10-06 18:06:39
【问题描述】:

我在 chrome 和 firefox 中使用 jQuery 和 flot。 当我处理我的代码时,我发现在访问不存在的哈希结构等愚蠢的东西上执行会默默地失败。

感觉 jQuery 中有一些 try {} catch {} 逻辑让我看不到任何错误。

任何关于如何在不使用 hack-n-slash 来隔离简单错误的情况下解决此问题的指示?

jshint 并没有太大帮助。

--编辑--

更多调试显示趋势。

我基本上是在发现拼写错误(未定义的变量)和对象属性存在之前的过早获取。使用 .hasOwnProperty() 有帮助,但很麻烦。我想我在某个地方看到了一个方便的实用程序来帮助简洁地测试深层结构。

【问题讨论】:

  • 你能举个例子吗?
  • 我从来没有尝试过使用它,但是你看过error()吗?不过,我不确定这是否会捕获潜在的 JavaScript 错误。

标签: jquery debugging syntax try-catch


【解决方案1】:

.length 是你调试 jQuery 的朋友。因为即使:

document.getElementById('nonexistent');

将在 JavaScript 中返回 null,使用 jQuery 选择器将返回一个对象并强制转换 true

if(!document.getElementById('nonexistent')) {
    alert('not here!');
}

if(!$('#nonexistent')) {
    alert('here, here!');
}

这意味着:

$('#nonexistent').doSomething().doSomethingElse().whatever();

可能不会抛出错误,因此您将很难知道链中什么“不起作用”。

但是,检查对象长度是可行的:

if(!$('#nonexistent').length) {
    alert('not here!');
}

jQuery 被设计为静默失败,因为它的核心用例之一是链接。如果选择器或原型方法会在链中返回 null 或 false,那么使用 jQuery 会比大多数没有经验的程序员想要的更频繁地抛出 null-reference 错误。

更新

如果处于调试模式,您可能可以通过修改原型来进行自己的调试。我试过这个:

var debug = ['hide','show'], // Array of jQuery methods to debug
    i = 0, name;

for(; debug[i]; i++) {
    name = debug[i];
    if (typeof $.fn[name] == 'function') {
        $.fn[name] = (function(name, fn) {
            return function() {
                if ( !this.length ) {
                    console.warn('No elements selected when calling '+name);
                }
                fn.apply(this, Array.prototype.slice.call( arguments ));
            };
        }(name, $.fn[name]));
    }
}

现在,每当我调用“隐藏”时,如果链中没有元素,它会警告我:

$('#nonexistent').hide();  // consoles a warning

小提琴:http://jsfiddle.net/B4XQx/

【讨论】:

  • 这个答案是关于避免我的编码错误的提示(有帮助),但真正的宝石是最后一段(链接的静默失败)。我希望有一个“调试”模式可以指出这些,以便我可以更快地找到它们
  • 我添加了一个示例,说明如何对 jQuery 原型进行自己的调试。
  • 很好的例子,但空选择器不是我的一般错误,它是空引用错误导致我的 UI 只是静静地坐在那里。在 firebox(或 chrome 调试器)中,代码会在没有任何警告的情况下跳入 jquery.js 文件。我将其追溯到未声明的变量(通过错字)或尝试通过不存在的属性引用。
【解决方案2】:

这里有解决方法:

jQuery error on null selector

但我怀疑这真的是你想要的-

【讨论】:

  • 正确,我的问题更基本,涉及空引用等。
猜你喜欢
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 2016-07-24
  • 1970-01-01
相关资源
最近更新 更多