2013-08-03 6 views
7

की समाशोधन अक्षम करें मैं उपयोगकर्ताओं को धुरी पर मानों की एक श्रृंखला का चयन करने की अनुमति देने के लिए एक D3.js ब्रश का उपयोग करना चाहता हूं। डिफ़ॉल्ट रूप से, ब्रश के बाहर क्लिक करने से इसे साफ़ किया जाता है, ताकि कोई सीमा नहीं चुनी जा सके।D3.js ब्रश

हालांकि, मैं इस व्यवहार को समायोजित करना चाहता हूं ताकि ब्रश के बाहर क्लिक करने से ब्रश सीमा में कोई बदलाव न हो। असल में, ब्रश को साफ़ करने का कोई तरीका नहीं होना चाहिए, कुछ सीमा हमेशा चुनी जानी चाहिए।

मेरा मानना ​​है कि मुझे किसी भी तरह से समाशोधन को अक्षम करने के लिए brush event में हुक करना है, लेकिन मुझे वास्तव में यह नहीं पता कि इसके बारे में कैसे जाना है।

यहां इंटरफ़ेस का एक उदाहरण है जिसके बारे में मैं बात कर रहा हूं (Fiddle)। जब आप ब्लैक बार के बाएं या दाएं क्लिक करते हैं, तो ब्रश साफ़ हो जाता है और बार गायब हो जाता है।

मैं इस व्यवहार को निष्क्रिय कर सकते हैं?

उत्तर

7

डी 3 ब्रश डिज़ाइन कॉल 'ब्रशमोव()' ब्रश तत्व पर माउस दबाता है (यानी 'mousedown.brush' ईवेंट पर)। यदि प्रभावी रूप से पिछले ब्रश सीमा को रीसेट करने की ओर जाता है।

एक संभावित कामकाज मूल mousedown.brush हैंडलर को कस्टम के साथ प्रतिस्थापित करना है। प्रारंभिक मूसडाउन के बाद माउस को स्थानांतरित करने के बाद कस्टम हैंडलर केवल मूल हैंडलर को कॉल करेगा।

var brushNode = chart.append("g") 
    .call(brush); 

brushNode 
    .selectAll("rect") 
    .attr("y", -10) 
    .attr("height", 10); 

// store the reference to the original handler 
var oldMousedown = brushNode.on('mousedown.brush'); 

// and replace it with our custom handler 
brushNode.on('mousedown.brush', function() { 
    brushNode.on('mouseup.brush', function() { 
     clearHandlers(); 
    }); 

    brushNode.on('mousemove.brush', function() { 
     clearHandlers(); 
     oldMousedown.call(this); 
     brushNode.on('mousemove.brush').call(this); 
    }); 

    function clearHandlers() { 
     brushNode.on('mousemove.brush', null); 
     brushNode.on('mouseup.brush', null); 
    } 
}) 

demo देखें।

+1

मुझे यह विचार मिला। लेकिन मुझे आश्चर्य है कि आपको एक त्रुटि मिली है: "Uncaught TypeError: जब आप इस कोड को चलाते हैं तो संपत्ति को 'अपरिभाषित' कॉल नहीं पढ़ सकता है, ऐसा लगता है कि कोई mousemove.brush ईवेंट हैंडलर ब्रश नोड से बंधे नहीं है। – Kuan

+0

हाय @ कुआं, क्या आपने समस्या से ऊपर हल किया है? त्रुटि के साथ उपरोक्त समाधान का उपयोग कर कोई समस्या/दुष्प्रभाव हुआ है ?? –

+1

@ निथिन सीवी पोयिल नो, यह उपरोक्त उदाहरण में काम करता है, लेकिन मेरे मामले में काम नहीं करता है। जिस तरह से मैं उपयोग करता हूं वह है: प्रारंभ में ब्रश सीमा को याद रखें, और ब्रूसहेंड में, अगर (! Brush.empty()) {ext = brush.extent();} else {brush.extent (ext); } और ब्रश सेट करें और धुरी को दोबारा हटाएं – Kuan