Cạm bẫy jQuery để tránh [đóng]


210

Tôi đang bắt đầu một dự án với jQuery.

Những cạm bẫy / lỗi / quan niệm sai lầm / lạm dụng / lạm dụng bạn đã có trong dự án jQuery của bạn là gì?


4
Điều này không nên bị đóng cửa vì "không mang tính xây dựng". Một số câu trả lời rất hữu ích đã được hiện thực hóa và câu hỏi đã được đánh dấu sao 220 lần. Hãy bỏ phiếu để mở lại, nếu bạn có đủ nghiệp lực.
Roy Prins

Dường như với tôi, jQuery là một cạm bẫy trong chính nó
gromit190

Câu trả lời:


189

Không biết về hiệu suất nhấn và lạm dụng các bộ chọn thay vì gán chúng cho các biến cục bộ. Ví dụ:-

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

Thay vì: -

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

Hoặc thậm chí tốt hơn với chuỗi : -

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

Tôi thấy đây là khoảnh khắc khai sáng khi tôi nhận ra cách các ngăn xếp cuộc gọi hoạt động.

Chỉnh sửa: kết hợp các đề xuất trong ý kiến.


16
+1 cho liên kết youtube. tào lao thần thánh tôi đã học được rất nhiều.
Jason

23
Tôi nghĩ rằng việc gán mọi thứ cho các biến cục bộ là tuyệt vời nhưng đừng quên sức mạnh của chuỗi (từ ví dụ của bạn): $ ("# nhãn"). Phương thức (). Phương thức 2 (). Css ("màu nền", " màu đỏ ");
Lance McNearney

Các video YouTube là tuyệt vời. Tôi đã xem các bài thuyết trình khác của Google về chủ đề này và tôi vẫn học được một vài điều! Cảm ơn!
Gabriel Hurley

+1 cho liên kết là tốt, xuất sắc!
Josh Stodola

7
Đó là một quy ước để sử dụng ký hiệu đô la cho các biến với bối cảnh jQuery. Vì vậy, bạn có thể muốn viếtvar $label = $('#label');
Tim Büthe

90

Hiểu cách sử dụng bối cảnh. Thông thường, một bộ chọn jQuery sẽ tìm kiếm toàn bộ tài liệu:

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

Nhưng bạn có thể tăng tốc mọi thứ bằng cách tìm kiếm trong một ngữ cảnh:

var ct = $('#myContainer');
// This will search for elements with class myClass within the myContainer child elements
$('.myClass', ct);

9
Aaaaaaah! Vâng, đó là khoảng 1.000.000 lỗi của tôi đã được sửa. +1
jammus

4
Có vẻ như điểm cuối cùng của bạn không chính xác - Groups.google.co.uk/group/jquery-dev/browse_thread/thread/ Kẻ
James

1
Cảm ơn đã chỉ ra điều này JP. Bây giờ, phải làm gì ... Tôi có nên xóa câu trả lời của mình để không ai khác phát điên và thay đổi mã của họ không có gì không?
slolife

Không, đó vẫn là một điểm tốt, tối ưu hóa khôn ngoan. :)
James

2
jQuery kiểm tra xem bối cảnh có phải là một dấu vết của jQuery hay không vì vậy không có lý do nào [0]. $('.myClass', ct);hoặc nếu bạn biết ct là một phiên bản của jQuery, bạn có thể sử dụng findct.find(".myClass")
gradbot

62

Không sử dụng bộ chọn lớp trần, như thế này:

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

Điều này cuối cùng sẽ xem xét từng yếu tố để xem liệu nó có một lớp "nút" hay không.

Thay vào đó, bạn có thể giúp nó ra, như:

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

Tôi đã học được điều này năm ngoái từ blog của Rebecca Murphy

Cập nhật - Câu trả lời này đã được đưa ra hơn 2 năm trước và không chính xác cho phiên bản hiện tại của jQuery. Một trong những ý kiến ​​bao gồm một bài kiểm tra để chứng minh điều này. Ngoài ra còn có một phiên bản cập nhật của bài kiểm tra bao gồm phiên bản jQuery tại thời điểm trả lời này.


