2017-12-15 77 views
5

चलो कहते हैं कि मैं इस तरह के रूप चिह्न के साथ एक पाठ, करते हैं:div में कुछ पाठ का चयन कैसे अक्षम करें?

enter image description here

और मैं इस तरह के का चयन है कि शुरू करने या चयन के अंत निशान में नहीं है अक्षम करना चाहते हैं। इसलिए, इन चुनावों के सभी संभव होना चाहिए:

enter image description here
enter image description here
enter image description here

दूसरी ओर, इन चुनावों अक्षम है या नहीं:

enter image description here
enter image description here

अब तक, मैं केवल कुछ सरल सीएसएस उपयोग करने की कोशिश,

mark { 
 
    -khtml-user-select: all; 
 
    -webkit-user-select: all; 
 
    -o-user-select: all; 
 
    user-select: all; 
 
}
This is <mark>marked text</mark>. I want to disable selecting only part of <mark>marked text</mark>.

jsfiddle link

वहाँ यह करने के लिए कोई तरीका है? किसी भी जवाब की सराहना की जाएगी!


मैंने जो हासिल करना चाहता था, हासिल किया, इसलिए मैं इसे यहां साझा करता हूं।

function checkSelection() { 
 
    var sel = window.getSelection(); 
 
    var marks = document.getElementsByTagName('mark'); 
 
    for(var i = 1; i < sel.rangeCount; i++) { 
 
    sel.removeRange(sel.getRangeAt(i)); 
 
    } 
 
    var range = sel.getRangeAt(0); 
 
    var startnode = range.startContainer; 
 
    var endnode = range.endContainer; 
 
    for (var i = 0; i < marks.length; i++) { 
 
    \t if (marks[i].contains(startnode)) { 
 
     range.setStartBefore(startnode); 
 
    } 
 
    \t if (marks[i].contains(endnode)) { 
 
     range.setEndAfter(endnode); 
 
    } 
 
    } 
 
} 
 

 
document.addEventListener('mouseup', checkSelection) 
 
document.addEventListener('touchend', checkSelection)
This is <mark>marked text</mark>. I want to disable selecting only part of <mark>marked text</mark>.

jsfiddle link

+3

मुझे ऐसा करने का कोई आसान तरीका नहीं दिख रहा है। आपको टेक्स्ट को पार्स करना होगा, माउस इवेंट्स का उपयोग करना होगा, कक्षाएं आदि जोड़ें। – kemotoe

+0

आप कुछ बग रिपोर्ट फाइल कर सकते हैं और ब्राउज़र विक्रेताओं को इसे ठीक करने की उम्मीद कर सकते हैं। https://drafts.csswg.org/css-ui-4/#valdef-user-select-all "यदि किसी चयन में तत्व का हिस्सा होता है, तो चयन में उसके सभी वंशजों सहित संपूर्ण तत्व होना चाहिए" - यह किसी क्लिक से शुरू करने के चयन के बारे में कुछ भी नहीं कहता है (जो एमडीएन हमें बताता है) –

+0

भाग के लिए "क्या ऐसा करने का कोई तरीका है", https://stackoverflow.com/questions/985272/selecting- टेक्स्ट-इन-ए-एलिमेंट-एंक-टू-हाइलाइटिंग-टू-अप-माउस (हां) –

उत्तर

1

मुझे नहीं लगता कि अकेले सीएसएस के साथ करना संभव होगा, आपको यह पता लगाने के लिए जावास्क्रिप्ट की आवश्यकता होगी कि उपयोगकर्ता किस तत्व को चुनना शुरू कर रहा है।


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

function checkSelection() { 
 
    var sel = window.getSelection() 
 
    var marks = document.getElementsByTagName('mark') 
 
    for (var i = 0; i < marks.length; i++) { 
 
    if (sel.containsNode(marks[i], false) !== sel.containsNode(marks[i], true)) 
 
     sel.removeAllRanges() // clear selection 
 
    } 
 
} 
 

 
document.addEventListener('mouseup', checkSelection) 
 
document.addEventListener('touchend', checkSelection)
mark { 
 
    background: yellow; 
 
}
This is <mark>marked text</mark>. I want to disable selecting only part of <mark>marked text</mark>.

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


यह बढ़ाया जा सकता है और अपनी पसंद को देखते हैं, लेकिन यह व्यवहार आप अपने चश्मा से चाहते हैं नकल पर मेरे सबसे अच्छे शॉट है। उपर्युक्त स्निपेट हर समय सही तरीके से काम नहीं करता है अगर चयन क्षेत्र की सीमा किसी एक चिह्नित क्षेत्र के किनारे से शुरू होती है या समाप्त होती है, लेकिन स्निपेट को किनारे के लिए थोड़ा ठीक-ट्यूनिंग के साथ काम करना चाहिए, इसके पीछे मूल अवधारणा का प्रदर्शन करना चाहिए मामलों।

+0

+1! हालांकि, जब यह चिह्न की सीमा पर चयन शुरू होता है या समाप्त होता है तो यह विफल हो जाता है। – didgogns

+0

@didgogns मैंने अपने जवाब में उस मामले का उल्लेख किया था। मैंने आपको जो कार्य पूछा है उसे पूरा करने के लिए मैंने आपको मूल कोड दिया है और समझाया कि यह क्यों काम करता है। इसे विशिष्ट वरीयताओं पर ट्यून करने के लिए, आपको इसे ठीक से व्यवहार करने के लिए इसे संपादित करना होगा। – andrewgu

0

उपयोगकर्ता के चयन सीएसएस संपत्ति अभी तक आधिकारिक नहीं है और यह केवल नवीनतम ब्राउज़र द्वारा समर्थित है।

फिर भी आप user-select: none; का उपयोग करें और सभी पाठ को एक span टैग

https://developer.mozilla.org/en-US/docs/Web/CSS/user-select

अंदर नहीं चुना जा सकता लगा लेकिन आप इस

.unselectable { 
 
    -moz-user-select: none; 
 
    -webkit-user-select: none; 
 
    -ms-user-select: none; 
 
    user-select: none; 
 
}
<p>This text can be selected, But <span class="unselectable">this</span> can only be <span class="unselectable">partially se</span>lected</p>

की तरह कुछ कोशिश कर सकते हैं कर सकते हैं

https://developer.mozilla.org/en-US/docs/Web/CSS/user-select

+1

वह नहीं चाहता कि वह चुनने में सक्षम न हो, केवल आंशिक रूप से चयन करने में सक्षम नहीं है। कुछ उपयोगी विचार प्रदान करने के लिए – Keith

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