<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Namit Singh</title>
    <description>The latest articles on DEV Community by Namit Singh (@namitsi82832881).</description>
    <link>https://dev.to/namitsi82832881</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F486748%2F475dd6c2-7f4c-4703-938b-a32dd42f4888.jpg</url>
      <title>DEV Community: Namit Singh</title>
      <link>https://dev.to/namitsi82832881</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/namitsi82832881"/>
    <language>en</language>
    <item>
      <title>Every time getRangeAt creates the Same Range?</title>
      <dc:creator>Namit Singh</dc:creator>
      <pubDate>Sat, 10 Oct 2020 10:44:23 +0000</pubDate>
      <link>https://dev.to/namitsi82832881/every-time-getrangeat-creates-the-same-range-24lc</link>
      <guid>https://dev.to/namitsi82832881/every-time-getrangeat-creates-the-same-range-24lc</guid>
      <description>&lt;p&gt;I am creating Range in the loop but every time getRangeAt creates the same Range. why is it so?&lt;/p&gt;

&lt;p&gt;My scenario is very simple I have getting positions of words from the database and on page load highlight words or substrings at those positions but every time on the first word all tags added. Like if 4 times loop runs then 4 span tags will add only on the first matching word.&lt;/p&gt;

&lt;p&gt;var r = document.createRange();&lt;br&gt;
var s = window.getSelection();&lt;br&gt;
// alert(s);&lt;br&gt;
console.log(s);&lt;/p&gt;

&lt;p&gt;// var abc = window.getSelection();&lt;/p&gt;

&lt;p&gt;var pos = 0;&lt;br&gt;
var start,end;&lt;br&gt;
var range = [];&lt;/p&gt;

&lt;p&gt;function dig(el){&lt;br&gt;
    $(el).contents().each(function(i,e){&lt;br&gt;
        if (e.nodeType==1){&lt;br&gt;
            // not a textnode&lt;br&gt;
         dig(e);&lt;br&gt;&lt;br&gt;
        }&lt;br&gt;
        else&lt;br&gt;
        {&lt;br&gt;
            if (pos
               if (pos+e.length&amp;gt;=start){&lt;br&gt;
                range.setStart(e, start-pos);&lt;br&gt;
               }&lt;br&gt;
            }&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        if (pos&amp;lt;end){
           if (pos+e.length&amp;gt;=end){
            range.setEnd(e, end-pos);
           }
        }            

        pos = pos+e.length;
    }
});  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;function highlight(element,st,en){&lt;br&gt;
    range = document.createRange();&lt;br&gt;
    start = st;&lt;br&gt;
    end = en;&lt;br&gt;
    dig(element);&lt;br&gt;
    s.addRange(range);&lt;br&gt;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;$(document).ready(function(){&lt;br&gt;
  var x;&lt;br&gt;
  var url = window.location.pathname;&lt;br&gt;
  var urlid = url.substring(url.lastIndexOf('/') + 1);&lt;/p&gt;

&lt;p&gt;$.ajax({&lt;br&gt;
  type:'GET',&lt;br&gt;
  url:'/check-words',&lt;br&gt;
  data:{urlid:urlid},&lt;br&gt;
  success:function(data){&lt;br&gt;
   for (let [index,x]  of data.entries()) &lt;br&gt;
   {&lt;br&gt;
    var jsondata = x + '';&lt;br&gt;
    var nameArr = jsondata.split(',');&lt;br&gt;
    console.log('when x is', x);&lt;br&gt;
    console.log('nameArr is', nameArr);&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var a = nameArr[0];
var b = nameArr[1];
highlight($('.main-detail-content'), a, b);
var ra = s.getRangeAt(0);   // this line always create same range even positions are different evry time loop runs.
var newNode = document.createElement("em");
newNode.appendChild(ra.extractContents());
ra.insertNode(newNode);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  }&lt;br&gt;
 })&lt;br&gt;
}); &lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
