2011-03-28 14 views
12

मैं div में पहला शब्द कैसे चुन सकता हूं?पहला शब्द चयनकर्ता

मुझे पहले शब्द के बाद लाइन ब्रेक डालने में सक्षम होना चाहिए, या इसे एक स्पैन टैग में लपेटना होगा। मुझे एक ही कक्षा के साथ एक पेज पर एकाधिक divs के लिए ऐसा करने की जरूरत है।

उत्तर

28

एचटीएमएल को बदलने से इवेंट हैंडलर अनबाउंड हो जाएंगे और पूरे टेक्स्ट को किसी तत्व के लिए बदल दिया जाएगा जिसके परिणामस्वरूप HTML मार्कअप खो जाएगा। सबसे अच्छा तरीका किसी भी एचटीएमएल को छूता है, जो मेल खाने वाले तत्व के पहले टेक्स्ट नोड को जोड़ता है।

function wrapFirstWord() { 
    // Select only the first text node 
    var node = $("div").contents().filter(function() { 
      return this.nodeType == 3; 
     }).first(), 

    // Get the text... 
     text = node.text(), 

    // ... and the first word 
     first = text.slice(0, text.indexOf(" ")); 

    if (!node.length) 
     return; 

    // Remove the first word from the text 
    node[0].nodeValue = text.slice(first.length); 

    // Add it back in with HTML around it 
    node.before('<span>' + first + '</span><br/>'); 
}; 

कार्य प्रदर्शन: है कि पाठ नोड के लिए, आप .contents() और .filter() उपयोग कर सकते हैं http://jsfiddle.net/9AXvN/

इस विधि का उपयोग यह सुनिश्चित करेंगे कि पहला शब्द जोड़ तोड़ के बाकी पर कोई अवांछित दुष्प्रभाव हो जाएगा तत्व की सामग्री।


आप आसानी से इस पर jQuery के लिए एक विस्तार के रूप में हमले कर सकते हैं, शब्दों की संख्या के लिए एक वैकल्पिक मूल्य के साथ आप रैप करने के लिए करना चाहते हैं:

$.fn.wrapStart = function (numWords) { 
    var node = this.contents().filter(function() { 
      return this.nodeType == 3 
     }).first(), 
     text = node.text(), 
     first = text.split(" ", numWords).join(" "); 

    if (!node.length) 
     return; 

    node[0].nodeValue = text.slice(first.length); 
    node.before('<span>' + first + '</span><br/>'); 
}; 

कार्य डेमो: http://jsfiddle.net/9AXvN/1/

+2

+1 आदमी मैं 1 मिनट देर से था! बस वही काम किया। http://jsfiddle.net/markcoleman/NdhSj/ –

+0

धन्यवाद @ एंडी ई, मुझे यकीन नहीं है कि मैं धीमा हूं, लेकिन मैं कैसे निर्दिष्ट कर सकता हूं कि कितने शब्द लपेटे गए हैं? – Evans

+3

@jdln, आप wrapStart() कॉल में शब्दों की संख्या निर्दिष्ट कर सकते हैं। '$ (" Div ") wrapStart (2);।'।साथ ही, आपको इसके बजाय इस उत्तर को स्वीकार करना चाहिए, क्योंकि यह निश्चित रूप से एक बेहतर तरीका है :) – Dogbert

1

यह आपको

First Word in String with jquery

$('div.message').text(function(i,txt) { 
    var name = $('div.name').text().split(' ')[ 0 ]; 
}); 
+0

यदि यह 'div' तत्व में अन्य HTML है तो यह तोड़ देगा। –

+0

@jdln तो आपके पास अन्य HTML तत्वों के साथ पाठ या div के साथ केवल div तत्व है? @ एंडी ई टिप्पणी के अनुसार – Vicky

+0

मेरे पास एचटीएमएल आउटपुट पर नियंत्रण है इसलिए मैं पाठ के चारों ओर एक div डाल सकता हूं। धन्यवाद – Evans

3

मूल रूप से आप इस

 
$('ELEMENT_SELECTOR').text().split(' ')[0] 
4

की तरह कर सकते हैं मदद मिल सकती है यह काम करना चाहिए:

$('div.message').each(function() { 
    var html = $(this).html(); 
    var word = html.substr(0, html.indexOf(" ")); 
    var rest = html.substr(html.indexOf(" ")); 
    $(this).html(rest).prepend($("<span/>").html(word).addClass("em")); 
}); 

JSFiddle

3

अब मैं अब इसका जवाब दे चुका हूं, लेकिन मैं jquery के लिए बहुत नया हूं और सोचा कि मैं इसे जाने दूंगा। कृपया टिप्पणियाँ!

$('div.message').each(function(index) { 
    //get the first word 
    var firstWord = $(this).text().split(' ')[0]; 

    //wrap it with span 
    var replaceWord = "<span class='myClass'>" + firstWord + "</span>"; 

    //create new string with span included 
    var newString = $(this).html().replace(firstWord, replaceWord); 

    //apply to the divs 
    $(this).html(newString); 
}); 
+0

एकमात्र टिप्पणी जो मैं जोड़ूंगा वह यह है कि '$ (यह) .html()' में छेड़छाड़ करने से अवांछित दुष्प्रभाव हो सकते हैं क्योंकि इससे सामग्रियों को हटाया जा सकता है और तत्वों के एक नए सेट के साथ प्रतिस्थापित किया जा सकता है। इसका मतलब है कि उन तत्वों से बंधे किसी भी डेटा या घटना गायब हो जाएंगी। यही कारण है कि मैंने केवल अपने जवाब में टेक्स्ट नोड को बदलने की सिफारिश की, लेकिन ऐसा लगता है कि यह ओपी के लिए चिंता नहीं है। –

+0

धन्यवाद। मैं इस धारणा पर काम कर रहा था कि हम केवल सादा पाठ divs से निपट रहे थे। –

1

असल में, आप एक प्लगइन के रूप में उपयोग करने के लिए, इतना है कि यह चयनकर्ता में सभी आइटम के लिए यह करना होगा चाहते हैं, न केवल पहले से एक का उपयोग इस एक:

$.fn.wrapStart = function(numWords){ 
    return this.each(function(){ 
     $this = $(this); 
     var node = $this.contents().filter(function(){ 
      return this.nodeType == 3 
     }).first(), 
     text = node.text(), 
     first = text.split(" ", numWords).join(" "); 
     if (!node.length) return; 
     node[0].nodeValue = text.slice(first.length); 
     node.before('<span>' + first + '</span>'); 
    }); 
}; 

http://jsfiddle.net/rxAMF/

0
/* 
URL → https://github.com/melbon/jquery.useWord 
*/ 
$.fn.lastWord = function() { 
    var text = this.text().trim().split(" "); 
    var last = text.pop(); 
    this.html(text.join(" ") + (text.length > 0 ? " <span class='lastWord'>" + last + "</span>" : last)); 
}; 


$.fn.firstWord = function() { 
    var text = this.text().trim().split(" "); 
    var first = text.shift(); 
    this.html((text.length > 0 ? "<span class='firstWord'>"+ first + "</span> " : first) + text.join(" ")); 
}; 


$("#firstWord").firstWord(); 
$("#lastWord").lastWord(); 
संबंधित मुद्दे