Làm cách nào để thêm khoảng dừng giữa mỗi lần lặp lại của jQuery .each ()?


81

Tôi lấy một mảng các đối tượng jQuery và sau đó thông qua .each () sửa đổi từng jquery riêng lẻ với trong mảng.

Trong trường hợp này, tôi đã cập nhật tên lớp để kích hoạt thuộc tính -webkit-chuyển đổi-để sử dụng chuyển đổi css.

Tôi muốn tạm dừng trước khi mỗi quá trình chuyển đổi css bắt đầu. Tôi đang sử dụng phần mềm sau, nhưng không có độ trễ giữa mỗi lần cập nhật. Thay vào đó, tất cả chúng dường như đang cập nhật cùng một lúc.

function positionCards() {
  $cards = $('#gameboard .card');
  $cards.each(function() {
      setTimeout( function(){ addPositioningClass($(this)); }, 500 )
  });
}

function addPositioningClasses($card){
  $card
    .addClass('position')
}

Tôi đã hy vọng setTimeout sẽ giải quyết được điều này, nhưng có vẻ như nó không hoạt động. Có cách nào để thực hiện tạm dừng trước mỗi lần cập nhật tên CLASS của từng đối tượng không?


hãy thử sử dụng dấu ngoặc kép quanh chức năng addPositioningClass, như thế này: setTimeout ( 'addPositioningClass ($ (this))', 500)
amosrivera

1
bạn có thể tăng thời gian chờ cho mỗi lần lặp lại là 500,1000,1500 ...
Rob

Câu trả lời:


96

Tôi đã thêm điều này dưới dạng nhận xét nhưng bây giờ tôi đã đọc nó một cách chính xác và trả lời câu hỏi của riêng tôi, điều này có thể sẽ hoạt động:

function positionCards() {
  var $cards = $('#gameboard .card');

  var time = 500;

  $cards.each(function() {
      setTimeout( function(){ addPositioningClass($(this)); }, time)
      time += 500;
  });
}

1
Làm thế nào là mã của bạn bất kỳ khác với OP? Có lỗi phạm vi vì addPositioningClasseskhông tồn tại trong ngữ cảnhsetTimeout
JohnP

@JohnP - @DA khẳng định rằng các công trình mã nhưng mà tất cả các yếu tố được định vị cùng một lúc, tôi đã không biết rằng phạm vi của hàm là một phần của vấn đề ...
Rob

1
Tôi chỉ thử nó trong một lần và nó không hoạt động. Tôi có thể nhầm, nhưng tôi không thể thấy mã đó có thể hoạt động như thế nào.
JohnP

2
@JohnP - @DA cho biết -> "Tôi đang sử dụng phần mềm sau, nhưng không có độ trễ giữa mỗi lần cập nhật. Thay vào đó, tất cả chúng dường như đang cập nhật cùng một lúc."
Rob

2
Giải pháp: cũng có trong Git này: gist.github.com/Zackio/7648481
Pranesh Janarthanan

49

Xin lỗi vì đã đào bới một chủ đề cũ, nhưng mẹo này có thể hữu ích cho các vấn đề tương tự:

$cards.each(function(index) {
    $(this).delay(500*index).addClass('position');
});

6
Ghi chú rằng delaycó nghĩa là chỉ dành cho hàng đợi hình ảnh động và sẽ không làm việc trên ví dụ css()(xem ở đây )
Yan Foto

20
Bạn phải sử dụng .queue()(và .dequeue()) khi trì hoãn .addClass():$(this).delay(500*index).queue(function() { $(this).children('.flipcontainer').addClass('visible').dequeue(); });
aksu

1
@aksu Bạn nên sao chép những gì bạn có ở đó và biến nó thành một câu trả lời, vì nó bị mất giữa các bình luận và câu trả lời của bạn đã giúp tôi làm cho nó hoạt động bình thường.
adamj

10

Nếu bạn thực hiện một phương thức tự gọi mỗi 500 ms sẽ thực hiện thủ thuật đó. Đoạn mã sau sẽ hoạt động.

var __OBJECTS = [];

$('#gameboard .card').each(function() {
    __OBJECTS.push($(this));
});

addPositioningClasses();

function addPositioningClasses() {
    var $card = __OBJECTS.pop();
    $card.addClass('position');
    if (__OBJECTS.length) {
        setTimeout(addPositioningClasses, 500)
    }
}

