Thema: getElementByID-Frage

Hallo,

da ich nicht weiss, wo ich es sonst plazieren soll, einfach erst einmal hier.... smile

<?php
/*
 * Created on 12.05.2006,17:11:22 by Lockhead
 * Filename: index.php
 *
 * TODO
 */
 



session_start();
if (isset($_GET['css'])) { 
    $_SESSION['css'] = $_GET['css']; 
    header("Location: ".$_SERVER['HTTP_REFERER']);

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<title>JavaScript-CSS</title>
<link href="style1.css" rel="stylesheet" type="text/css" id="stylesheet">
<script type="text/javascript">
//<![CDATA[
function setCss(name)
{
    document.location.href = document.location.pathname+"?css="+name;
}
window.onload = function()
{
    name = <?= (isset($_SESSION['css'])) ? "'".$_SESSION['css']."'" : "false"; ?>;
    if (name)
    {
        document.getElementById("stylesheet").removeAttribute("href");
        document.getElementById("stylesheet").setAttribute("href",name+".css");
    }
    
}
//]]>
</script>
</head>
<body>

<div id="rahmen">
<h1>CSS Session Test</h1>

<p id="lore">
    Lorem ipsum dolor sit amet, consectetuer adipiscing
    elit. Phasellus tempor facilisis magna. Vestibulum
    sapien. <span id="innen">Aliquam consequat</span> libero
    vitae sem. <a href="#">Nulla</a> facilisi.
</p>

<p id="button">
    <span onclick="setCss('style1');">Style 1</span><br />
    <span onclick="setCss('style2');">Style 2</span><br />
    <span onclick="setCss('style3');">Style 3</span><br />  
    <span onclick="showDOM();">Show DOM-Tree</span><br />         
</p> 
</div>

<script type="text/javascript">
//<![CDATA[
var i = 0;
function insertP()
{
    var node2 = document.getElementById("lore");
    var node = document.getElementById("rahmen");    
    var p2 = node2.cloneNode(true);
    //document.body.innerHTML = document.body.innerHTML.replace(/[\r\n|\s]/g,'');           
    document.body.insertBefore(p2,node);
    i++;
    p2.setAttribute("id","testp"+i);
    
    
}
function removeP()
{    
    var node = document.getElementById("testp"+i);
    if (node)
    {
        var temp = document.body.removeChild(node);
        i--;
    }
    
}
var j = 0;
function appendDIV()
{
    var node2 = document.getElementById("rahmen");
    var node = document.getElementById("rahmen");    
    var p2 = node2.cloneNode(true);
    //document.body.innerHTML = document.body.innerHTML.replace(/[\r\n|\s]/g,'');           
    //document.body.insertBefore(p2,node);
    document.body.appendChild(p2);
    j++;
    p2.setAttribute("id","testdiv"+j);
    
    
}
function removeDIV()
{    
    var node = document.getElementById("testdiv"+j);
    if (node)
    {
        var temp = document.body.removeChild(node);
        j--;
    }
    
}
//]]>
</script>
<span onclick="insertP();">Insert P</span><br />
<span onclick="removeP();">Remove P</span><br />
<span onclick="appendDIV();">Insert DIV</span><br />
<span onclick="removeDIV();">Remove DIV</span><br />  

</body>
</html>

Angedacht war eigentlich folgendes:
Die Funktion insertP() sollte den Absatz mit der ID "lore" kopieren und direkt obendrueber noch einmal einfuegen. (bzw evtl auch den Text veraendern, etc...).

Wenn ich nun ueber getElementById("lore") den Absatz anspreche, dann erhalte ich immer die Meldung "ungueltige Methode....".

Auch habe ich versucht, den Absatz "button" ueber getElementByID zu "erreichen" und hatte aehnliche Probleme.

Ermoeglicht uns getElementByID nur den Zugriff auf nodes, die direkt unter dem body sitzen oder was ist das Problem?

Vielen Dank,

Liebe Gruesse, Johannes

P.S.: Wo sollen evtl Fehler/Tippfehler hin?

Zuletzt bearbeitet von Lockhead (15-05-2006 14:00:28)

Lockhead
lockhead.net

2

Re: getElementByID-Frage

Hi,

also bei mir funktioniert Dein Code unter Mozilla und dem IE .. allerdings hast Du im Header eine abschließende Klammer vergessen:

session_start();
if (isset($_GET['css'])) { 
    $_SESSION['css'] = $_GET['css']; 
    header("Location: ".$_SERVER['HTTP_REFERER']);
}  // <--- Klammer!

Falls dies schon Deinen Fehler behoben hat, wäre es ja fein wink Ansonsten müssen wir uns nochmal heran tasten ...

Lockhead schrieb:

P.S.: Wo sollen evtl Fehler/Tippfehler hin?

Am besten schickst Du mir gefunden Fehler erst mal per Email an "info [at] jg-webdesign [dot] de".

vg
Hannes

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

Re: getElementByID-Frage

Ja, also das klappt auch.

Aktuell habe ich diese funktionierende Version:

<?php
/*
 * Created on 12.05.2006,17:11:22 by Lockhead
 * Filename: index.php
 *
 * TODO
 */
 
session_start();
if (isset($_GET['css'])) { 
    $_SESSION['css'] = $_GET['css']; 
    header("Location: ".$_SERVER['HTTP_REFERER']);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<title>JavaScript-CSS</title>
<link href="style1.css" rel="stylesheet" type="text/css" id="stylesheet">
<script type="text/javascript">
//<![CDATA[
var i = 0;
function insertP()
{
    var node2 = document.getElementById("lore");
    var node = document.getElementById("lore2");    
    var p2 = node2.cloneNode(true);
    //document.body.innerHTML = document.body.innerHTML.replace(/[\r\n|\s]/g,'');           
    document.body.insertBefore(p2,node);    
    i++;
    p2.setAttribute("id","testp"+i);
    var new_node = document.getElementById("testp"+i);
    new_node.lastChild.nodeValue = new_node.lastChild.nodeValue+" Inserted with ID: "+i;
    insertRemoveLink(i);
}
function insertRemoveLink(id)
{
    var node2 = document.getElementById("insertp");
    var node = document.getElementById("removep");
    var p2 = node2.cloneNode(true);
    document.body.insertBefore(p2,node);
    p2.setAttribute('onclick', 'removeLinkP('+id+')');
    p2.setAttribute("id","removeLinkP"+id);
    p2.firstChild.nodeValue = 'Remove P'+id+' | ';
}
function removeLinkP(id)
{
    var node = document.getElementById("removeLinkP"+id);
    var p = document.getElementById("testp"+id);
    var temp = document.body.removeChild(p);
    var temp2 = document.body.removeChild(node);
}
function removeP()
{    
    var node = document.getElementById("testp"+i);
    if (node)
    {
        removeLinkP(i)
        i--;
    }    
}
//]]>
</script>
</head>
<body>
<h1 id="ueberschrift" name="ueberschrift">
AJAX_PLAYGROUND
</h1>
<p id="lore" name="lore">
    Lorem ipsum dolor sit amet, consectetuer adipiscing
    elit. Phasellus tempor facilisis magna. Vestibulum
    sapien. <span id="innen">Aliquam consequat</span> libero
    vitae sem. <a href="#">Nulla</a> facilisi.
</p>
<p id="lore2" name="lore2">
    Lorem ipsum dolor sit amet, consectetuer adipiscing
    elit. Phasellus tempor facilisis magna. Vestibulum
    sapien. <span id="innen">Aliquam consequat</span> libero
    vitae sem. <a href="#">Nulla</a> facilisi.
</p>

<span id="insertp" onclick="insertP();">Insert P</span><br />
<span id="removep" onclick="removeP();">Remove P</span><br />

<a href="index.php">INDEX</a>
</body>
</html>

Wenn ich allerdings noch ein <div> "drüber" setze, erreiche ich die darunterliegenden Absätze lore und lore2 nichtmehr - warum nicht?

Version2:

<?php
/*
 * Created on 12.05.2006,17:11:22 by Lockhead
 * Filename: insert2.php
 *
 * TODO
 */
 
session_start();
if (isset($_GET['css'])) { 
    $_SESSION['css'] = $_GET['css']; 
    header("Location: ".$_SERVER['HTTP_REFERER']);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<title>JavaScript-CSS</title>
<link href="style1.css" rel="stylesheet" type="text/css" id="stylesheet">
<script type="text/javascript">
//<![CDATA[
var i = 0;
function insertP()
{
    var node2 = document.getElementById("lore");
    var node = document.getElementById("lore2");    
    var p2 = node2.cloneNode(true);
    //document.body.innerHTML = document.body.innerHTML.replace(/[\r\n|\s]/g,'');           
    document.body.insertBefore(p2,node);    
    i++;
    p2.setAttribute("id","testp"+i);
    var new_node = document.getElementById("testp"+i);
    new_node.lastChild.nodeValue = new_node.lastChild.nodeValue+" Inserted with ID: "+i;
    insertRemoveLink(i);
}
function insertRemoveLink(id)
{
    var node2 = document.getElementById("insertp");
    var node = document.getElementById("removep");
    var p2 = node2.cloneNode(true);
    document.body.insertBefore(p2,node);
    p2.setAttribute('onclick', 'removeLinkP('+id+')');
    p2.setAttribute("id","removeLinkP"+id);
    p2.firstChild.nodeValue = 'Remove P'+id+' | ';
}
function removeLinkP(id)
{
    var node = document.getElementById("removeLinkP"+id);
    var p = document.getElementById("testp"+id);
    var temp = document.body.removeChild(p);
    var temp2 = document.body.removeChild(node);
}
function removeP()
{    
    var node = document.getElementById("testp"+i);
    if (node)
    {
        removeLinkP(i)
        i--;
    }    
}
//]]>
</script>
</head>
<body>
<h1 id="ueberschrift" name="ueberschrift">
AJAX_PLAYGROUND
</h1>
    <div id="rahmen">
    <p id="lore" name="lore">
        Lorem ipsum dolor sit amet, consectetuer adipiscing
        elit. Phasellus tempor facilisis magna. Vestibulum
        sapien. <span id="innen">Aliquam consequat</span> libero
        vitae sem. <a href="#">Nulla</a> facilisi.
    </p>
    <p id="lore2" name="lore2">
        Lorem ipsum dolor sit amet, consectetuer adipiscing
        elit. Phasellus tempor facilisis magna. Vestibulum
        sapien. <span id="innen">Aliquam consequat</span> libero
        vitae sem. <a href="#">Nulla</a> facilisi.
    </p>
</div>

<span id="insertp" onclick="insertP();">Insert P</span><br />
<span id="removep" onclick="removeP();">Remove P</span><br />

<a href="index.php">INDEX</a>
</body>
</html>
Lockhead
lockhead.net

4

Re: getElementByID-Frage

Das Problem liegt daran, dass Du die beiden Absätze innerhalb eines DIV-Container gepackt hast. Daher mußt Du den Insert auf diesen Container anwenden und nicht auf den BODY des Dokuments:

function insertP()
{
    var node2 = document.getElementById("lore");
    var node = document.getElementById("lore2");    
    var p2 = node2.cloneNode(true);
    //document.body.innerHTML = document.body.innerHTML.replace(/[\r\n|\s]/g,'');           
    // document.body.insertBefore(p2,node); 
    document.getElementById("rahmen").insertBefore(p2,node);   
    i++;
    p2.setAttribute("id","testp"+i);
    var new_node = document.getElementById("testp"+i);
    new_node.lastChild.nodeValue = new_node.lastChild.nodeValue+" Inserted with ID: "+i;
    insertRemoveLink(i);
}

Analog dazu mußt Du auch die anderen Funktionen anpassen.

vg
Hannes

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

Re: getElementByID-Frage

Super!

Dankeschön, Hannes.

Das habe ich so explizit in Deinem Buch aber auch nicht gefunden.... sad

Lockhead
lockhead.net

6

Re: getElementByID-Frage

Alles kann man leider nicht Bedenken .. ist aber ein guter Ansatz für ein späteres Update ;o)

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

Re: getElementByID-Frage

Hihi.

Natürlich nicht. Aber...du schreibst doch sicherlich schon am nächsten, tiefergehenden Buch zu diesem Thema, oder? [Ich bin bald durch.........]

Vielleicht sogar mit eigenem, tollem AJAX-Framework?

Also ich würds kaufen wink

Lockhead
lockhead.net

8

Re: getElementByID-Frage

Ehrlich gesagt, mach ich grad eine Schreibpause ... aber es ist was in Planung ;o)

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de