6
Tôi cũng có ấn tượng rằng điều ngược lại là đúng. Có lẽ đây là trường hợp trong các trình duyệt không triển khai getElementsByClassName, nhưng nếu không, bạn chỉ cần cung cấp cho jQuery nhiều công việc hơn để làm. Tôi rất muốn thấy Rebecca đăng một số điểm chuẩn :)
Alex Barrett

7
Bạn đang GIẢM số lượng công việc phải làm. Nó giống như nói với ai đó lấy vớ của bạn ra khỏi ngăn kéo trong tủ quần áo của bạn thay vì bảo họ lấy vớ ra khỏi phòng của bạn. Giảm số lượng 'tìm kiếm' mà nó phải làm đáng kể.
Lén lút

4
Điều ngược lại là đúng khi bạn đang viết CSS (ít nhất là bao gồm thẻ phần tử). Xem code.google.com/speed/page-speed/docs/
Lần

7
@Sneakyness Không phải mọi thứ đều có sự tương đồng chính xác của cuộc sống thực. Ví dụ, $('.b')có thể sử dụng document.getElementsByClassName('b')nếu trình duyệt hỗ trợ nó, nhưng thực hiện $('a.b')sẽ khiến nó nhận được tất cả các yếu tố phù hợp với lớp bvà sau đó xác nhận chúng là các neo trong hoạt động hai giai đoạn. Cái sau có vẻ như làm việc nhiều hơn với tôi. Đối với một sự tương tự trong cuộc sống thực, hãy thử điều này: Tìm tất cả các vớ trong phòng của tôi. Bây giờ, ném ra những cái không có trong tủ quần áo của tôi.
alex

2
Tôi tin rằng quan niệm sai lầm về các công cụ chọn là do trong các phiên bản cũ của jquery, việc làm $ ('# foo') nhanh hơn là $ ('div # foo'), vì theo định nghĩa, id là duy nhất. Tuy nhiên, tôi khá chắc chắn rằng điều này đã được sửa trong các bản phát hành sau, nhưng khuyến nghị đó chỉ áp dụng cho id chứ không phải các loại bộ chọn khác
Alex Heyd

35

Cố gắng tách ra các chức năng ẩn danh để bạn có thể sử dụng lại chúng.

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

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

$('#div').click( divClickFn );

19
Tôi nghĩ rằng điều này áp dụng cho cùng một mức độ mà mã đồng bộ (nội tuyến) nên được chia thành các hàm được đặt tên. Nếu bạn đã có một đoạn mã đang cầu xin được đặt tên, thì hãy tìm nó. Nhưng đừng di chuyển mã ra khỏi dòng đơn giản chỉ vì bạn đang bọc nó bên trong một hàm; chức năng ẩn danh tồn tại vì lý do tốt.
Dan Breslau

4
Thật ra tôi thích đặt 'tên' cho chức năng của mình. Nó rất hữu ích khi bạn gỡ lỗi mã và thay vì nhìn thấy một danh sách vô tận các hàm ẩn danh, bạn thấy các hàm được đặt tên đúng.
SolutionYogi

1
Quan điểm của bạn được thực hiện tốt, và có lẽ tôi đã bị vấp ngã bởi điều này một vài lần. Mặc dù vậy, " gần bằng cấp" vẫn hoạt động với tôi.
Dan Breslau

1
đặc biệt nếu sự ràng buộc đang xảy ra trong một vòng lặp!
daniellmb

Các chức năng được đặt tên cũng có lợi cho bạn khi gỡ lỗi; không có gì tệ hơn là nhìn vào một callstack sâu 8 cấp mà không có gì ngoài (anonymous). Đọc thêm về mẹo này tại đây: stackoverflow.com/questions/182630/jquery-tips-and-tricks/
ken

34
  • Tránh lạm dụng tài liệu đã sẵn sàng.
  • Giữ tài liệu sẵn sàng chỉ để khởi tạo mã.
  • Luôn trích xuất các chức năng bên ngoài tài liệu sẵn sàng để chúng có thể được sử dụng lại.

