Avatar billede j1x4r4 Nybegynder
13. juni 2007 - 11:24 Der er 13 kommentarer og
1 løsning

Javascript: "Has no properties"

Hej, jeg skriver her fordi jeg ikke lige kan komme videre.. Jeg har lavet et script med både PHP og Javascript, men mit Javascript gider ikke rigtig, og jeg aner ikke hvorfor. :)

Selve scriptet er en meget lille del af et meget større script hvor man kan vælge en farve til beskeder man sender. I starten ligger der en masse konstanter, som vil komme fra en masse andre dokumenter. Jeg har kommenteret lidt til værdierne, så I kan se hvad det er for noget.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

    <?php

    //Konstanter som senere hen vil blive inkluderet ind fra et andet dokument

    $epoch = date("U");
    $day = date("j");
    $month = date("n");
    $year = date("Y");
    $hour = date("H");
    $minute = date("i");
   
    $username = "Brugernavn";  //Brugerens brugernavn, hentet fra table users
    $type = "msg_color";        //Type kan kun indeholde "msg_color" eller "text_color"
    $msg_color = "FFFF00";      //Brugerens nuværende farver
    $text_color = "00FF00";    //Brugerens nuværende farver
    $userid = "12";                //Brugerens ID
   
    $usercolor = $msg_color;    //Brugerens nuværende farve, vil blive bestemt ud fra type i det store script
   
    ?>
<script language="javascript" type="text/javascript">
    var type = document.forms['colorform'].subtype.value;
       
    function changeColor(color, obj){
        type = document.forms['colorform'].subtype.value;            //pga problemer hentes type igen
       
        if(obj == "link"){                    //Hvis brugeren har fået farvekoden fra linket, og derfor ikke selv har skrevet koden
            document.forms['colorform'].color.value = color;    //Farvekoden bliver skrevet i et tekstfelt
        }
        var colorCode = "#"+document.forms['colorform'].color.value;    //Der sættes # foran
       
        if(type == "msg_color"){                     //Tekst farve eller baggrundsfarve?
            document.namebar.style.background = colorCode;       
            document.displaycolor.style.background = colorCode;
           
        }else if(type == "text_color"){
            document.displaycolor.style.color = colorCode;
        }
    }
</script>
<title>Farvevælger</title>
<style type="text/css">
   
    /*    COLORSETTINGS     ################################ (Skal med i style.css når scriptet er færdigt)    */

   
    #test_msg div.namebar img{   
        float:left;
       
        margin-top: -5px;
        margin-right: 5px;
        margin-bottom: 5px;
        margin-left: 5px;
           
        border-top: 1px solid #000000;
        border-bottom: 1px solid #000000;
        border-left: 1px solid #000000;
        border-right:1px solid #000000;
    }
   
    #test_msg div.namebar{
        width:438px;
        height:110px;
        text-align:left;
        color:#00FF00;
        background:#993300;
       
        padding-top: 10px;
        padding-right: 0px;
        padding-bottom: 0px;
        padding-left: 0px;
       
        margin-top: 5px;
        margin-right: 5px;
        margin-bottom: 0px;
        margin-left: 5px;
       
        border-top: 1px solid #000000;
        border-bottom: 1px solid #000000;
        border-left: 1px solid #000000;
        border-right:1px solid #000000;
    }
   
    #test_msg div.displaycolor{
        width:408px;
        text-align:left;
        color:#00FF00;
        background:#993300;
                       
        padding-top: 1px;
        padding-right: 15px;
        padding-bottom: 1px;
        padding-left: 15px;
       
        margin-top: 0px;
        margin-right: 5px;
        margin-bottom: 5px;
        margin-left: 5px;
       
        border-top: 0px solid #000000;
        border-bottom: 1px solid #000000;
        border-left: 1px solid #000000;
        border-right:1px solid #000000;
    }
   
</style>
</head>
<body>
<?php

$color[0] = "00";
$color[1] = "33";
$color[2] = "66";
$color[3] = "99";
$color[4] = "CC";
$color[5] = "FF";
   
    echo "<div id=\"test_msg\">";
        echo "<div class=\"namebar\" name=\"namebar\">\n";
            echo "<a href=\"#\"><img src=\"forum/grafik/avatar.jpg\" border=\"0\"></a>\n";
            echo "<a href=\"#\" class=\"username\">" . $username . "</a>\n";
            echo "" . $day . "/" . $month . "-" . $year . " - " . $hour . ":" . $minute . "\n";
        echo "</div>\n";   
       
        echo "<div class=\"displaycolor\" name=\"displaycolor\">\n";
            echo "En masse tekst med forskellige farver";
        echo "</div>\n";
    echo "</div>\n";
   
    echo "<div id=\"colortable\">\n";
    echo "<table class=\"colortable\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n";
   
    $i_reds = 0;
   
    while($i_reds <= 5){
       
        $reds = $color[$i_reds];
        $i_greens = 0;
       
        while($i_greens <= 5){
           
            $greens = $color[$i_greens];
            $i_blues = 0;
           
            echo "<tr>\n";
           
            while($i_blues <= 5){
                $blues = $color[$i_blues];
               
                $hex_color = $reds . $greens . $blues;
               
                echo "<td><a href=\"#\" onClick=\"changeColor('" . $hex_color . "', 'link');\" style=\"color:#" . $hex_color . "; background:#" . $hex_color . ";\">&nbsp;</a></td>\n";
               
                $i_blues++;
            }
           
            echo "</tr>\n";           
            $i_greens++;
        }
        $i_reds++;
    }
   
    echo "</table>\n";
   
    echo "<form action=\"#\" method=\"post\" id=\"colorform\" name=\"colorform\" onSubmit=\"document.forms['colorform'].ok.value = 'Loading...'\">\n";
    echo "<input type=\"hidden\" name=\"type\" value=\"user_settings\">\n";
    echo "<input type=\"hidden\" name=\"p\" value=\"users\">\n";
    echo "<input type=\"hidden\" name=\"sp\" value=\"settings\">\n";
    echo "<input type=\"hidden\" name=\"subtype\" value=\"" . $type . "\">\n";
    echo "<input type=\"hidden\" name=\"userid\" value=\"" . $userid . "\">\n";
    echo "<input tyype=\"text\" name=\"color\" class=\"text\" value=\"" . $usercolor . "\">";
    echo "<input type=\"submit\" value=\"Gem farve\" class=\"submit\" name=\"ok\">";
    echo "</form>\n";
    echo "</div>\n";

