2009-09-06 13 views
16

ट्रिगर नहीं वर्तमान में मेरा कार्यक्रम एक जगह जहां यह दोनों सुनता उपयोगकर्ता एक निश्चित तत्व स्क्रॉल करने के लिए के लिए में है, लेकिन यह भी कभी-कभी अपने आप इस तत्व अपने आप में स्क्रॉल करता है। (धीरे-धीरे, सुंदर स्क्रॉल नहीं, लेकिन एक त्वरित कूद। यह संदर्भ में समझ में आता है, मैं कसम खाता हूं।)मेक "scrollLeft,"/"scrollTop" परिवर्तन पुस्तक घटना श्रोता

क्या स्क्रॉल ईवेंट स्क्रॉल करने या स्क्रॉलटॉप सेट करके स्क्रॉलिंग किए जाने पर स्क्रॉल ईवेंट ट्रिगर करने का कोई तरीका नहीं है? मेरी पहली सोचा की तरह एक बुनियादी स्विच था,:

ignoreScrollEvents = true; 
element.scrollLeft = x; 
ignoreScrollEvents = false; 

function onScroll() { 
    if(ignoreScrollEvents) return false; 
} 

लेकिन जब से घटनाओं तुरंत चालू नहीं करते (उफ़, duhh), कि समस्या का समाधान नहीं है। मैं किस तरह के उत्तर का प्रयास कर सकता हूं? मैं jQuery का भी उपयोग कर रहा हूं, अगर इससे कुछ भी मदद मिलती है।

उत्तर

17

सबसे आसान सामान्य विधि ? इवेंट हैंडलर में बस ध्वज को रीसेट करें। यदि आप वास्तव में मूल्य बदल रहे हैं, तो आप पहले जांचना चाहेंगे, अन्यथा एक घटना को निकाल दिया नहीं जाएगा - Rodrigo notes के रूप में, यहां एक अच्छी प्रैक्टिस इसे तथाकथित "सेटर" फ़ंक्शंस में कारक बनाना है:

function setScrollLeft(x) 
{ 
    if (element.scrollLeft != x) 
    { 
    ignoreScrollEvents = true; 
    element.scrollLeft = x; 
    } 
} 

... 

function onScroll() 
{ 
    var ignore = ignoreScrollEvents; 
    ignoreScrollEvents = false; 

    if (ignore) return false; 

    ... 
} 

लेकिन, अपनी आवश्यकताओं पर निर्भर करता है, आप पहले से ही पुस्तक स्थिति कहीं भंडारण किया जा सकता है; यदि ऐसा है, तो बस अपने ध्वज के रूप में अद्यतन करें और जांचें। कुछ ऐसा:

element.scrollLeft = currentScrollLeft = x; 

... 

function onScroll() 
{ 
    // retrieve element, etc... 

    if (element.scrollLeft == currentScrollLeft) return false; 

    ... 
} 
+0

मेरे कोड में, मैं एक मुद्दा मारा: कभी कभी ऐसा होता है कि, कहते हैं, scrollLeft, पहले से ही 0 है, तो मेरे कोड भी 0. जैसे करने के लिए यह सेट, कोई पुस्तक घटना शुरू हो रहा है, और अगले उपयोगकर्ता स्क्रॉल नजरअंदाज कर दिया है। (जो वास्तव में एक मुद्दा है यदि वे होम, एंड इत्यादि के साथ स्क्रॉल करते हैं) लेकिन यह निश्चित रूप से एक करीबी समाधान है - और मुझे पता था कि मुझे उस डमी कार्यान्वयन में कुछ बेवकूफ याद आ रहा था। धन्यवाद! – Matchu

+0

मैंने इस बारे में सोचा ... आपका सबसे अच्छा शर्त तो, आप ध्वज सेट करने से पहले मूल्य बदल रहे हैं, तो जाँच करने के लिए है - यह निर्धारित नहीं करते हैं यदि आप नहीं कर रहे हैं।हो सकता है कि आपके पास पहले से ही यह कोड एक अलग फ़ंक्शन में फैला हुआ हो, लेकिन यदि नहीं, तो ऐसा करने से यह आसान हो जाएगा - इसके उदाहरण के लिए रॉड्रिगो का जवाब देखें। – Shog9

