2013-06-15 10 views
5

मैं D3.js में लगातार एक संक्रमण कैसे चला सकता हूं?D3.js: लगातार एक संक्रमण चलाते हैं?

उदाहरण के लिए, मैं कहता हूं कि मैं body रंग लाल से नीले रंग में बदलना चाहता हूं और फिर से, लगातार (मुझे नहीं, यह भयानक होगा, लेकिन इसके साथ जाना होगा)।

यह कैसे मैं इसे एक बार करना होगा है:

d3.select("body").transition().duration(1000).style("background-color", "red"); 

मैं इसे कैसे लगातार करना होगा?

मैंने देखा है निकटतम उदाहरण d3.timer का उपयोग करते हैं, लेकिन मुझे यकीन नहीं है कि ऐसा करने का एक बेहतर तरीका है या नहीं।

उत्तर

5

आप transition.each() और "अंत" ईवेंट का उपयोग कर सकते हैं। कोड निम्न की तरह कुछ दिखता है।

function myTrans() { 
    d3.select("body").transition().duration(1000).style("background-color", "red") 
     .each("end", function() { 
     d3.select(this).transition().duration(1000).style("background-color", "blue") 
      .each("end", function() { myTrans(); }); 
     }); 
} 
+4

यह महान है, धन्यवाद। हालांकि मैं थोड़ा परेशान हूं कि यह अंततः ब्राउज़र को दुर्घटनाग्रस्त कर सकता है - क्या यह धीरे-धीरे अधिक से अधिक स्मृति लेगा? – Richard

+0

@ रिचर्ड यह एक रिकर्सिव फ़ंक्शन है (जैसा कि यह स्वयं कहता है), इसलिए इसे कुछ थ्रेसहोल्ड से अधिक होने वाले स्टैक आकार के संबंध में एक त्रुटि फेंकनी चाहिए। – SumNeuron

+0

@SumNeuron यह खुद को रिकर्सिव रूप से कॉल करता है, लेकिन असीमित रूप से, इसलिए यह कभी भी कॉल स्टैक आकार त्रुटि को फेंक नहीं देगा। – jessepinho

1

आप इस ब्लॉग पोस्ट (2 भागों) डी 3 संक्रमण पर बाहर की जाँच करने के लिए चाहते हो सकता है - http://blog.safaribooksonline.com/2013/07/11/reusable-d3-js-using-attrtween-transitions-and-mv/

मैं सिर्फ डी 3 के साथ काम करने की शुरुआत कर रहा हूँ और यह मददगार था।

1

आप डी 3 संस्करण 4 के लिए चाहते प्रत्येक (लार्स उत्तर के आधार पर) के बजाय .on उपयोग करने के लिए:

function myTrans() { 
    d3.select("body").transition().duration(1000).style("background-color", "red") 
     .on("end", function() { 
     d3.select(this).transition().duration(1000).style("background-color", "blue") 
      .on("end", function() { myTrans(); }); 
     }); 
}