[JS] Highlight tekst in pagina

Pagina: 1
Acties:

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Modbreak:Topic aangemaakt nav [Javascript] Highlight tekst in zoek op pagina


Mmm... ik probeer Crisp's script om te bouwen, zodat ik een willekeurig geselecteerd stuk HTML wat geselecteerd is, een andere achtergrondskleur kan geven. Vooralsnog zonder succes.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
function commentSelection()
{
  var q = document.getSelection();      
  var s = q.getRangeAt(0);

  var i = 0, e, j, l, o, k;

  do {

    e = s[i];
    etc...


Hij geeft als foutmelding: 'e has no properties'. Dit snap ik niet, want s is toch gewoon een stuk DOM?

[ Voor 8% gewijzigd door BtM909 op 14-06-2007 20:35 ]


  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
*schop* (zie mijn vorige reactie)

Verwijderd

Rekcor schreef op donderdag 14 juni 2007 @ 16:15:
*schop* (zie mijn vorige reactie)
Post anders ff de hele do-while want op basis van dit stuk kan ik niet zoveel zeggen...

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Sterker nog, waarom nou een oud topic schoppen als je gewoon een nieuwe kan maken en verwijzen naar het oude topic ;)

[ Voor 6% gewijzigd door BtM909 op 14-06-2007 20:36 ]

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
BtM909 schreef op donderdag 14 juni 2007 @ 20:34:
Sterker nog, waarom nou een oud topic schoppen als je gewoon een nieuwe kan maken en verwijzen naar het oude topic ;)
Eh... ik dacht dat het handig was om beide oplossingen in een thread te hebben?

Hier de code:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
function highlight()
{ 
  var h = document.createElement('SPAN'); 
  h.style.backgroundColor = '#ff0'; 

  var q = document.getSelection();   //get selected text      
  var s = q.getRangeAt(0);              //get range object of selected text

  var i = 0, e, j, l, o, k; 

  do { 

    e = s[i]; 
 
    if (e.nodeType == 3) { 

      r.lastIndex = 0; 
      l = r.exec(e.nodeValue); 
      if (l != null) { 
        k = l[0].length; 
        if (r.lastIndex > k) { 
          e.splitText(r.lastIndex-k); 
          e = e.nextSibling; 
        } 
        if (e.nodeValue.length > k) { 
          e.splitText(k); 
          s[i++] = e.nextSibling; 
        } 
        o = h.cloneNode(true); 
        o.appendChild(document.createTextNode(l[0])); 
        e.parentNode.replaceChild(o, e); 
      } 

    } else { 

      j = e.childNodes.length; 
      while (j) s[i++] = e.childNodes.item(--j); 

    } 

  } while(i--); 

} 

  • funkwurm
  • Registratie: December 2005
  • Laatst online: 22-02-2021
Een simpele google zoekactie leert ons dat document.getSelection() niet bestaat. Het is window.getSelection().

[ Voor 39% gewijzigd door funkwurm op 16-06-2007 23:28 ]


  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
funkwurm schreef op zaterdag 16 juni 2007 @ 23:27:
Een simpele google zoekactie leert ons dat document.getSelection() niet bestaat. Het is window.getSelection().
:?

Ik denk dat je zoekactie te simpel was, want document.getSelection() bestaat wel degelijk :) . Het verschilt per browser. Voor de zekerheid gebruik ik nu deze functie, met hetzelfde resultaat (nl. geen :( ).


JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 * function getSelection()
 * 
 * + returns currently selected text
 **/    
function getSelectedText()
{
    var txt = '';

    if (window.getSelection)
    {
        txt = window.getSelection();        
    }
    else if (document.getSelection)
    {
        txt = document.getSelection();      
    }
    else if (document.selection)
    {
        txt = document.selection.createRange();
    }
    else return;

  return txt;
}

[ Voor 4% gewijzigd door Rekcor op 16-06-2007 23:42 ]


  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Intussen ben ik ietsje verder gekomen. Wat ik nu doe is door alle childnodes van de selectie heen lopen en <span>-tags om de textnodes zetten.

Toch doet zich nog een vervelend probleem voor. Stel de gebruiker maakt de volgende selectie:

<p>Dit is paragraaf 1</p><h3>Kopje</h3><p>Dit is paragraaf 2</p>

Dan maakt de functie getRangeAt(0); er het volgende van:

<p>Dit is parag<p>raaf 1</p><h3>Ko</h3><h3>pje</h3><p>Dit is paragraaf 2</p>

Erg aardig natuurlijk, maar e.e.a. verknald wel mijn opmaak. Zie deze voorbeeldpagina.

Hoe los ik dit op?

De relevante code is:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  /* function mark() gives the selection a red background */
  function mark()
  {
    if (window.getSelection)
    {
     var userSelection   = window.getSelection();
     var rangeObject     = userSelection.getRangeAt(0);;
     
     //extract the selection 
     oDocumentFragment = rangeObject.extractContents();
             
     //give all textnodes in document fragment a red background          
     setDomNodeBackgroundColor(oDocumentFragment, 'red');
     
     //re-insert the altered document fragment   
       rangeObject.insertNode(oDocumentFragment);       
    }
  }
  
  function setDomNodeBackgroundColor(oNode, sColor)
  {
    /* walk through all childnodes:
         - put a <span> around text nodes
         - reiterate this function for all other nodes
    */
    
    /* get childnodes */     
    var aoChildNodes = oNode.childNodes;
    var iLength      = aoChildNodes.length;
    
    for (i=0; i<iLength; i++)
    {
      var oChildNode = aoChildNodes[i];
      
      if (oChildNode.nodeType==3)
      {
        /* childnode is textnode, add span */
        setTextNodeBackgroundColor(oChildNode, sColor);
      }
      else
      {
        /* childnode is node, use this function again */
        setDomNodeBackgroundColor(oChildNode, sColor)
      } 
    }
  }
  
  function setTextNodeBackgroundColor(oTextNode, sColor)
  {
    if (oTextNode.nodeType==3)
    { 
      /* create a span with the same contents as the textnode */         
      oTextClone = document.createTextNode(oTextNode.data);
      
      oSpan = document.createElement('span');
      oSpan.style.backgroundColor = sColor;               
      oSpan.appendChild(oTextClone);
      
      /* replace the original textnode with the spanified one */
      oTextNode.parentNode.replaceChild(oSpan, oTextNode);
   }  
}  

  • funkwurm
  • Registratie: December 2005
  • Laatst online: 22-02-2021
Ik denk dat je oTextNode.data zal moeten opsplitsen in alle stukjes tekst zonder tag-chunk erin en op elke van die stukjes moet je de span replaceChild()'en.

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Bedankt!

Ik heb nu een oplossing gevonden, en wel op http://www.geof.net/code/annotation/

  • r0bert
  • Registratie: September 2001
  • Laatst online: 19:47
Is dat een oplossing of een alternatief?
Pagina: 1