1

आप कर सकते थे constantly check अगर scroll position परिवर्तन ...

+0

एक सुंदर समाधान नहीं है, लेकिन यदि आप कह रहे हैं कि घटनाओं तुरंत चालू नहीं करते यही कारण है कि ... – marcgg

+0

जब मैं कहता हूँ की घटनाओं तुरंत चालू नहीं करते, मेरा मतलब है कि सामान्य रूप में। अगर मैं उन पहली 3 लाइनों को चलाता हूं, तो वे सभी स्क्रॉल इवेंट ट्रिगर होने के समय आते हैं और जाते हैं, क्योंकि यह जावास्क्रिप्ट काम करता है। – Matchu

+0

यह समाधान स्वीकार किए गए समाधान की तुलना में सुंदर है, मुझे लगता है। स्वीकृत समाधान चाहता है कि आप एक वैश्विक चर बनाना चाहते हैं, और जैसे ही आप दो 'ऑनस्कोल' हैंडलर चाहते थे तो टूट जाएंगे। यह समाधान हालांकि एक स्नैपी यूएक्स प्रदान नहीं करता है, इसलिए यह वास्तव में चट्टानों और कठिन जगहों के आसपास है। – jcarpenter2

0

आप कर सकते थे जब आप Onscroll के अंदर जाने के लिए अपने तत्व की भरपाई शीर्ष भंडारण और scrollTop के खिलाफ यह मिलान का प्रयास करें:

function onScroll(){ 
    var scrollTop = (document.documentElement.scrollTop || document.body.scrollTop), 
    offsetTop = $('selector').offset().top; 
    if(offsetTop > scrollTop){ 
     //user has not scrolled to element so do auto scrolling 
    } 
} 
2

एक सेटर के बारे में कैसे?

var _preventEvent = false; // set global flag 
 

 
function setScrollTop(amount) { 
 
    _preventEvent = true; // set flag 
 
    document.documentElement.scrollTop = amount * Math.random(); 
 
} 
 

 
function setScrollLeft(amount) { 
 
    _preventEvent = true; // set flag 
 
    document.documentElement.scrollLeft = amount * Math.random(); 
 
} 
 

 
// scroll event listener 
 
window.onscroll = function() { 
 
    console.clear(); 
 
    
 
    if (_preventEvent) { 
 
    _preventEvent = false; // reset flag 
 
    return; 
 
    } 
 
    
 
    console.log('normal scroll'); 
 
}
html{ height:500%; width:500%; } 
 
button{ position:fixed; } 
 
button + button{ top:50px; }
<button onclick=setScrollTop(1000)>Random scrollTop</button> 
 
<button onclick=setScrollLeft(1000)>Random scrollLeft</button>

0

ठीक है, मेरा अंतिम समाधान, Shog9 के बंद का निर्माण (नहीं मेरा असली कोड, लेकिन मेरे दृष्टिकोण):

var oldScrollLeft = element.scrollLeft; 
element.scrollLeft = x; 
if(element.scrollLeft != oldScrollLeft) { 
    ignoreScrollEvents = true; 
} 

function onScroll() { 
    if(!ignoreScrollEvents) performGreatActions(); 
    ignoreScrollEvents = false; 
} 

अगर बयान केवल ध्वज की अनदेखी सेट जब scrollLeft मान वास्तव में बदलता समाप्त होता है, तो 0 से 0 तक सेटिंग जैसे मामलों गलत तरीके से ध्वज सेट नहीं करते हैं।

धन्यवाद, सब!

+0

तो सही जवाब है? – Rodrigo

+0

अनिश्चित। यहां प्रोटोकॉल क्या है? अगर मैं किसी उत्तर का हिस्सा उपयोग करता हूं तो पूर्ण उत्तर तक पहुंचने के लिए इसे बंद करें, क्या मैं अपना खुद का या दूसरा चिह्नित करता हूं? – Matchu

+0

स्वीकार किए गए उत्तर को इस चेतावनी को शामिल करने के लिए संपादित किया गया है, इसलिए अब यह इस जवाब से मेल खाता है :) कूल! – Matchu

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