Tôi đã thấy hàng trăm dòng mã bên trong câu lệnh sẵn sàng doc. Xấu xí, không thể đọc được và không thể duy trì.


6
+1. Nói chung, hầu hết các mã jQuery tôi đã thấy sử dụng các hàm với hàng trăm dòng. Tôi không biết tại sao 'Nhà phát triển jQuery' không thích sử dụng các hàm nhỏ hơn.
SolutionYogi

6
@SolutionYogi vì hầu hết chỉ là Noobs?
adamJLev

Tôi hoàn toàn không sẵn sàng đưa các chức năng rất dài vào tài liệu, đó là lời khuyên tốt. Tuy nhiên, thực hiện nhiều chức năng thành phần nhỏ được chạy từ chức năng bao quát không có sẵn trong tài liệu không nhất thiết phải là cách thực hành tốt nhất. Nếu chức năng bao trùm là chức năng duy nhất sử dụng các đoạn mã đó thì tốt hơn hết bạn nên đặt tất cả vào một chức năng ngay cả khi khó đọc hơn. Các chức năng gọi điện có rất nhiều chi phí và nếu bạn chỉ sử dụng mã trong một ngữ cảnh thì nên tránh.
sage88

34

Trong khi sử dụng $.ajaxchức năng cho các yêu cầu Ajax tới máy chủ, bạn nên tránh sử dụng completesự kiện để xử lý dữ liệu phản hồi. Nó sẽ kích hoạt cho dù yêu cầu có thành công hay không.

Thay vì complete sử dụngsuccess .

Xem các sự kiện Ajax trong các tài liệu.


1
Tôi đã trở lại và thành công so với hoàn thành, bạn có thể mở rộng lý do tại sao bạn nghĩ hoàn thành là tốt hơn không?
Neil N

1
Tôi không nói hoàn thành là tốt hơn. Điều tôi đã cố gắng nói là bạn cần tránh sử dụng sai hoàn toàn và nên sử dụng thành công để có thể xử lý dữ liệu phản hồi.
Artem Barger

2
Vâng, nó luôn luôn được gọi. Tuy nhiên tôi sẽ không đồng ý. Hoàn thành là tốt nhất để ẩn gif tải, v.v. Bạn nên sử dụng thành công để xử lý phản hồi và lỗi cho bất kỳ lỗi nào trong khóa học.
redsapes

1
Ông đang đề nghị sử dụng thành công thay vì hoàn thành. 'hoàn thành' luôn luôn kích hoạt khi yêu cầu ajax là 'hoàn thành', không thành vấn đề khi nó hoàn thành thành công hay không thành công.
SolutionYogi

@redsapes, bạn có thể mở rộng về điều đó chính xác mà bạn không đồng ý không? Tôi đã đề cập đến quá trình dữ liệu và không bận tâm đến bất kỳ hình ảnh nào ẩn / hiển thị các cơ hội mà bạn có với trình xử lý hoàn chỉnh.
Artem Barger

24

"Chuỗi" Hoạt hình - sự kiện với Callbacks.

Giả sử bạn muốn làm động một đoạn biến mất khi nhấp vào nó. Bạn cũng muốn xóa phần tử khỏi DOM sau đó. Bạn có thể nghĩ rằng bạn có thể đơn giản xâu chuỗi các phương thức:

$("p").click(function(e) {
  $(this).fadeOut("slow").remove();
});

Trong ví dụ này, .remove () sẽ được gọi trước khi .fadeOut () hoàn thành, phá hủy hiệu ứng mờ dần của bạn và chỉ cần làm cho phần tử biến mất ngay lập tức. Thay vào đó, khi bạn chỉ muốn thực hiện một lệnh khi hoàn thành lệnh trước đó, hãy sử dụng lệnh gọi lại:

$("p").click(function(e){
  $(this).fadeOut("slow", function(){
    $(this).remove();
  });
});

Tham số thứ hai của .fadeOut () là một hàm ẩn danh sẽ chạy sau khi hoạt ảnh .fadeOut () hoàn thành. Điều này làm cho sự mờ dần dần và loại bỏ phần tử tiếp theo.


24

Nếu bạn liên kết () cùng một sự kiện nhiều lần, nó sẽ bắn nhiều lần. Tôi thường luôn đi unbind('click').bind('click')chỉ để được an toàn


2
Điều này không cụ thể đối với jQuery, mặc dù điều quan trọng cần ghi nhớ.
SolutionYogi

11
Bạn có thể sử dụng các sự kiện trực tiếp để không phải liên kết cùng một sự kiện hai lần.
Powerlord

sống có vấn đề (hiệu suất) riêng nếu sử dụng quá mức. Tốt hơn trong 1.3.3 nơi bạn có thể đưa ra bối cảnh.
redsapes

23

Đừng lạm dụng trình cắm.

Hầu hết thời gian bạn sẽ chỉ cần thư viện và có thể giao diện người dùng. Nếu bạn giữ nó đơn giản, mã của bạn sẽ được duy trì trong thời gian dài. Không phải tất cả các trình cắm đều được hỗ trợ và bảo trì, thực tế hầu hết là không. Nếu bạn có thể bắt chước chức năng bằng các yếu tố cốt lõi, tôi thực sự khuyên bạn nên sử dụng nó.

Các plugin dễ dàng chèn mã của bạn, giúp bạn tiết kiệm thời gian, nhưng khi bạn cần thêm một thứ gì đó, thì việc sửa đổi chúng là một ý tưởng tồi, vì bạn mất các bản cập nhật có thể. Thời gian bạn tiết kiệm khi bắt đầu, bạn sẽ mất dần sau khi thay đổi các plugin không dùng nữa.

Chọn các plugin bạn sử dụng một cách khôn ngoan. Ngoài thư viện và giao diện người dùng, tôi liên tục sử dụng $ .cookie , $ .form , $ .validatethickbox . Đối với phần còn lại, tôi chủ yếu phát triển các trình cắm riêng của mình.


2
Còn lưới thì sao? Bạn làm cho riêng mình?
jmav

Đúng. từ dự án đến dữ liệu dự án đến theo nhiều cách khác nhau. Tôi thích có toàn quyền kiểm soát rằng nhận ra lưới đó chỉ giúp tôi ở giữa và sau đó tôi phải ứng biến.
Elzo Valugi

NẾU {đã cho đủ thời gian, nói chung tôi thích viết trực tiếp tất cả các mã điều khiển dữ liệu (css / html). nói cách khác - không chuyển dữ liệu đến một 'plugin' và hãy sử dụng html. đủ khó để đánh giá các plugin (tiền vệ của) về khả năng tương thích phạm vi hiện tại, quên đi các yêu cầu trong tương lai. nghĩ rằng ... nhà thiết kế, nhà quy hoạch, nhà quản lý, nhà quản lý, nhà quản lý. oh và khách hàng và người dùng. nhưng nếu bạn có tất cả những điều đó, bạn sẽ không có đủ thời gian để nói "thời gian". Vì vậy, chỉ cần sử dụng jqgrid đã được - bạn đang lãng phí thời gian cân nhắc. đã xong chưa?}
user406905

22

Cạm bẫy: Sử dụng các vòng lặp thay vì bộ chọn.

Nếu bạn thấy mình đang tiếp cận phương thức '.each' của jQuery để lặp lại các phần tử DOM, hãy tự hỏi mình có thể sử dụng bộ chọn để lấy các phần tử thay thế không.

Thông tin thêm về bộ chọn jQuery:
http://docs.jquery.com/Selector

Cạm bẫy: KHÔNG sử dụng một công cụ như Fireorms

Fireorms thực tế đã được thực hiện cho loại gỡ lỗi này. Nếu bạn đang tìm hiểu về DOM bằng Javascript, bạn cần một công cụ tốt như Fireorms để cung cấp cho bạn khả năng hiển thị.

Thông tin thêm về Fireorms: http://getfireorms.com/

