Динамически переносить слова в с разными начальными точками

#jquery

#jquery

Вопрос:

Я хочу динамически переносить слова внутри < h1> с помощью < em>, используя jQuery с 2 переменными:

  • Количество слов
  • Начальная точка, как n-я, но внутри тега < h1>

У меня есть некоторые до сих пор:

  jQuery(document).ready(function($) {

        $('.my-heading h1').html(function (i, html) {
        return html.replace(/(w sw )/, '<em>$1</em>')   
        });

});
  

Этот код переносит первые два слова в < em> , но мне нужно, чтобы этот код был более переменным, чтобы я мог вставить количество слов, которые должны быть обернуты, и начальную точку. Например, он должен начинаться со слова под номером 4 и заключать 3 слова в < em> .

Есть идеи?

Комментарии:

1. Как влияет количество слов?

2. @HoldOffHunger, пожалуйста, ознакомьтесь с решением ниже, это ответ на мой вопрос. Количество слов не играет роли в моем коде, вот в чем проблема :).

Ответ №1:

Для этого в javascript или jquery нет встроенных модулей, простым решением будет:

 var start = 2;
var count = 5;
$('h1').html(function(i, html){ 
    var words = $(this).text().split(' ');
    var final = '';
    for (var i = 0; i < start amp;amp; i < words.length; i  ) 
        final  = words[i]   ' ';
    final  = '<em>';
    for (; i < start   count amp;amp; i < words.length; i  )
        final  =  words[i]   ' ';
    final  = '</em>';
    for (; i < words.length - 1; i  )
        final  = words[i]   ' ';
    final  = words[words.length - 1];
    return final;
 });  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1>The em element You have to hurry up! We cannot live like this.</h1>  

По сути, это — перебирать текст до start тех пор, пока не добавится '<em>' к конечному html, затем повторять до start count тех пор, пока не добавится '</em>' , затем повторять до конца строки.

Ответ №2:

Я создал функцию с рабочей демонстрационной скрипкой, которую вы можете использовать.

Вы можете повторно запускать его с разными параметрами, чтобы изменять, какие слова переносятся так часто, как вам нравится. Это также будет работать, если начальный индекс и / или количество слов также выходят за рамки.

 function dynamicWrap(target, start_idx, words){
        // if a string target was given then convert it to a jQuery object
    if(typeof target === 'string'){
            target = $(target);
    }
    // make sure start_idx and words are numbers
    start_idx = start_idx * 1;
    words = words * 1;
    // loop thru each target element
    $.each(target, function(idx, ele){    
            var eleObj = $(ele);
        // split the text contents into an array of words
        var txtArr = eleObj.text().trim().split(/s /);        
        
        // These next two arrays will be used to store sections of the overall txtArr
        var beg = []; // these words are never wrapped
        var mid = []; // these words are always wrapped
        // and any remiaining in the txtArr will never be wrapped either
        
        
        if(start_idx === 0){            
            // pull out the words contained in the txtArr between index 0 and {words variable value}
          mid = txtArr.splice(0, words <= txtArr.length ? words : txtArr.length);          
        } else if(start_idx <= txtArr.length){          
          beg = txtArr.splice(0, start_idx <= txtArr.length ? start_idx : txtArr.length);
          mid = txtArr.splice(0, words <= txtArr.length ? words : txtArr.length);
        }
        
        eleObj.html( beg.join(' ')   ' <em>'   mid.join(' ')   '</em> '   txtArr.join(' '));
        
        
    });
}
  

Комментарии:

1. Отлично работает, большое спасибо, после тестирования обоих я пока перейду к более простому приведенному выше коду, но мне может понадобиться и этот, если мне нужно что-то повторить и переключиться на этот код.