2009-09-30 15 views
49

काम नहीं कर रहा है मैं अभी भी JQuery के लिए नया हूं, काम करने के लिए मेरा AJAX उदाहरण प्राप्त करने के तरीके पर मैं setTimeout के साथ रुक गया। मैंने इसे नीचे तोड़ दिया है जहां इसे जोड़ना चाहिए "। प्रत्येक सेकेंड में div के लिए।JQuery, setTimeout

प्रासंगिक कोड दो फाइलों में है।

index.html

<html><head> 
<script type='text/javascript' src='jquery.js'></script> 
<script type='text/javascript' src='myCode.js'></script> 
</head> 
<body> 
<div id='board'>Text</div> 
</body> 
</html> 

और myCode.js

(function(){ 
    $(document).ready(function() {update();}); 

    function update() { 
     $("#board").append("."); 
     setTimeout('update()', 1000);  } 
})(); 

myCode.js फ़ाइल ठीक और "अद्यतन()" काम करता है के माध्यम से, लेकिन फिर कभी नहीं पहली बार चलाता है ।

उत्तर

110

आपके पास यहां कुछ समस्याएं हैं।

सबसे पहले, आप anonymous function के भीतर अपना कोड परिभाषित कर रहे हैं। यह निर्माण:

(function() { 
    ... 
)(); 

दो चीजें करता है। यह एक अज्ञात फ़ंक्शन को परिभाषित करता है और इसे कॉल करता है। ऐसा करने के दायरे के कारण हैं लेकिन मुझे यकीन नहीं है कि आप वास्तव में यही चाहते हैं।

आप कोड कोड में setTimeout() पर जा रहे हैं। समस्या यह है कि update() उस तरह निष्पादित होने पर दायरे के भीतर नहीं है। हालांकि यह अगर तुम एक समारोह सूचक में पारित बजाय तो यह काम करता है:

(function() { 
    $(document).ready(function() {update();}); 

    function update() { 
    $("#board").append("."); 
    setTimeout(update, 1000);  } 
    } 
)(); 

क्योंकि समारोह सूचक update कि ब्लॉक के दायरे के भीतर है।

$(document).ready(function() {update();}); 

function update() { 
    $("#board").append("."); 
    setTimeout(update, 1000);  } 
} 

या

$(document).ready(function() {update();}); 

function update() { 
    $("#board").append("."); 
    setTimeout('update()', 1000);  } 
} 

और इन काम के दोनों:

लेकिन जैसे मैंने कहा, वहाँ गुमनाम समारोह के लिए कोई जरूरत नहीं है ताकि आप इसे इस तरह पुनर्लेखन कर सकते हैं। दूसरा काम करता है क्योंकि कोड ब्लॉक के भीतर update() अब दायरे में है।

मैं भी $(function() { ... } छोटा ब्लॉक प्रपत्र पसंद करते हैं और नहीं बल्कि update() भीतर setTimeout() बुला से तुम सिर्फ बजाय setInterval() उपयोग कर सकते हैं:

$(function() { 
    setInterval(update, 1000); 
}); 

function update() { 
    $("#board").append("."); 
} 

आशा है कि है कि साफ करता है।

+0

धन्यवाद, यह काम किया। क्या कोई यह समझा सकता है कि यह किस तरह से काम नहीं करता है? मैंने जो भी उदाहरण देखा है, वह स्वरूपण के समान है जो मैंने उपयोग किया है। –

+0

w3schools वास्तव में इसका संदर्भ देने के लिए सबसे अच्छा संसाधन है? अगर वह उस पृष्ठ का उदाहरण उदाहरण के रूप में इस्तेमाल करता तो वह वही गलती करता। इस मामले में –

+3

w3schools सही है। मुद्दा एक दायरा मुद्दा था। – cletus

19
setInterval(function() { 
    $('#board').append('.'); 
}, 1000); 

यदि आप इसे एक बिंदु पर रोकना चाहते हैं तो आप स्पष्ट अंतराल का उपयोग कर सकते हैं।

+1

मैंने पहले सेट इनवर्वल का उपयोग नहीं किया है, लेकिन यह मेरे लक्ष्य को पूरा करने का एक और सीधा मार्ग प्रतीत होता है। धन्यवाद –

+0

क्लीटस ने इसे अपने समाधान में जोड़ा है; सीखने की महत्वपूर्ण बात यह है कि आपको इंटरवल/सेटटाइमआउट सेट करने के लिए एक वास्तविक फ़ंक्शन को फ़ीड करना चाहिए, एक स्ट्रिंग नहीं जिसे मूल्यांकन किया जाएगा जैसे 'अपडेट()' –

+2

'अपडेट()' जैसे कोड ब्लॉक को पास करना मान्य है लेकिन पसंदीदा नहीं है। सभी उपयोगकर्ताओं की जानकारी के लिए – cletus

8

सेटटाइमआउट का उपयोग आपके निर्दिष्ट कोड को निर्दिष्ट समय अवधि के बाद निष्पादित करने के लिए किया जाता है ताकि आपकी आवश्यकताओं को सेट इंटरवल का उपयोग करने के लिए बेहतर हो क्योंकि यह आपके फ़ंक्शन को निर्दिष्ट समय अंतराल पर कॉल करेगा।

+3

का उपयोग करके समय बर्बाद कर रहा था, मैं असहमत हूं, सेटटाइमेट बेहतर अभ्यास है, इस मामले में जहां फ़ंक्शन अपडेट() को चलाने के लिए 1 से अधिक समय लगता है, उसी पर चलने वाले एक ही फ़ंक्शन के कई उदाहरण हो सकते हैं पहर। यदि आप सेटटाइमआउट का उपयोग करते हैं तो फंक्शन अपडेट() को समय के अगले लूप से पहले पूरी तरह खत्म करना होगा, इस प्रकार केवल 1 उदाहरण एक समय में चल रहा होगा। – kamui

0

यह एक ही बात सिद्ध लेकिन बहुत सरल है:

$(document).ready(function() { 
    $("#board").delay(1000).append("."); 
}); 

आप एक देरी श्रृंखला से पहले लगभग किसी भी jQuery विधि कर सकते हैं।

संबंधित मुद्दे