Những ý tưởng tuyệt vời khác nằm trong tập phim này của Podcast đa hình: (Bí mật jQuery với Dave Ward) http://polymorphicpodcast.com/shows/jquery/


1
Tôi đã thực hiện lần đầu tiên nhiều lần. Bạn chỉ cần nhớ rằng hầu hết các hàm jQuery sẽ hoạt động trên tất cả các phần tử được trả về từ bộ chọn.
DisgruntledGoat

Không thích phương pháp .each phải trung thực
Simon Hayter

14

Hiểu lầm về việc sử dụng định danh này trong bối cảnh phù hợp. Ví dụ:

$( "#first_element").click( function( event)
{
   $(this).method( ); //referring to first_element
   $(".listOfElements").each( function()
   {
      $(this).someMethod( ); // here 'this' is not referring first_element anymore.
   })
});

Và đây là một trong những mẫu làm thế nào bạn có thể giải quyết nó:

$( "#first_element").click( function( event)
{
   $(this).method( ); //referring to first_element
   var $that = this;
   $(".listOfElements").each( function()
   {
      $that.someMethod( ); // here 'that' is referring to first_element still.
   })
});

1
+1 Nhiều vấn đề javascript hơn là một vấn đề jquery, nhưng tôi đã từng gặp phải vấn đề này rất nhiều.
mmacaulay

13

Tránh tìm kiếm trong toàn bộ DOM nhiều lần. Đây là một cái gì đó thực sự có thể trì hoãn kịch bản của bạn.

Xấu:

$(".aclass").this();
$(".aclass").that();
...

Tốt

$(".aclass").this().that();

Xấu:

$("#form .text").this();
$("#form .int").that();
$("#form .choice").method();

Tốt

$("#form")
    .find(".text").this().end()
    .find(".int").that().end()
    .find(".choice").method();

2
$ (". aclass"). this (). that (); không tốt! bộ chọn chỉ lớp là chậm
redsapes

Đây là một ví dụ minh họa cho thấy khả năng của Jquery sử dụng một số phương pháp trên một lựa chọn. Tôi đã thực hiện lựa chọn đơn giản (và do đó chậm) để tập trung nhiều hơn vào kỹ thuật này.
googletorp

10
Mặc dù tránh tìm kiếm DOM nhiều lần là một điều tốt - ví dụ cuối cùng là một mớ hỗn độn không thể đọc được mà tôi không biết chuyện gì đang xảy ra. Nếu bạn có kế hoạch sử dụng kết quả tìm nạp nhiều lần, hãy lưu trữ nó trong một biến. Nó làm cho mã dễ bảo trì hơn nhiều.
Quentin

12

Luôn lưu trữ $ (cái này) vào một biến có ý nghĩa, đặc biệt là trong .each ()

Như thế này

$(selector).each(function () {
    var eachOf_X_loop = $(this); 
})

12
Sử dụng $selfhoặc $thisnếu bạn quá lười biếng để nghĩ ra một tên biến tốt.
gradbot

10

Tương tự như những gì Repo Man nói, nhưng không hoàn toàn.

Khi phát triển winforms ASP.NET, tôi thường làm

$('<%= Label1.ClientID %>');

quên dấu #. Hình thức đúng là

$('#<%= Label1.ClientID %>');

10

Sự kiện

$("selector").html($("another-selector").html());

không sao chép bất kỳ sự kiện nào - bạn phải buộc lại tất cả.

Theo commen t - clone () của JP sẽ khởi động lại các sự kiện nếu bạn vượt qua sự thật.


4
Clone () làm nếu bạn vượt qua đúng.
James

Điều gì về live () trong jQuery 1.3.2?
jmav

9

Tránh tạo nhiều đối tượng jQuery giống nhau

//Avoid
function someFunc(){
   $(this).fadeIn();
   $(this).fadeIn();
}

//Cache the obj
function someFunc(){
   var $this = $(this).fadeIn();
   $this.fadeIn();
}

var $ this = $ (this) .fadeIn ();? bạn đang lưu trữ một hiệu ứng?
Jason

12
Nó trả về phần tử, Nó được gọi là chuỗi!
redsapes

