2014-09-06 9 views
8

मैं केवल प्रशिक्षण के लिए टेक्स्टरेरा की तरह कुछ प्रोग्राम करने की कोशिश कर रहा हूं।jQuery: माउस-क्लिक स्थिति पर टेक्स्ट विभाजित करें

मैं इसमें साथ (उपयोगकर्ता जनित) पाठ एक div है:

<div id="editor">Hello! I am a Text!</div> 

अगर मैं दोनों में से "हैलो" "L", उदाहरण के लिए के बीच (बाएं mousebutton के साथ) पर क्लिक करें, मैं था इसे देखने के लिए:

<div id="editor">Hel<div id="cursor">|</div>lo! I am a Text!</div> 

मैं इसे कैसे प्राप्त करूं? अब तक, मैं इसे कर रहा हूं ...

//HTML 
<div id="editor" onclick="setCursorWithMouse()"><!-- User-Text --></div> 

//jQuery 
function setCursorWithMouse(){ 
    $('#editor').append('<div id="cursor">|</div>'); 
} 

... लेकिन, ज़ाहिर है, यह सिर्फ div के अंत में कर्सर जोड़ता है।

मुझे कैसे पता चलेगा कि उपयोगकर्ता ने वास्तव में कहां क्लिक किया था, जहां मेरा कर्सर (या जो भी) जोड़ने के लिए, टेक्स्ट को विभाजित करना है?

धन्यवाद

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

  • मैं contenteditable का उपयोग नहीं करना चाहते हैं! बस इसे इस तरह देखो: मैं माउस-क्लिक स्थिति पर एक स्ट्रिंग को विभाजित करना चाहता हूं।

  • मुझे पता है .append() वह नहीं है जो मैं ढूंढ रहा हूं! .append() बाद में, बेहतर, फ़ंक्शन के लिए प्लेसहोल्डर था। यह काम मैं अभी पूछ रहा हूँ।

  • मैं एक निश्चित चौड़ाई फ़ॉन्ट का उपयोग करता हूं।

+0

ऐसा लगता है कि आप अपना स्वयं का पाठ संपादक बनाना चाहते हैं। इसके लिए आपको [एचटीएमएल की संतुष्ट] (https://www.google.com/?q=html%20contentitable#q=html+contentitable) पर एक नज़र रखना चाहिए – hffmr

+0

मुझे संतुष्ट पता है, लेकिन मैं इसे इसके बिना करना चाहता हूं । मैं खुद को संतोषजनक के साथ एक textarea या एक div की कार्यक्षमता प्रोग्राम करना चाहता हूं, यही वह सब कुछ है ... – WcPc

+0

जब आप मौजूदा एचटीएमएल की संरचना को बदलना चाहते हैं तो 'append()' क्या अच्छा है? संतोषजनक उपयोग करें क्योंकि आपके कौशल – charlietfl

उत्तर

7

इस मैं मिल सकता है के रूप में के रूप में करीब है: DEMO

var clicked=false; 
$('#editor').click(function(e){ 
    $(this).addClass('active'); 
    var letterWidth=7; 
    $('#editor span').remove(); 
    var clickPos=e.pageX-$(this).offset().left; 
    if(!clicked) clickPos+letterWidth; 
    var letter=Math.round(clickPos/letterWidth); 
    var before=$(this).html().substr(0,letter); 
    var after=$(this).html().substr(letter,$(this).html().length); 
    $(this).html(before+'<span>|</span>'+after); 
    clicked=true; 
}); 
$(document).click(function(e){ 
    if(!$('#editor').is(e.target)){ 
     $('#editor').removeClass('active'); 
     $('#editor span').remove(); 
     clicked=false; 
    } 
}); 

मुझे आशा है कि यह काफी करीब है! :)

नोट:

इस कोड को यह सोचते हैं कि font-size16px है लिखा है!

मुझे डर है कि आपको आगे विस्तार के लिए font-size की गणना करना होगा।

+0

यह अच्छा लग रहा है! मैं इसे अपने कोड में लागू करने की कोशिश करूंगा, इसमें कुछ समय लग सकता है। मैं तब वापस आऊंगा और आपको तब "स्वीकृत उत्तर" मिल सकता है। धन्यवाद! – WcPc

+0

ठीक है, यह पूरी तरह से काम किया। आपका बहुत बहुत धन्यवाद! – WcPc

+0

आपका स्वागत है;) –

0

नोट, अपेक्षित परिणाम फ़ायरफ़ॉक्स पर वापस नहीं आते हैं; क्रोम अपेक्षित परिणाम देता है, हालांकि माउस धीरे-धीरे जारी नहीं होने पर, 1 वर्ण से बाएं या दाएं स्थानांतरित हो सकता है।

$(function() { 
 
    $(document).data("text", $("#editor").text()) 
 
    .on("mousedown", function() { 
 
     $("#editor") 
 
     .html($(this) 
 
      .data("text")) 
 
    }) 
 
    .on("mouseup", function() { 
 
     that = $("#editor"); 
 
     var sel = window.getSelection ? window.getSelection() : document.selection(); 
 
     var o = that.text(); 
 
     var before = sel.baseOffset; 
 
     var after = o.length - before; 
 
     var a = o.slice(0, before); 
 
     var b = after === 0 ? "" : o.slice(-after); 
 
     var n = "<data>|</data>"; 
 
     var html = (after === "" ? a + n : a + n + b); 
 
     that.html(html); 
 
    }); 
 
})
#editor { 
 
    font-family: Sans; 
 
    font-size: 28px; 
 
    letter-spacing: 8px; 
 
    white-space: pre; 
 
} 
 
#editor > data { 
 
    color: red; 
 
    max-width: .1em; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div tabindex="0" id="editor">Hello! I am a Text!</div>

jsfiddle http://jsfiddle.net/guest271314/maakff7q/

+0

कृपया अपनी पहेली फिर से जांचें। यह सिर्फ मौजूदा पाठ को '| के साथ डुप्लिकेट करता है वाक्यांशों के बीच। – crashwap

+1

@crashwap ओपी पर देखें "अगर मैं" हैलो "के दो" एल "के बीच (बाएं माउसबटन के साथ) क्लिक करता हूं, उदाहरण के लिए, मैं इसे देखना चाहता हूं:

Hel
|
लो! मैं एक पाठ हूं!
" _ । यदि सही तरीके से प्रश्न की व्याख्या की गई है, तो '|' डालने की आवश्यकता है जहां पाठ के भीतर क्लिक किया गया है, जहां पर क्लिक किया गया था, 'कर्सर' सिमुलेट करना? धन्यवाद – guest271314

+0

ऐसा लगता है जैसे ओपी की आपकी व्याख्या सही है: '| 'char को मौजूदा वाक्यांश में डाला जाना चाहिए, उस बिंदु पर जहां उपयोगकर्ता क्लिक करता है। लेकिन, अपने पहेली में, कर्सर वाक्यांश के अंत में डाला जाता है, और वाक्यांश को फिर से डुप्लिकेट किया जाता है (मूल वाक्यांश की दो प्रतियां बनाते हैं, जिन्हें '|' से अलग किया जाता है। * जब आप पहेली चलाते हैं तो शायद आप कुछ और देख रहे हैं? (फिर भी, यह कैसे हो सकता है?) * स्वीकार्य उत्तर के डेमो पहेली के साथ दृश्य आउटपुट की तुलना करें। *** (यह समझा सकता है कि आपका अन्यथा उत्कृष्ट उत्तर क्यों नहीं छोड़ा गया है ...) *** – crashwap

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