Đã thử nghiệm trên fiddle: http://jsfiddle.net/jomanlk/haGfU/


Tôi cần điều tra thêm .push (). Tôi đã không biết về điều đó!
ĐA.

3

Còn .delay () thì sao?

hoặc là

function addPositioningClasses($card){
  setTimeout(function() { $card.addClass('position')}, 1000);
}

Tôi cũng luôn thắc mắc điều đó, nhưng cho đến ngày nay tôi vẫn chưa tìm ra bối cảnh nào để có thể áp dụng phương pháp này.
Sandwich

3
Từ những gì tôi có thể nói, delay () chỉ áp dụng cho hoạt ảnh jQuery.
ĐA.

1

Nếu bạn chỉ nhắm mục tiêu Safari / iOS, tùy thuộc vào mức độ quan trọng đối với bạn trong việc kiểm soát thời gian chính xác của chuỗi hoạt ảnh, bạn có thể nên tránh bất kỳ giải pháp nào liên quan đến thời gian chờ JS. Không có gì đảm bảo rằng hoạt ảnh sẽ hoàn thành cùng lúc với độ trễ thời gian chờ, đặc biệt là trên bộ xử lý chậm hoặc máy có nhiều nội dung đang diễn ra trong nền. Các phiên bản sau của bộ webkit (bao gồm cả safari trên điện thoại di động) cho phép các chuỗi hoạt ảnh được hẹn giờ thông qua @-webkit-keyframes. Webkit.org có một phần giới thiệu hay về nó . Nó thực sự khá dễ thực hiện.


Tôi thực sự chỉ nhắm mục tiêu iOS (đó là một ứng dụng). Tôi không định thời gian cho chuỗi hoạt ảnh, nhưng đúng hơn là định thời gian chờ đợi cho đến khi cập nhật tên lớp, sau đó, đến lượt nó, sẽ kích hoạt css chuyển đổi bộ web.
ĐA.

1

Hãy thử cái này:

function positionCards() {
  $('#gameboard .card').each(function() {
      $(this).delay(500).addClass('position');
  });
}

Thành thật mà nói ... Tôi đã từng có $ (this) .delay () hoạt động sai trong quá khứ trong một số trường hợp nhất định và làm việc không hoàn hảo với những người khác. Tuy nhiên, điều này thường kết hợp với các lệnh gọi hoạt ảnh jQuery, không phải thao tác thuộc tính DOM.

Xin lưu ý rằng .delay () không hoạt động theo cách giống như setTimeout. Để biết thêm thông tin, hãy xem tài liệu jQuery .delay () .

Theo như tôi được biết, $ (). Mỗi cái thực thi theo thủ tục vì vậy lần lặp tiếp theo của cuộc gọi chỉ nên bắt đầu sau khi phần trước đã hoàn thành.


Tôi có thể sai, nhưng khi đọc tài liệu jquery, có vẻ như sự chậm trễ chỉ dành cho việc trì hoãn hoạt ảnh jQuery. Tôi nghĩ rằng bạn cũng đúng trong đoạn cuối cùng. Vấn đề là tôi đã không trì hoãn lệnh gọi hàm thiết lập lớp, mà đúng hơn là tôi đang trì hoãn khi nào lớp sẽ được thiết lập. Vì vậy, nó đã áp dụng độ trễ cho tất cả 30 phần tử cùng một lúc và sau đó tất cả chúng đều trì hoãn cùng một khoảng thời gian.
ĐA.

0

Kiểm tra này, làm việc tốt cho tôi! :)

jQuery('.optiresultsul li').each(function(index) {
    jQuery(this).delay(500*index).animate({ opacity: 1 }, 500,function(){
        jQuery(this).addClass('bgchecked');
    });
});

-2

Mã này sẽ thêm thiết lập độ trễ inital thành 50ms. Sau đó, đối với mỗi vòng lặp qua lớp ".row", nó sẽ thêm độ trễ 200ms. Điều này sẽ tạo ra hiệu ứng hiển thị trễ đẹp mắt cho mỗi hàng.

$( document ).ready(function() {
    // set inital delay
    var dtotal = 50;
    $(".row").each(function() {
    //add delay to function
      $(this).delay(dtotal).show();
    //add 200ms to delay for each loop
      dtotal = dtotal + 200;
    });
});

6
Tốt nhất là bạn nên thêm một số bình luận và không chỉ quăng mã ra khỏi đó.
woot
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.