2012-11-08 17 views
7

एक div कि एक .sortable() कंटेनर के भीतर है div खींच जब आप स्क्रॉलबारjQuery ui sortable - पर क्लिक स्क्रॉलबार टूट जाता है यह

बेला में जारी है, वहाँ 3 अलग sortables, उनमें से 1 एक स्क्रॉल है शुरू कर देंगे स्क्रॉल एक

http://jsfiddle.net/wnHWH/1/

बग: नीचे सामग्री के माध्यम से स्क्रॉल करने के लिए स्क्रॉलबार पर क्लिक करें और इसे खींच सकते हैं या, जब आप माउस छोड़ दें, div खींचें करने के लिए जो उसके चारों ओर अपने माउस का पालन करता है शुरू होता है, और वहाँ है पेज को रीफ्रेश किए बिना इसे अनस्टिक करने का कोई तरीका नहीं है।

+1

एक संभावित उत्तर एक शीर्षक तत्व स्थापित कर सकता है जो स्क्रॉल करने योग्य सामग्री को अलग रखते हुए खींचने के लिए क्लिक किए जाने वाले भाग के रूप में कार्य करता है – Funkodebat

+0

मैं एक ही समस्या का पता लगाने की कोशिश कर रहा हूं। मैंने देखा है कि यह व्यवहार क्रोम में मौजूद है। आप div से राइट-क्लिक करके रीफ्रेश किए बिना माउस से रिलीज कर सकते हैं और फिर कहीं और क्लिक कर सकते हैं। फ़ायरफ़ॉक्स में, स्क्रॉल करने का प्रयास केवल div को खींचने में सफल होता है, कोई स्क्रॉलिंग नहीं होती है, लेकिन जब आप इसे रिलीज़ करते हैं तो यह माउस से चिपकता नहीं है। मैंने अभी तक आईई की जांच नहीं की है। – jonhopkins

+0

मैं ओएस एक्स 10.7 पर क्रोम या सफारी में दोबारा नहीं जा सकता। यह ब्राउज़र/ओएस combos क्या होता है? – evanmcdonnal

उत्तर

5

आप इस तरह jQuery के .mousemove घटना का उपयोग कर सकते हैं:

$('#sortable div').mousemove(function(e) { 
    width = $(this).width(); 
    limit = width - 20; 
    if(e.offsetX < width && e.offsetX > limit) 
     $('#sortable').sortable("disable"); 
    else 
     $('#sortable').sortable("enable"); 
}); 

मैं बेला कि यहाँ काम करता है http://jsfiddle.net/aanred/FNzEF/ बनाने की है। उम्मीद है कि यह आपकी ज़रूरत को पूरा करेगा।

+0

ऐसा लगता है कि यह करीब है। हालांकि, अगर मैं 50px कहने के पैडिंग के साथ, पूरे लॉट में बाहरी डीवी जोड़ता हूं, तो गणना ऑफसेट होती है। क्या यह तय किया जा सकता है? –

+0

@LeeTaylor मेरा अपडेटेड फीडल देखें जिसे आपको 'ऑफसेटएक्स' के साथ 'पेजएक्स' को बदलने की जरूरत है। – SubRed

+0

बहुत धन्यवाद। मैं बाद में अपनी परियोजना के साथ इसका परीक्षण करने के लिए एक नज़र डालेंगे। आपके समय के लिए धन्यवाद। –

4

sortable()draggable() करता है जैसे हैंडल के लिए चयनकर्ता निर्दिष्ट कर सकता है। फिर केवल मिलान किए गए तत्व क्लिक ईवेंट प्राप्त करते हैं। आप इस तरह हैंडल चयनकर्ता निर्दिष्ट करते हैं:

$('#sortable').sortable({handle : '.handle'}); 

आपके पास पहले से ही बाकी चीज़ों की आवश्यकता है जो आपको बाकी के लिए चाहिए। आपके अतिप्रवाह तत्व पर आंतरिक div एक उपयुक्त हैंडल बनाता है, जैसे:

<div style="height: 200px;overflow:auto"> 
    <div class="handle" style="height: 300;"> 
     blah 
     blah 
     blah 

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

<div><div class="handle">asadf</div></div> 

Modified fiddle

+0

यह उत्तर सही काम कर रहा है। यदि हम स्क्रॉलर – Rafee

+0

पर क्लिक करते हैं तो यह तोड़ नहीं देता है यह सबसे अच्छा जवाब है। चुने गए उत्तर एक हैक है और जब आप स्क्रॉल करते समय स्क्रॉलबार चौड़ाई सीमा से माउस खींचते हैं तो विफल हो जाता है। निश्चित रूप से, हैक समस्या को रोकता है यदि आप माउस को आपके द्वारा निर्दिष्ट स्क्रॉलबार की चौड़ाई सीमा के भीतर रखते हैं, लेकिन उपयोगकर्ता स्क्रॉल करते समय ऐसा नहीं करते हैं। वे अक्सर स्क्रॉलबार के बाईं ओर दाईं ओर माउस को ले जाते हैं। –

3

SubRed के जवाब देने के लिए अनुपूरक:


यह मेरी आवश्यकताओं के लिए पूरी तरह से काम किया।

How can I get the browser's scrollbar sizes?

यह अनुमति देता है कोड अलग व्यवस्था पर विभिन्न स्क्रॉलबार चौड़ाई को संभालने के लिए: हालांकि, स्क्रॉलबार 20 पिक्सल किया जा रहा है (जैसा कि ऊपर) की चौड़ाई पर निर्भर के बजाय, मैं कोड से इस्तेमाल किया। कोड यहाँ सुविधा के लिए चिपकाया जाता है:

function getScrollBarWidth() 
{ 
    var inner = document.createElement('p'); 
    inner.style.width = "100%"; 
    inner.style.height = "200px"; 

    var outer = document.createElement('div'); 
    outer.style.position = "absolute"; 
    outer.style.top = "0px"; 
    outer.style.left = "0px"; 
    outer.style.visibility = "hidden"; 
    outer.style.width = "200px"; 
    outer.style.height = "150px"; 
    outer.style.overflow = "hidden"; 
    outer.appendChild (inner); 

    document.body.appendChild (outer); 
    var w1 = inner.offsetWidth; 
    outer.style.overflow = 'scroll'; 
    var w2 = inner.offsetWidth; 
    if (w1 == w2) w2 = outer.clientWidth; 

    document.body.removeChild (outer); 

    return (w1 - w2); 
} 

मैं भी स्क्रॉलबार की ऊंचाई के लिए चौड़ाई मान का उपयोग किया और सूट करने के लिए SubRed के कोड को संशोधित किया गया है। यह अब एक या दोनों स्क्रॉलबार के साथ काम करता है।

मैं भी से कोड का इस्तेमाल किया:

Detecting presence of a scroll bar in a DIV using jQuery?

या तो स्क्रॉल पट्टी की उपस्थिति निर्धारित करने के लिए और उसके अनुसार चालू करने/sortable कोड के बंद अनुकूलित।

बहुत धन्यवाद।