bạn có thể thiết lập một biến và thực hiện một hành động trên nó cùng một lúc?
Jason

1
Thật vậy, nhưng không lấy lời của tôi cho nó. Thử nó. Làm thế nào để bạn nghĩ rằng sau đây là có thể nếu đối tượng jquery đại diện cho phần tử không được trả lại? $ ('# divId'). Hide (). show (). fadeIn () .... vv
redsapes

14
Điều đó hoạt động, nhưng tôi nghĩ rằng nó dễ đọc hơn $this = $(this);trên một dòng riêng biệt. Nếu bạn có thể (không gây rối), hãy quên đi $thisvà xâu chuỗi mọi thứ:$(this).fadeIn().fadeIn();
Patrick McElhaney

8

Tôi cũng nói điều này với JavaScript, nhưng jQuery, JavaScript KHÔNG BAO GIỜ nên thay thế CSS.

Ngoài ra, hãy đảm bảo rằng trang web có thể sử dụng được đối với người đã tắt JavaScript (không liên quan đến ngày hôm nay như ngày trước, nhưng luôn luôn tốt để có một trang web hoàn toàn có thể sử dụng được).


6

Làm quá nhiều thao tác DOM. Mặc dù các phương thức .html (), .append (), .prepend (), v.v. rất tuyệt vời, do cách trình duyệt kết xuất và kết xuất lại các trang, sử dụng chúng quá thường xuyên sẽ gây ra chậm. Thường thì tốt hơn là tạo html dưới dạng chuỗi và đưa nó vào DOM một lần, thay vì thay đổi DOM nhiều lần.

Thay vì:

var $parent = $('#parent');
var iterations = 10;

for (var i = 0; i < iterations; i++){
    var $div = $('<div class="foo-' + i + '" />');
    $parent.append($div);
}

Thử cái này:

var $parent = $('#parent');
var iterations = 10;
var html = '';

for (var i = 0; i < iterations; i++){
    html += '<div class="foo-' + i + '"></div>';
}

$parent.append(html);

Hoặc thậm chí điều này ($ Wrapper là một phần tử mới được tạo chưa được đưa vào DOM. Việc thêm các nút vào div trình bao bọc này không gây ra sự chậm lại và cuối cùng, chúng tôi sẽ thêm $ Wrapper vào $ Parent, chỉ sử dụng một thao tác DOM ):

var $parent = $('#parent');
var $wrapper = $('<div class="wrapper" />');
var iterations = 10;

for (var i = 0; i < iterations; i++){
    var $div = $('<div class="foo-' + i + '" />');
    $wrapper.append($div);
}

$parent.append($wrapper);

+1 ... Tôi đang sử dụng .html () trên nhiều yếu tố mỗi giây. Nhận thấy nó bắt đầu làm chậm mọi thứ!
dùng2

5

Sử dụng ClientID để lấy id "thực" của điều khiển trong các dự án ASP.NET.

jQuery('#<%=myLabel.ClientID%>');

Ngoài ra, nếu bạn đang sử dụng jQuery trong SharePoint, bạn phải gọi jQuery.noConflict ().


11
? Làm thế nào đây là một cạm bẫy? Đó là một cách giải quyết cho hành vi ASP.NET.
SolutionYogi

1
Vâng. Đây không phải là vấn đề của jQuery. Đó là một lỗi của các biểu mẫu web asp.net.
redsapes

3
Đã đồng ý. Nhưng đây là điều bạn cần lưu ý khi sử dụng jQuery trong ASP.NET.
Giải pháp dữ liệu Jacobs

2
OP đã không đề cập đến asp.net
redsapes

4

Truyền ID thay vì các đối tượng jQuery cho các hàm:

myFunc = function(id) { // wrong!
    var selector = $("#" + id);
    selector.doStuff();
}

myFunc("someId");

Vượt qua một bộ bọc là linh hoạt hơn nhiều:

myFunc = function(elements) {
    elements.doStuff();
}

myFunc($("#someId")); // or myFunc($(".someClass")); etc.

3

Sử dụng quá nhiều chuỗi.

