2011-04-05 18 views
7

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

var image1 = new Image(); 
var image2 = new Image(); 
var image3 = new Image(); 
image1.src = "images/website6.jpg"; 
image2.src = "images/website7.jpg"; 
image3.src = "images/sunset.jpg"; 
var images = new Array(
    "images/website6.jpg", 
    "images/website7.jpg", 
    "images/sunset.jpg" 
); 
setTimeout("delay(images,0)",2000); 
function delay(arr,num){ 
    document.slide.src = arr[num % 3]; 
    var number = num + 1; 
    setTimeout("delay(arr,number)",1000); 
} 

जिस छवि को मैं बदलने की कोशिश कर रहा हूं वह आईडी स्लाइड है। और मेरे पास कुछ सबूत भी हैं जो यह काम करता है। पहला छवि भार क्या होता है। फिर दूसरी छवि लोड (जिसका अर्थ है कि मूल सेटटाइम कॉल काम करना चाहिए)। तब कुछ भी नहीं होता है। जो मुझे बताता है कि यह रिकर्सन है जो काम नहीं कर रहा है।

मैं अन्य भाषाओं में रिकर्सन से बहुत परिचित हूं, इसलिए मुझे लगता है कि यह सिर्फ एक वाक्यविन्यास चीज़ या कुछ होना चाहिए, लेकिन मुझे इसे समझना प्रतीत नहीं होता है। किसी भी मदद के लिए धन्यवाद।

+0

दूसरे सेटटाइम में पैरामीटर को अनदेखा करके स्पष्ट कर देगा। यह मेरा पहला अनुमान होगा। – Cronco

+0

@ क्रोनको दिलचस्प रूप से, अगर मैं ऐसा करता हूं तो मुझे दूसरी छवि नहीं मिलती ... जो बताती है कि छवि एक बार बदल रही है। साथ ही, मैंने जो भी उदाहरण देखा है, वह उद्धरण है, इसलिए मैंने उन्हें अंदर रखा है। – Paul

+0

चर को उद्धृत करने में समस्या यह है कि टाइमर पूर्ण स्ट्रिंग '" देरी (एआर, संख्या) "को परिवर्तित करने के बजाय" उनके संग्रहीत मूल्यों के लिए चर - यही कारण है कि यह अनजान काम करेगा (हालांकि आपको अभी भी उन्हें उद्धृत करने की आवश्यकता होगी .... '"देरी ('" + arr + "','" + number + "')'। हालांकि, मुख्य बिंदु - पॉइंटी का जवाब बेहतर है। मैं बस यह बता रहा हूं कि क्या हो रहा है। –

उत्तर

15

समस्या यह है कि जब आप "सेटटाइमआउट" कॉल में मूल्यांकन करने के लिए तारों में गुजरते हैं, तो वैश्विक संदर्भ में मूल्यांकन (बाद में, जब आग लगने का समय होता है) किया जाएगा। इस प्रकार, आप जिस तरह से बेहतर (अन्य कारणों की एक बहुत कुछ के लिए) वास्तविक कार्यों में गुजर कर रहे हैं:

setTimeout(function() { delay(images, 0); }, 2000); 
function delay(arr, num) { 
    document.slide.src = arr[num % 3]; 
    setTimeout(function() { delay(arr, num + 1); }, 1000); 
} 

अधिक आधुनिक ब्राउज़रों में, आप ".bind()" विधि का उपयोग कर सकते हैं कार्यों एक समारोह बनाने के लिए कि पूर्व बाध्य करने के लिए कुछ this के रूप में प्रयोग की जाने वाली है:

setTimeout(delay.bind({arr: images, num: 0}), 2000); 
function delay() { 
    document.slide.src = this.arr[this.num % 3]; 
    setTimeout(delay.bind({arr: this.arr, num: this.num + 1}), 1000); 
} 

एक के छह अन्य के आधे दर्जन से अधिक है, लेकिन सिर्फ एक उदाहरण से पता चलता है कि वहाँ काम करने के लिए कई तरीके हैं के रूप में।

+0

बहुत बढ़िया, यह अब काम करता है। मैं अभी भी थोड़ा उलझन में हूं कि मेरा कोड क्यों काम नहीं करता है। आप कहते हैं कि इसका मूल्यांकन किया जाता है "बाद में , जब यह आग लगने का समय है। "यह वास्तव में कब होता है, और यह कभी भी उस भाग तक क्यों नहीं पहुंचता है? और एक अज्ञात फ़ंक्शन का उपयोग करने से यह क्यों बदलता है? अगर इसमें कुछ अच्छा दस्तावेज है जो इसे कवर करता है तो मैं एक लिंक की सराहना करता हूं। धन्यवाद। – Paul

+0

समस्या यह है कि स्ट्रिंग, "देरी (एआर, संख्या)", चर "arr" चर पर प्राप्त करने में सक्षम होने की आवश्यकता है समझने के लिए nd "संख्या"। जिस तरह से स्ट्रिंग "eval()" काम करता है (और अब जब मैं इसके बारे में सोचता हूं, इससे कोई फर्क नहीं पड़ता कि यह सेटटाइम कॉल के समय या बाद में है), यह आपके टाइमआउट फ़ंक्शन से अलग संदर्भ में किया गया है; यह भाषा जिस तरह से काम करता है। – Pointy

+0

जब आप ** असली ** फ़ंक्शन का उपयोग करते हैं, तो "कॉलटाइम()" पर आपके कॉल के वास्तविक दायरे में फ़ंक्शन का अर्थ क्या होता है इसकी व्याख्या। जावास्क्रिप्ट काम करने के तरीके के कारण, उस समारोह में ** ** स्थानीय चरों तक पहुंच है। – Pointy

1

मैं दूसरे setTimeout कॉल का बहुत संदिग्ध होगा। मैं एक स्पष्ट फ़ंक्शन बनाम एक स्ट्रिंग अभिव्यक्ति बनाम

setTimeout(function() { delay(arr, number); }, 1000); 
संबंधित मुद्दे