2012-06-27 22 views
5

एक एचआईवी तत्व जैसे एचटीवी तत्व के अंदर लंबा टेक्स्ट जोड़ना, तत्व उस पाठ को लपेटता है। वास्तव में, वास्तव में इस प्रश्न पाठ की तरह। मैं इस तरह के एक HTML तत्व से पाठ कैसे ले सकता हूं और यह निर्धारित कर सकता हूं कि यह कहां टूटता है? यानी जहां एक नई लाइन डाली जाती है।मैं HTML तत्व के पाठ में "नई लाइनों" की स्थिति कैसे निर्धारित कर सकता हूं?

उदाहरण के लिए, इस बॉक्स में, "... इस तरह" के बाद एक नई रेखा है, एक "... जहां यह" और दो के बाद "... डाला गया है।"

+0

[। यह कुछ मदद की हो सकती है] (http://stackoverflow.com/questions/320184/how- टू-स्टॉप-लांग-शब्द-टू-ब्रेकिंग-माय-डिव) – xan

+0

या http://stackoverflow.com/questions/4719777/finding-line-breaks-in-textarea-that-is-word-wrapping-arabic- पाठ – Theo

+0

आप अंत में क्या करने की कोशिश कर रहे हैं? – katspaugh

उत्तर

2

तो, समस्या वास्तव में है कैसे एचटीएमएल 5 कैनवास में शब्द-रैपिंग करना है:

यह कुछ मानक HTML तत्व है जो पाठ पकड़ परिवर्तित करने के लिए सभी है और/या एचटीएमएल 5 कैनवास में एक फोटो। और दुर्भाग्यवश, '.fillText()' विधि के लिए पाठ के टुकड़े को तोड़ने के लिए पर्याप्त स्मार्ट नहीं है, इसलिए मुझे प्रत्येक पंक्ति का "मैन्युअल रूप से" पता लगाने की आवश्यकता है।

आप क्या कर सकते हैं measureText बाद में एक शब्द जोड़ना। पहले शब्द को मापें, और यदि यह आपके कंटेनर की चौड़ाई (ctx2d.measureText(words).width <= containerWidth) पर फिट बैठता है, तो आप एक और शब्द जोड़ सकते हैं और फिर माप सकते हैं। जब तक शब्दों की स्ट्रिंग फिट नहीं होती है। यदि ऐसा नहीं होता है - तो आपको अगली पंक्ति पर fillText करना होगा।

मैन्युअल डाला पंक्ति विराम का सवाल है, वे विशेष रूप से या तो textareas में \n या \r पात्रों द्वारा या HTML तत्व, <br \> तरह से HTML में प्रतिनिधित्व कर रहे हैं,। इस प्रकार, पाठ को मापने से पहले आप अनुच्छेदों द्वारा इसे विभाजित करना चाहते हैं।

textareas में:

var paragraphs = textarea.value.split('\n'); 

गैर प्रपत्र तत्वों में:

var paragraphs = []; 

// getting all <p> and elements in a typical HTML element 
// as well as individual text nodes (they are just DOM-nodes), 
// separated by <br /> elements 
var innerNodes = nonFormElement.childNodes; 

for (var i = 0, len = innerNodes.length; i += 1) { 
    // if a sub-element has some text in it, 
    // add the text to our list 
    var content = innerNodes[i].textContent; 
    if (content) { 
     paragraphs.push(content); 
    } 
} 
+0

मेरा मानना ​​है कि यह पूरा करने का प्रयास कर रहा है जो यह करने का प्रयास कर रहा है। असल में, पूर्ण पाठ लेने के लिए और एक समय में 'बफर' स्ट्रिंग में एक वर्ण जोड़ने शुरू करें और प्रत्येक प्रविष्टि के बाद, उस बफर की लंबाई (पिक्सेल में) को मापें। हालांकि, यह वास्तविक लाइन ब्रेक की समस्या का समाधान नहीं करता है। यही है, मैं कुछ खाली लाइनों को छोड़ने में सक्षम हो सकता है। फिर मैं इन पंक्तियों का पता कैसे लगाऊंगा? –

+0

@AndreiOniga, अद्यतन उत्तर देखें। – katspaugh

+0

पूरी तरह से ईमानदार होने के लिए, मैं गैर-फॉर्म तत्वों पर दृष्टिकोण को समझ नहीं पा रहा हूं। फिर भी, मैं सामग्री को जोड़ने के लिए टेक्स्टरेरा का उपयोग कर रहा हूं, फिर न्यूलाइन अक्षरों का पता लगाने के लिए .split() विधि का उपयोग करें, और माप टेक्स्ट() विधि के संयोजन के साथ, मेरा मानना ​​है कि मैं अपने लक्ष्य तक पहुंचने में सक्षम हूं । धन्यवाद! –

1

मुझे यकीन नहीं है कि आप क्या हासिल करने की कोशिश कर रहे हैं। लेकिन यहां एक साधारण चाल है जिसका उपयोग आप एकल शब्दों की स्थिति की पहचान के लिए कर सकते हैं। देखें इस fiddle


var $text = $('#text'), 
    breaks = [], 
    top; 

// wrap words (\w+) and punctuation (\S+) [well, non-word and non-space] 
// in <spans> we can easily identify 
$text.html($text.text().replace(/(\w+|\S+)/g, '<span>$1</span>')); 

$text.children().each(function() { 
    var $this = $(this), 
     _top = $this.position().top; 

    if (top === undefined) { 
     top = _top; 
    } else if (top < _top) { 
     top = _top; 
     // moved a row down 
     breaks.push($this.prev()); 
     $this.prev().css('color', 'red'); 
    } 
}); 


console.log(breaks); 
+0

रॉड, मैं इस पर आपकी मदद की सराहना करता हूं। हालांकि, जैसा कि मैंने कैट्सफ़ोफ़ के जवाब पर टिप्पणी की है, मुझे नहीं लगता कि यह लाइन ब्रेक के मुद्दे को कैसे हल कर सकता है। क्योंकि मैं कुछ बार 'रिटर्न' दबा सकता हूं (या नहीं) और 1 या अधिक खाली रेखाएं डाल सकता हूं। और मैं उन रेखाओं का पता लगाने में सक्षम नहीं हूं और वे कैनवास पर, उन्हें आकर्षित कर पाएंगे। इस समस्या को ठीक करने के तरीके पर कोई विचार? –