要避免的 jQuery 陷阱

IT技术 javascript jquery
2021-02-19 03:21:26

我正在用 jQuery 开始一个项目。

您在 jQuery 项目中有哪些陷阱/错误/误解/滥用/误用?

6个回答

不知道性能下降和过度使用选择器而不是将它们分配给局部变量。例如:-

$('#button').click(function() {
    $('#label').method();
    $('#label').method2();
    $('#label').css('background-color', 'red');
});

而不是:-

$('#button').click(function() {
    var $label = $('#label');
    $label.method();
    $label.method2();
    $label.css('background-color', 'red');
});

或者甚至更好的链接:-

$('#button').click(function() {
    $("#label").method().method2().css("background-color", "red"); 
});

当我意识到调用堆栈如何工作时,我发现是一个启发性的时刻。

编辑:在评论中加入了建议。

我认为将东西分配给局部变量很好,但不要忘记链接的力量(从你的例子中): $("#label").method().method2().css("background-color", "红色的”);
2021-04-18 03:21:26
对具有 jQuery 上下文的变量使用美元符号是一种约定。所以你可能想写var $label = $('#label');
2021-04-19 03:21:26
YouTube 视频很棒。我看过关于这个主题的其他 Google 演示文稿,但我仍然学到了一些东西!谢谢!
2021-04-24 03:21:26
+1 为 youtube 链接。天哪,我学到了很多。
2021-05-09 03:21:26
链接也+1,太棒了!
2021-05-09 03:21:26

了解如何使用上下文。通常,jQuery 选择器会搜索整个文档:

// This will search whole doc for elements with class myClass
$('.myClass');

但是您可以通过在上下文中搜索来加快速度:

var ct = $('#myContainer');
// This will search for elements with class myClass within the myContainer child elements
$('.myClass', ct);
jQuery 检查上下文是否是 jQuery 的实例,因此没有理由将[0]. $('.myClass', ct);或者如果你知道 ct 是 jQuery 的一个实例,你可以使用 findct.find(".myClass")
2021-04-17 03:21:26
看来你的最后一点是不正确的 - groups.google.co.uk/group/jquery-dev/browse_thread/thread/...
2021-04-21 03:21:26
感谢您指出这一点 JP。现在,该怎么办...我是否应该删除我的答案,以免其他人发疯并无故更改他们的代码?
2021-05-02 03:21:26
不,这仍然是一个好点,优化方面。:)
2021-05-03 03:21:26
啊啊啊!嗯,我修复了大约 1,000,000 个错误。+1
2021-05-12 03:21:26

不要使用裸类选择器,如下所示:

$('.button').click(function() { /* do something */ });

这将最终查看每个元素以查看它是否具有“按钮”类。

相反,您可以提供帮助,例如:

$('span.button').click(function() { /* do something */ });
$('#userform .button').click(function() { /* do something */ });

我去年从Rebecca Murphy 的博客中了解到这一点

更新- 这个答案是在 2 年前给出的,对于当前版本的 jQuery是不正确的其中一个评论包括一个测试来证明这一点。还有一个更新版本的测试,其中包括本答案时的 jQuery 版本。

我也有相反的印象。也许在没有实现 getElementsByClassName 的浏览器中就是这种情况,否则你只是给 jQuery 做更多的工作。我非常希望看到 Rebecca 发布一些基准测试 :)
2021-04-20 03:21:26
当您编写 CSS(至少包括元素标签)时,情况正好相反。请参阅code.google.com/speed/page-speed/docs/...
2021-04-23 03:21:26
@Sneakyness 并非所有事物都能准确模拟现实生活。例如,如果浏览器支持,则$('.b')可以使用document.getElementsByClassName('b'),但这样做$('a.b')会导致它获取所有与类匹配的元素,b然后在两阶段操作中确认它们是锚点。后者对我来说听起来更像是工作。对于现实生活中的类比,试试这个:找到我房间里的所有袜子。现在,扔掉不在我梳妆台上的那些。
2021-04-24 03:21:26
您正在减少它必须完成的工作量。这就像告诉别人把你的袜子从你梳妆台的抽屉里拿出来,而不是告诉他们把袜子从你的房间里拿出来。减少它必须做的大量“寻找”。
2021-05-07 03:21:26
我相信对选择器的误解是由于在旧版本的 jquery 中,执行 $('#foo') 而不是 $('div#foo') 更快,因为根据定义,id 是唯一的。我很确定这已在以后的版本中修复,但是该建议仅适用于 id,而不适用于其他类型的选择器
2021-05-12 03:21:26

尝试拆分匿名函数,以便您可以重用它们。

//Avoid
$('#div').click( function(){
   //do something
});

//Do do
function divClickFn (){
   //do something    
}

$('#div').click( divClickFn );
我认为这与同步(内联)代码应该分解为命名函数的程度大致相同。如果你有一大段代码要求给它一个名字,那就去做吧。但是不要仅仅因为将代码包装在一个函数中就将代码移出一行;匿名函数的存在是有充分理由的。
2021-04-18 03:21:26
特别是 如果绑定发生在循环中!
2021-04-26 03:21:26
命名函数在调试时也会让你受益匪浅;没有什么比查看 8 层深的调用堆栈更糟糕的了,该堆栈只有(anonymous). 在此处阅读有关此提示的更多信息:stackoverflow.com/questions/182630/jquery-tips-and-tricks/...
2021-05-02 03:21:26
你的观点很好,我自己可能已经被这件事绊倒了几次。即便如此,“大致相同的程度”仍然对我有用。
2021-05-08 03:21:26
实际上,我喜欢给我的函数命名。当您调试代码并且看到无休止的匿名函数列表时,它非常有用,您会看到正确命名的函数。
2021-05-15 03:21:26
  • 避免滥用文档就绪。
  • 将文档准备好仅用于初始化代码。
  • 总是在文档之外提取函数准备好以便它们可以被重用。

我在 doc ready 语句中看到了数百行代码。丑陋,不可读且无法维护。

我完全赞成没有在文档中放置很长的函数,这是个好建议。但是,使许多从未准备好文档的总体功能运行的小组件功能不一定是最佳实践。如果首要函数是唯一使用这些代码段的函数,那么最好将它们全部放在一个函数中,即使它更难阅读。调用函数有很多开销,如果你只在一个上下文中使用代码,应该避免它。
2021-04-17 03:21:26
@SolutionYogi 因为大多数只是 JS 菜鸟?
2021-04-19 03:21:26
+1。一般来说,我见过的大部分 jQuery 代码都使用了数百行的函数。我不知道为什么“jQuery 开发人员”不喜欢使用较小的函数。
2021-05-05 03:21:26