2010-11-30 20 views
9

सेटटाइमआउट का उपयोग करते समय ईवेंट ऑब्जेक्ट को खींचने का सबसे अच्छा तरीका क्या है? मैं सभी ब्राउज़रों में इवेंट मॉडल को सामान्यीकृत करने के लिए jQuery का उपयोग कर रहा हूं, लेकिन मुझे यकीन नहीं है कि 'e' ऑब्जेक्ट को चेकपोज फ़ंक्शन में कैसे प्राप्त करें।घटना तर्क के साथ जावास्क्रिप्ट सेटटाइमआउट फ़ंक्शन कॉल?

मेरे वर्तमान कोड:

function MouseDownEvent(e) { 
    *snip* 
    timeoutID = setTimeout(checkPos(e), 500); 
} 
function checkPos(e) { 
    //function uses e on a timeout of 500ms 
    timeoutID = setTimeout(checkPos(e) }, 500); 
} 

वर्तमान में है कि कोड एक बार समारोह mousedown घटना में कहा जाता है क्योंकि काम करता है, लेकिन कभी अद्यतन करता है ई वस्तु उपयोगकर्ता माउस ले जाता है के रूप में। एफएफ जावास्क्रिप्ट त्रुटि कंसोल यह भी घोषित करता है कि यह 'एक बेकार सेटटाइमआउट कॉल (तर्क के आसपास गायब उद्धरण?) है, लेकिन उस सलाह के बाद यह पूरी तरह असफल हो जाता है।

मैं सेटटाइमआउट कॉल से 'ई' ईवेंट तर्क कैसे खींच सकता हूं?

संपादित करें: कोड reruns कि checkPos ढंग से काम हर 500ms

+1

, आप वास्तव में checkPos' लागू कर रहे हैं 'जब' setTimeout' बुला() फ़ंक्शन मंगलाचरण ऑपरेटर '(के कारण') और करने के लिए 'अपनी वापसी मान गुजर setTimeout'; वह मान शायद किसी फ़ंक्शन का संदर्भ नहीं है, इसलिए 'setTimeout' विफल रहता है। –

उत्तर

7

सबसे पहले आप दो टाइमआउट का उपयोग क्यों कर रहे हैं? यह setInterval (की तरह मुझे लग रहा है) बेहतर

function MouseDownEvent(e) { 
*snip* 
clearInterval(intervalID); 
intervalID = setInterval(function(){checkPos(e);}, 500); 
} 

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

function MouseMoveEvent(e) { 
//called every time the mouse is moved, event object will contain position 
} 

हमेशा की तरह जावास्क्रिप्ट में आप एक घटना संचालित समाधान के लिए पहले देखना चाहिए और केवल समय संचालकों का उपयोग आप पूरी तरह करने के लिए है जब।

* संपादित करें - को संबोधित मुद्दों सेशन टिप्पणी में उठाया *

var handler = { 
    i : 0, 
    function : mouseMoveEvent(e) { 
     handler.i++; 
     if (handler.i % 100 == 0) { 
     //Do expensive operations 
     } 
    } 
} 

$(myElement).bind("mousemove", handler.mouseMoveEvent); 
10

कोशिश में जोड़ा गया: ओपी टिप्पणियों की वजह से

function MouseDownEvent(e) { 
    *snip* 
    timeoutID = setTimeout(function(){checkPos(e);}, 500); 
} 
function checkPos(e) { 
    //function uses e on a timeout of 500ms 
} 

संपादित करें ..

एक अद्यतन घटना तक पहुंचने के लिए प्रत्येक बार चेकपोज़ निकाल दिया जाता है:

var myNamespace = {}; 

$('body').mousemove(function(e) { 
    myNamespace.mouseEvent = e; 
}); 

function checkPos() { 
    doSomethingWith(myNamespace.mouseEvent); 
} 

timerID = setInterval(checkPos, 500); 
+0

इस उत्तर पर वापस जाने के लिए खेद है, लेकिन जब मैंने इस कोड को फिर से चलाया चेकपॉस (ई) डाल दिया; में, यह प्रत्येक टाइमआउट के बाद अद्यतन ई ईवेंट लाने में विफल रहा। –

+0

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

+0

इवेंट ऑब्जेक्ट को जावास्क्रिप्ट या jQuery में कॉल करने का कोई तरीका नहीं है जैसे कि मैं टाइमआउट के आधार पर वर्तमान माउस स्थिति में खींच सकता हूं? –

1

आप एक करी फ़ंक्शन का उपयोग कर सकते हैं, jQuery here के लिए एक है।

आम तौर पर, आप इस होगा:

function foo(a, b) 
{ 
    alert(a + b); 
} 

var bar = curry(foo, 1); 

bar(2); // alerts 3, as if you had called foo(1, 2) 
तो

तुम कर सकते हो: चूंकि करी एक समारोह के साथ यह पहला तर्क ई करने के लिए बाध्य है रिटर्न

setTimeout(curry(checkPos, e), 500); 

, तो आप इसे सीधे setTimeout में पारित कर सकते हैं ।

1

जहां तक ​​मैं देख सकता, आईई "घटना" वस्तु के चारों ओर की तरह आप की जरूरत पारित करने के लिए अनुमति नहीं दी जाएगी।

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

उदाहरण के लिए: http://jsfiddle.net/YvYtn/1/

यह पिछले एक्स स्थिति दिखाई जाएगी, आप स्टोर कर सकते हैं जो कुछ भी आप घटना वस्तु से की जरूरत है।

जे एस कोड:

var _lastPosX= null; 
function MouseDownEvent(evt) { 
    if (typeof evt == "undefined" || !evt) 
     evt = window.event; 
    _lastPosX = (evt.clientX || evt.pageX); 
    timeoutID = window.setTimeout("checkPos();", 500); 
} 
function checkPos() { 
    alert(_lastPosX); 
} 
अपने कोड के साथ

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

  • कोई संबंधित समस्या नहीं^_^