Xem cái này:

this.buttonNext[n ? 'bind' : 'unbind'](this.options.buttonNextEvent, this.funcNext)[n ? 'removeClass' : 'addClass'](this.className('jcarousel-next-disabled')).attr('disabled', n ? false : true);

Giải trình


1
Trông thật buồn cười, đó là một kiểu xáo trộn.
Dykam

6
Xâu chuỗi (tự nó) rất khó sử dụng 'vượt quá'. Có vẻ như mã đó sử dụng quá nhiều toán tử ternary javascript. Xem en.wikipedia.org/wiki/Ternary_operation#JavaScript để biết thêm thông tin.
Dan Esparza

3
Tôi rất vui vì tôi không phải duy trì mã của bạn.
cdmckay

3

Sử dụng kiểu tích lũy chuỗi

Sử dụng toán tử +, một chuỗi mới được tạo trong bộ nhớ và giá trị được nối được gán cho nó. Chỉ sau đó, kết quả được gán cho một biến. Để tránh biến trung gian cho kết quả nối, bạn có thể gán trực tiếp kết quả bằng toán tử + =. Chậm:

a += 'x' + 'y';

Nhanh hơn:

a += 'x';
a += 'y';

Các hoạt động nguyên thủy có thể nhanh hơn các cuộc gọi chức năng

Xem xét sử dụng hoạt động nguyên thủy thay thế cho các lệnh gọi hàm trong các vòng lặp và các hàm quan trọng về hiệu năng. Chậm:

var min = Math.min(a, b);
arr.push(val);

Nhanh hơn:

var min = a < b ? a : b;
arr[arr.length] = val;

Đọc thêm tại Thực tiễn tốt nhất về hiệu suất JavaScript


1

Nếu bạn muốn người dùng thấy các thực thể html trong trình duyệt của họ, hãy sử dụng 'html' thay vì 'text' để thêm chuỗi Unicode, như:

$('p').html("Your Unicode string")

1

theo quan điểm của tôi)

Thông thường, làm việc với jquery có nghĩa là bạn không phải lo lắng về các yếu tố DOM thực tế mọi lúc. Bạn có thể viết một cái gì đó như thế này $('div.mine').addClass('someClass').bind('click', function(){alert('lalala')})- và mã này sẽ thực thi mà không gây ra bất kỳ lỗi nào.

Trong một số trường hợp, điều này rất hữu ích, trong một số trường hợp - hoàn toàn không, nhưng thực tế là jquery có xu hướng, tốt, thân thiện với các trận đấu trống. Chưa,replaceWith sẽ đưa ra một lỗi nếu một người cố gắng sử dụng nó với một yếu tố không thuộc về tài liệu. Tôi thấy nó khá phản trực giác.

Một cạm bẫy khác là, theo ý kiến ​​của tôi, thứ tự các nút được trả về bởi phương thức prosAll () - $('<div><span class="A"/><span class="B"/><span class="C"/><span class="D"/></div>').find('span:last-child').prevAll(). Thực sự không phải là một vấn đề lớn, nhưng chúng ta nên ghi nhớ thực tế này.


0

Nếu bạn có kế hoạch với Ajax trong nhiều dữ liệu, như giả sử, 1500 hàng của một bảng có 20 cột, thì bạn thậm chí không nghĩ đến việc sử dụng jQuery để chèn dữ liệu đó vào HTML của mình. Sử dụng JavaScript đơn giản. jQuery sẽ quá chậm trên các máy chậm hơn.

Ngoài ra, một nửa thời gian jQuery sẽ làm những việc sẽ khiến nó chậm hơn, như cố gắng phân tích các thẻ script trong HTML đến và xử lý các yêu cầu của trình duyệt. Nếu bạn muốn tốc độ chèn nhanh, hãy sử dụng JavaScript đơn giản.


1
-1 Hàm .html () cũng nhanh như cách tiếp cận gốc
cllpse

