JQuery के प्रत्येक पुनरावृत्ति के बीच विराम कैसे जोड़ें?


81

मैं jQuery वस्तुओं की एक सरणी ले रहा हूँ और फिर .each () के साथ सरणी में प्रत्येक व्यक्ति jquery को संशोधित कर रहा हूं।

इस मामले में, मैं एक वर्ग संक्रमण का उपयोग करने के लिए एक -webkit- संक्रमण-संपत्ति को ट्रिगर करने के लिए वर्ग के नाम अद्यतन किया जाता है।

मैं चाहता हूं कि प्रत्येक सीएसएस संक्रमण शुरू होने से पहले एक ठहराव हो। मैं निम्नलिखित का उपयोग कर रहा हूं, लेकिन प्रत्येक अपडेट के बीच में कोई देरी नहीं है। इसके बजाय, वे सभी एक ही बार में अपडेट होते दिखाई देते हैं।

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

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

मैं उम्मीद कर रहा था कि setTimeout इसे हल करेगा, लेकिन यह काम नहीं कर रहा है। क्या प्रत्येक ऑब्जेक्ट के प्रत्येक CLASS नाम अपडेट से पहले ठहराव को पूरा करने का एक तरीका है?


AddPositioningClass फ़ंक्शन के आस-पास के उद्धरणों का उपयोग करने का प्रयास करें, जैसे: setTimeout ('addPositioningClass ($ (यह))', 500)
amosrivera

1
क्या आप प्रत्येक पुनरावृत्ति के लिए टाइमआउट बढ़ा सकते हैं 500,1000,1500 ...
रोब

जवाबों:


96

मैंने इसे एक टिप्पणी के रूप में जोड़ा है लेकिन अब जब मैंने इसे सही ढंग से पढ़ा है और अपने स्वयं के प्रश्न का उत्तर दिया है तो यह शायद काम करेगा:

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

  var time = 500;

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

1
आपका कोड ओपी से अलग कैसे है? एक गुंजाइश त्रुटि है क्योंकि addPositioningClassessetTimeout
JohnP

@ जॉन - @DA बताता है कि कोड काम करता है लेकिन यह कि सभी तत्व एक ही समय पर तैनात हैं, मुझे पता नहीं था कि फ़ंक्शन का दायरा समस्या का हिस्सा था ...
Rob

1
मैं सिर्फ एक बेला में यह कोशिश की और यह काम नहीं करता है। मुझसे गलती हो सकती है, लेकिन मैं यह नहीं देख सकता कि वह कोड कैसे काम कर सकता है।
जॉन

2
@ जॉन - @DA ने कहा -> "मैं निम्नलिखित का उपयोग कर रहा हूं, लेकिन प्रत्येक अपडेट के बीच में कोई देरी नहीं है। इसके बजाय, वे सभी एक बार में अपडेट करते दिखाई देते हैं।"
रोब

2
समाधान: जो इस Git में भी मौजूद है: gist.github.com/Zackio/7648481
प्राणेश

49

एक पुराने धागे को खोदने के लिए क्षमा करें, लेकिन यह टिप समान मुद्दों के लिए उपयोगी हो सकती है:

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

6
खबरदार जो delayकेवल एनीमेशन कतार और अभ्यस्त काम के लिए होता है, उदाहरण के लिए css()( यहां देखें )
यान फोटो

20
आपको देरी होने पर .queue()(और .dequeue()) का उपयोग करना होगा .addClass():$(this).delay(500*index).queue(function() { $(this).children('.flipcontainer').addClass('visible').dequeue(); });
aksu

1
@aksu आपको अपने पास मौजूद चीज़ों की नकल करनी चाहिए और उसे एक उत्तर में बनाना चाहिए, क्योंकि यह टिप्पणियों के बीच खो गया है और आपके उत्तर ने मुझे इसे ठीक से काम करने में मदद की है।
adjj

10

यदि आप एक विधि बनाते हैं जो हर 500 एमएस को कॉल करता है जो उस चाल को करना चाहिए। निम्नलिखित कोड काम करना चाहिए।

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)
    }
}

फिडल पर परीक्षण किया गया: http://jsfiddle.net/jomanlk/haGfU/