?>
</body>
</html>
Når jeg bare fortæller den at den skal skrive farvekoden i text-feltet, så virker det fint, men så snart jeg skal bruge en af de 2 divs til noget så får jeg følgende i Firefox fejlkonsol:

Fejl: document.namebar has no properties
Fejl: document.displaycolor has no properties

Jeg har også forsøgt mig med et id='namebar' og document.getElementById['namebar'].style.color

Men det gav samme resultat. Hvordan får jeg det til at virke?

MVH J1x4r4
Avatar billede roenving Novice
13. juni 2007 - 12:35 #1
document.getElementById('namebar').style.color

-- getElementById er en funktion og ikke en collection eller array !-)
Avatar billede j1x4r4 Nybegynder
13. juni 2007 - 13:30 #2
Det er sgu da rigtig nok :D

Men hvad nu hvis jeg ikke ønsker at bruge et ID? :)
Avatar billede roenving Novice
13. juni 2007 - 13:35 #3
Det er den mde man får fat i elementer på, hvis man skal bruge den anbefalede DOM-javascript binding (og iøvrigt fungerer document.all, som du ellers har brugt -- selv om du måske ikke ved det -- også primært ud fra id !-)
Avatar billede j1x4r4 Nybegynder
13. juni 2007 - 13:39 #4
Så man kan ikke gøre det jeg vil ud fra name="" ? :)
Avatar billede roenving Novice
13. juni 2007 - 13:46 #5
-- der findes også en funktion, der hedder .getElementsByName, men den regner med at der kommer et array tilbage (da der godt må være flere med samme navn, men kun eet elementet med hver unik identifikator !-)

F.eks. document.getElementsByName("namebar")[0]

-- men hvad er der galt med at bruge id ?-)
Avatar billede j1x4r4 Nybegynder
13. juni 2007 - 14:00 #6
Det er fordi jeg er ved at bygge et forum hvor brugerne kan skrive med hver sin farve osv.. Så er tanken den at i hjørnet af hver forumindlæg skal der være en knap som ændrer farverne til default, sorth/hvid fx..

Når man så trykker på den på et indlæg fra brugerid = 132, så, vil alle indlæg i den pågældende tråd, som er skrevet af bruger 132 blive til standart farve. Så kan id ikke være id="userid_132", da jeg så risikerer at der er flere id'er.

Jeg har hørt om .getElementsByName, men jeg har ikke forsøgt mig med den da jeg har at den ikke virker optimalt i alle browsere. :)
Avatar billede roenving Novice
13. juni 2007 - 14:05 #7
Så er det vel en css-klasse, du skal bruge i stedet ?-)
Avatar billede j1x4r4 Nybegynder
13. juni 2007 - 14:08 #8
Hvordan redigerer man en css-klasse fra Javascript? bare et link til en guide vil være fint.. Og du må også gerne ligge den som svar.. :P
Avatar billede roenving Novice
13. juni 2007 - 14:21 #9
Du kan ikke cross-browser redigere en css-klasse med javascript (hrm, har faktisk ikke prøvet de sidste par år, men erfaringen dengang var, at f.eks. Opera godt nok havde en property, der hed document.styleSheets, men den havde ikke selv nogle properties !-)

-- til gengæld laver du jo en hel masse serverside, så der kunne du jo bare udskrive de relevante styles i det stylesheet, du linker ind i dokumentet !o]
Avatar billede j1x4r4 Nybegynder
13. juni 2007 - 14:37 #10
Så jeg kan med Javascript fortælle den at den skal bruge en anden class? :)
Avatar billede roenving Novice
13. juni 2007 - 14:50 #11
Netop (eller flere klasser for den sags skyld !-)

f.eks.:

var elm = document.getElementById("etId");
elm.className = "sortForgrund roedBaggrund";

-- det skal tilføjes at udskiftning af klasser on-the-fly normalt er et no-go, da det performer elendigt (men der kan sagtens findes tilfælde, hvor det er i orden, et af dem er egentlige temaskift på sider, eller f.eks. denne slags brugerændringer !-)
Avatar billede j1x4r4 Nybegynder
13. juni 2007 - 14:55 #12
Okay :) Takker, smider du lige et svar?
Avatar billede roenving Novice
13. juni 2007 - 15:02 #13
Velbekomme '-)
Avatar billede roenving Novice
14. juni 2007 - 00:48 #14
-- og tak for point ;~}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester