2011-10-06 72 views
5

我使用jQuery和flot铬和Firefox。 当我处理我的代码时,我发现执行静静地失败了愚蠢的东西,如访问不存在的散列结构等。jquery隐藏简单的javascript错误

感觉就像在jQuery中有一些尝试{} catch {}逻辑,它使我看不到任何错误。

任何关于如何解决这个问题的指针,而不用一揽子黑客斜线来隔离一个简单的bug的位置?

jshint并没有太大的帮助。

--edit--

更多调试显示趋势。

我基本上发现错别字(未定义的变量)和过早提取对象属性之前,他们存在。使用.hasOwnProperty()已经有所帮助,但是很麻烦。我想我看到了一个方便的实用工具来帮助简洁地测试深层结构。

+2

你能给出一个例? – JohnFx

+1

任何示例代码? –

+0

我从来没有尝试过使用它,但是你看过['error()'](http://api.jquery.com/error/)?不过,这是否会抓住潜在的JavaScript错误,我不确定。 –

回答

3

.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会比大多数没有经验的程序员想要的更频繁地抛出空引用错误。

更新

则很可能通过,如果在调试模式下修改原型做自己的调试。我尝试这样做:

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/

+0

这个答案是避免我的编码错误(有用),但真正的宝石是最后一段(链接无声失败)的提示。我希望有一个“调试”模式,可以指出这些,以便更快地找到它们。 – ericslaw

+0

我添加了一个关于如何对jQuery原型进行自己的调试的示例。 – David

+0

很好的例子,但空选择器不是我的一般错误,它是空引用错误,导致我的用户界面只是静静地坐在那里。在firebox(或chrome调试器)中,代码不加任何警告地进入jquery.js文件。我追溯到未声明的变量(通过错字)或试图引用通过不存在的属性。 – ericslaw