मुझे जांच करने की आवश्यकता है। पश () कुछ और। मैं उस के बारे में पता नहीं था!
डीए।

3

कैसे के बारे में .delay () ?

या

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

मुझे हमेशा आश्चर्य होता है, लेकिन आज तक मुझे ऐसा कोई संदर्भ नहीं मिला जहां यह तरीका लागू किया जा सके।
सैंडविच

3
मैं जो बता सकता हूं, उसमें देरी () केवल jQuery एनिमेशन पर लागू होती है।
डीए।

1

यदि आप केवल सफारी / iOS को लक्षित कर रहे हैं, तो यह निर्भर करता है कि एनीमेशन अनुक्रमों के सटीक समय को नियंत्रित करने के लिए आपके लिए कितना महत्वपूर्ण है, आपको शायद किसी भी समाधान से बचना चाहिए जिसमें JS टाइमआउट शामिल हैं। इस बात की कोई गारंटी नहीं है कि एनीमेशन समयबाह्य देरी के रूप में एक ही समय में पूरा होगा, विशेष रूप से धीमे प्रोसेसर या मशीनों पर जो पृष्ठभूमि में बहुत सारे सामान चल रहे हैं। वेबकिट के बाद के संस्करणों (मोबाइल सफारी सहित) के माध्यम से समयबद्ध एनीमेशन दृश्यों के लिए अनुमति देते हैं @-webkit-keyframes। Webkit.org के पास एक अच्छा परिचय है । यह वास्तव में लागू करने के लिए बहुत आसान है।


मैं वास्तव में केवल iOS (यह एक ऐप है) को लक्षित कर रहा हूं। मैं एनीमेशन अनुक्रम को टाइम नहीं कर रहा हूं, बल्कि, क्लास टाइम नाम को अपडेट करने के लिए कितनी देर तक इंतजार करना है, जो तब बदले में, एक वेबकिट संक्रमण सीएसएस को ट्रिगर करता है।
डीए।

1

इसे आजमाइए:

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

मैं ईमानदार रहूंगा ... मेरे पास $ (यह) है। (कुछ) अतीत में कुछ मामलों में दुर्व्यवहार किया गया है और दूसरों में दोषरहित काम किया है। हालांकि, यह सामान्य रूप से jQuery एनीमेशन कॉल के साथ संयोजन में था, DOM विशेषता हेरफेर नहीं।

कृपया अवगत रहें .delay () setTimeout के समान कार्य नहीं करता है। अधिक जानकारी के लिए, jQuery .delay () प्रलेखन देखें

जहां तक ​​मुझे जानकारी है, $ () प्रत्येक प्रक्रियात्मक रूप से निष्पादित करता है इसलिए कॉल का अगला पुनरावृत्ति पूर्ववर्ती पूरा होने के बाद ही शुरू होना चाहिए।


मैं गलत हो सकता हूं, लेकिन jquery के दस्तावेज़ीकरण को पढ़ने में, यह धीमा लग रहा है कि देरी केवल jQuery एनिमेशन में देरी के लिए है। मुझे लगता है कि आप उस अंतिम पैराग्राफ में भी सही हैं। बात यह थी कि मैं फंक्शन कॉल में देरी नहीं कर रहा था जो क्लास सेट कर रहा था, बल्कि मैं क्लास सेट होने पर देरी कर रहा था। इसलिए, इसने एक ही समय में सभी 30 तत्वों में देरी को लागू किया और सभी ने फिर उसी समय में देरी की।
डीए।

0

इस की जाँच करें, मेरे लिए अच्छी तरह से काम किया! :)

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

-2

यह कोड 50 मिनट के लिए इनबिल्ट विलंब सेट करेगा। फिर ".row" वर्ग के माध्यम से प्रत्येक लूप के लिए यह अतिरिक्त 200ms देरी जोड़ देगा। यह प्रत्येक पंक्ति के लिए एक अच्छा विलंबित शो प्रभाव पैदा करेगा।

$( 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
यह सबसे अच्छा है अगर आप कुछ कमेंट्री जोड़ते हैं और न कि सिर्फ कोड आउट करते हैं।
woot
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.