tất cả những người đang hạ thấp tôi rõ ràng đã không thử chèn một tấn DOM trên IE và xem mọi thứ trở nên chậm chạp. Lý do jquery chậm là vì nó sẽ không chỉ đơn giản là chèn dom, nó còn làm một số thứ khác, như kiểm tra xem dom có ​​tập lệnh hay không và thực thi chúng nếu trong IE và một số thứ khác mà bạn không cần phải làm nếu bạn biết chính xác bạn đang chèn loại dữ liệu nào
mkoryak

1
Miễn là bạn không cần phải lo lắng về rò rỉ trình duyệt và như vậy, .innerHTMLsẽ làm được. Nhưng nếu bạn đang xây dựng một cái gì đó như Gmail nơi người dùng giữ tab mở trong nhiều giờ, bạn sẽ phải cắn viên đạn và đối phó với sự chậm chạp thêm. Đối với người tò mò, đây chính xác là những gì jQuery .html()làm: james.padolsey.com/jquery/#v=1.4&fn=jQuery.fn.html
adamJLev

-1

Sử dụng jQuery trong một dự án nhỏ có thể được hoàn thành chỉ bằng một vài dòng JavaScript thông thường.


Tôi không ngại bị sửa đổi, nhưng xin vui lòng tranh luận về sự lựa chọn của bạn.
vise

8
-1 jQuery trừu tượng hóa một API bị hỏng. Bằng cách này, bạn luôn chắc chắn rằng mã của bạn đang làm việc. Giả sử bạn đã viết một số mã bằng jQuery và một số lỗi trình duyệt ngẫu nhiên được giới thiệu với một phiên bản mới - tất cả những gì bạn cần làm là nhập một phiên bản cập nhật của khung jQuery. Versus phải tự tìm ra cách giải quyết lỗi.
cllpse

+1 có vẻ hợp lý với tôi - nếu bạn chỉ sử dụng một vài dòng, hãy sử dụng vanilla JS.
alex

1
@roosteronacid, lập luận của bạn bỏ lỡ vấn đề. Rất khó để trình duyệt đưa ra hồi quy trong một tập lệnh có độ phức tạp thấp hơn hoặc xử lý các vấn đề lai tạo cho vấn đề đó. Hai năm trước tôi đã làm việc với mootool và trong một tình huống nhất định, nó không thể đọc nội dung các yếu tố trên IE. Sau vài giờ cố gắng tìm ra vấn đề, tôi chỉ viết lại phần đó với js đơn giản. Vì vậy, thực sự nhiều khả năng jQuery bị hỏng thay vì javascript đơn giản bị lỗi do nâng cấp trình duyệt. Tôi sẽ tự khắc phục lỗi bất cứ ngày nào thay vì hack thông qua mã thư viện.
vise

3
couple of lines of ordinary JavaScriptChắc chắn không có vấn đề. Nhưng khi nào thì nó chỉ như vậy? Những người nói "tại sao không sử dụng javilla javascript ??" Chưa bị IE cắn đủ mạnh ... và chưa kể đến việc bạn phải viết bao nhiêu mã hành trình và mã nồi hơi để làm những việc đơn giản trong JS cũ đơn giản.
adamJLev

-3

Không hiểu ràng buộc sự kiện. JavaScript và jQuery hoạt động khác nhau.

Theo nhu cầu phổ biến, một ví dụ:

Trong jQuery:

$("#someLink").click(function(){//do something});

Không có jQuery:

<a id="someLink" href="page.html" onClick="SomeClickFunction(this)">Link</a>
<script type="text/javascript">
SomeClickFunction(item){
    //do something
}
</script>

Về cơ bản, các hook cần thiết cho JavaScript không còn cần thiết nữa. Tức là sử dụng đánh dấu nội tuyến (onClick, v.v.) vì bạn chỉ có thể sử dụng ID và các lớp mà nhà phát triển thường sử dụng cho mục đích CSS.


5
Quan tâm đến công phu? Tốt nhất là một ví dụ?
SolutionYogi

7
JavaScript không cung cấp addEventListener () và AttachEvent () để làm điều này sao?
alex

2
chia ly mối quan tâm, người đàn ông. Giữ riêng HTML và JS của bạn
Don
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.