JavaScript DOM Manipulation

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • JavaScript DOM Manipulation

    Möchte gerne in folgendem HTML-Code zwei kleine Manipulationen vornehmen:

    1. Alle Absätze <p> (außer dem ersten) sollen ausgeblendet (display:none) werden.
    2. Nach dem letzten Absatz (</p>) soll noch ein neuer Absatz mit Link (<p><a href="#">Text</a></p>) eingefügt werden.

    Code:
    <div id="ersetz_test">
    <p>Das ist ein Text der sichtbar bleibt.</p>
    <p>Dieser Text ist unsichtbar,</p>
    <p>genauso wie dieser</p>
    </div>
    Ich kenne Peter Kropffs DOM-Manipulation, scheitere aber anscheinend an den Zeilenumbrüchen.


    Gewünschtes Ergebnis wäre in etwa so:
    Code:
    <div id="ersetz_test">
    <p>Das ist ein Text der sichtbar bleibt.</p>
    <p><a href="#">Text</a></p>
    <p style="display:none;">Dieser Text ist unsichtbar,</p>
    <p style="display:none;">genauso wie dieser</p>
    </div>
    Wäre schön, wenn mir da jemand helfen könnte.

    Edit: Ach so, wäre schön, wenn das fertige Script auch damit umgehen kann, wenn neben den <p> auch <ul>-Tags und andere ausgeblendet werden können.
    Zuletzt geändert von IchBinIch; 30.09.2008, 17:20.
    ICH BIN ICH!!!

  • #2
    Hallo,

    ich weiß jetzt nicht, wie Kropff das erklärt, aber normal waren seine Erklärungen ganz annehmbar..

    Aber dein Code stimmt nicht mit aussage überein..

    der Link vor das letzte, oder nach dem 1. ?

    Versuch mal folgendes:

    PHP-Code:

    function editTheCode(){

     var 
    start document.getElementById('ersetz_test');

    /* unsichtbar machen */

     
    for(var i=1;i<start.childNodes.length;i++)
       
    start.childNodes[i].style.display 'none';

    /* Link einfügen :: nach dem 1. */

     
    var newp document.createElement('p');
     var 
    newlink document.createElement('a');
     var 
    linktext document.createTextNode('Text');
     var 
    linkhref document.createAttribute('href');
     
    linkhref.nodeValue '#';

     
    newlink.appendChild(linktext);
     
    newp.appendChild(newlink);

     
    start.insertBefore (start.childNodes[1],newp);
     

    Probier einfach mal..

    Kommentar


    • #3
      Zuerst einmal, du hast recht. Das gewünschte Ergebnis sieht so aus:

      Code:
      <div id="ersetz_test">
      <p>Das ist ein Text der sichtbar bleibt.</p>
      <p style="display:none;">Dieser Text ist unsichtbar,</p>
      <p style="display:none;">genauso wie dieser</p>
      <p><a href="#">Text</a></p> <!-- HIER GEHÖRT'S HIN! -->
      </div>
      Dann habe ich anhand deines Beispiel auch das einfügen des Links hinbekommen:

      Code:
      function editTheCode()
      {
      
      		var start = document.getElementById('ersetz_test');
      
      	var p = document.createElement("p");
      	var a = document.createElement("a");
      	a.appendChild(document.createTextNode('!!!TEXT!!!'));
      	a.setAttribute("href","#");
      	p.appendChild(a);
      
      	start.insertBefore(p,start.childNodes[2]);
      	
      //	for(var i=2;i<start.childNodes.length;i++)
      //		start.childNodes[i].style.display = 'none';
       
      }
      Hier stehe ich nun vor dem Problem, dass ich die "2" statisch angeben muss. Das liegt daran, dass ein Zeilenumbruch im Quelltext schon als Knoten erkannt wird. Zumindest ab und zu. Das könnte man wohl noch einfach über den nodeType dynamisch hinbekommen. Also auch kein problem.

      Zweites Problem ist zur Zeit auskommentiert. Fehlemeldung ist:
      Fehler: start.childNodes[i].style is undefined
      Auch das sollte sich nach dem ausfiltern der "Textknoten" erledigen.
      Zuletzt geändert von IchBinIch; 30.09.2008, 19:43.
      ICH BIN ICH!!!

      Kommentar


      • #4
        Habs nun weitestgehend vereinfacht um mit minimalem Aufwand meine Bedürfnisse zu befriedigen:

        Code:
        function shortenText(container,num)
        {
        
        	var num = typeof(num)=="undefined" ? 1 : parseInt(num);
        
        	var p = document.createElement("p");
        	var a = document.createElement("a");
        	a.appendChild(document.createTextNode('Weiterlesen...'));
        	a.onclick = function() {
        	for(var i=k;i<container.childNodes.length;i++)
        		if(container.childNodes[i].nodeType == 1)
        			container.childNodes[i].style.display = "block";
        
                p.style.display = 'none';
        
                return false;
                }
        
        	a.setAttribute("href","#");
        	p.appendChild(a);
        
        
        	var j = 0;
        	var k = 0;
        	for(var i=0;i<container.childNodes.length;i++)
        	{
        
                if(container.childNodes[i].nodeType == 1)
        		if(++j > num)
        			container.childNodes[i].style.display = "none";
        		else
        			k = i;
        	}
        
        	container.appendChild(p);
        
        }
        Verbesserungsvorschläge sind gerne gesehen.
        Zuletzt geändert von IchBinIch; 30.09.2008, 21:15.
        ICH BIN ICH!!!

        Kommentar

        Lädt...
        X