jQuery

2012-03-07 6 views
11

में एक विकृत वादा को रद्द करना डीओएम से तत्व को हटाए बिना मैं एक वादा कैसे रद्द कर सकता हूं?jQuery

fiddle

मैं इस कोड भाग गया: इस के बाद

$("#box") 
    .delay(2000) 
    .show("slow") 
    .delay(2000) 
    .promise()        
    .then(function(){log("Done");}); 

, वहाँ वादा रद्द करने के लिए एक तरीका है? clearQueue() और stop(true) दोनों काम नहीं करते थे, क्योंकि यह एक एनीमेशन नहीं है जिसे मैं रद्द करने का प्रयास कर रहा हूं। मैंने देखा कि remove() इसे करना चाहिए ... लेकिन मैं केवल वादा को रोकना चाहता हूं, पूरे तत्व को नहीं हटाऊंगा।

+1

यदि आपके पास केवल वादा वस्तु है (और मूल स्थगित करने की कोई पहुंच नहीं है), तो ऐसा करना असंभव होना चाहिए। एक वादा का विचार संकल्प/अस्वीकार कार्यक्षमता के बिना, स्थगित किए जाने वाले अस्वीकार या अस्वीकार करने में सक्षम होना है। आप क्या कर सकते हैं एक वादा रैपर बनाते हैं जो मूल वादे फ़ंक्शन को उजागर करता है, लेकिन सभी कॉलबैक एक रैपिंग फ़ंक्शन से बंधे होते हैं जो किसी प्रकार के ध्वज को सुनता है ताकि कॉलबैक को ट्रिगर करने से बचने के लिए रद्द कर दिया गया हो। –

+0

लगभग, आप वास्तव में केवल एक स्थगित बनाना चाहते हैं और मैन्युअल रूप से इसे अस्वीकार या हल करना चाहते हैं कि आप फिट कैसे देखते हैं। –

उत्तर

4

अच्छी खबर। कल से आप अपना वादा रद्द कर सकते हैं।

मैंने अपनी छोटी प्लगइन jquery-timing का नया संस्करण प्रकाशित किया जो कई लोगों के बीच दो तरीकों को प्रदान करता है जिन्हें .wait() और .unwait() कहा जाता है।

var deferred = $("#box").delay(2000).show("slow").delay(2000).promise(); 
$.wait(deferred, function(){ log("Done"); }); 

आप तो कॉलबैक का पंजीकरण रद्द करना चाहते हैं:

$.unwait(); 

इंतजार के इन स्थिर संस्करणों और unwait भी किसी भी हैंडलर लेकिन केवल एक विशिष्ट सेट को रद्द नहीं करने के लिए एक वैकल्पिक समूह नाम का समर्थन है।

कि इसके अलावा आप की तरह एक बहुत अधिक स्मार्ट सामान कर सकते हैं:

$('#box').wait(deferred).addClass('ready'); 

या एक श्रृंखला में पूरे कोड, unwait विकल्प के बिना:

$("#box").delay(2000).show("slow") 
    .delay(2000).join(function(){log("Done");})).addClass('ready'); 

या करने के लिए विकल्प के साथ भी कम ही दो विराम रद्द करें:

$("#box").wait(2000).show("slow",$) 
    .wait(2000, function(){log("Done");})).addClass('ready'); 

बस दस्तावेज़, उदाहरण और एपीआई देखें जो आपके लिए सबसे अच्छा फिट बैठता है।

+0

सिर्फ एक प्रश्न: क्या मैं deferred.reject() का उपयोग नहीं कर सकता? –

2

मेरा मानना ​​है कि आप jQuery प्रलेखन यहाँ से $('#box').remove();

उपयोग कर सकते हैं: http://api.jquery.com/promise/

लौटे वादा एक तत्व के लिए .data() पर संग्रहीत एक आस्थगित वस्तु से जुड़ा हुआ है। चूंकि .remove() विधि तत्व के डेटा के साथ-साथ तत्व को भी हटा देती है, यह किसी तत्व के अनसुलझे वादे को हल करने से रोकती है। यदि यह आवश्यक है डोम से एक तत्व को दूर करने से पहले अपने वादे हल हो गई है,)

+0

ठीक है, मैंने 'हटाएं) देखा, लेकिन मैं सोच रहा था कि वास्तविक तत्व को हटाए बिना ऐसा करने का कोई तरीका है या नहीं। संपादित प्रश्न – ripper234

+1

हाँ, डोम से तत्व को हटाने के लिए आदर्श प्रतीत नहीं होता है। एकमात्र तरीका मैं इसे काम करने के लिए मिल सकता था। एक बेहतर समाधान के लिए अपनी खोज में शुभकामनाएँ। – Paul

1

.detach का उपयोग करें (बजाय और संकल्प के बाद .removeData() के साथ पालन करें। "मुझे लगता है नहीं है आप कुछ चाहते हैं http://jsfiddle.net/2cq8M/ की तरह? मैं दो वादे शामिल कर रहा हूं (केवल एनिमेशन के सेट के अंत में मामले को संभालने के लिए, दूसरा आवश्यकतानुसार हल करने या अस्वीकार करने के लिए)।

+0

बेशक, सबसे बड़ी बात यह है कि मैं उत्सुक हूं कि एक बार जब आप वादे को अस्वीकार कर लेते हैं तो एनिमेशन के साथ क्या होता है? – JayC

+0

थोड़ा घबराहट वाक्यविन्यास ... मैं वास्तव में एक वादा रद्द करने का एक तरीका उम्मीद कर रहा था ... वर्तमान कार्यान्वयन में कोई रास्ता नहीं हो सकता है। – ripper234

1

आप इस मामले में स्थगित करना चाहते हैं एक वादा, हालांकि, आप स्थगित करने के लिए एनीमेशन के वादे का उपयोग कर सकते हैं।

http://jsfiddle.net/LG9eZ/9/

var stopDone = true; 

function log(msg) { 
    $(".debug").append(new Date() + " - " + msg + "<br/>"); 
} 

log("Starting"); 

var boxAnimation = new $.Deferred(); 
boxAnimation.done(function() { 
    log("Done"); 
}); 
boxAnimation.fail(function() { 
    log("Stopped"); 
}); 


$("#box").delay(2000).show("slow").delay(2000).promise().then(function() { 
    boxAnimation.resolve(); // when all the animations are done, resolve the deferred. 
}); 


if (stopDone) 
{ 
    boxAnimation.reject(); 
} 

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