Avatar billede Slettet bruger
27. maj 2006 - 21:38 Der er 83 kommentarer og
2 løsninger

Syntaks fejl i eval()

Jeg evaluerer en kode (http://phpfi.com/120228), men får en syntaks fejl på linie 1 af den evaluerede kode(http://phpfi.com/120229), ligemeget hvad denne linie indeholder. Ved i hvad fejlen kan være?
Avatar billede mclemens Nybegynder
27. maj 2006 - 21:49 #1
Kan du uddybe dit script / kildemateriale - eller evt. sige hvad
du gør for at få fejlen eller komme med et fejl eksempel?

... en lille test af det her:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="content-type" content="text/html; charset=iso-8859-1"><title>Ingen titel</title>

<script type="text/javascript">

var allOptions = new Array();
allOptions[0] = 'Alle';
allOptions[7] = 'BMX';
allOptions[5] = 'Road';
allOptions[6] = 'Shopper';

function changeBikeModels(newOptions) {
    var myEl = document.searchForm.bikeModel;
    eval(newOptions);   
    createOpts(myEl, allOptions);
}


function createOpts(nr1,nr2){
/* test script del - muligvis det oprindelige ukendte script der giver fejlen */
alert("myEl ... nr1 variablen fra input felt er:\n"+nr1);
alert("allOptions ... nr2 array er:\n"+allOptions);
}
</script>
</head>

<body>

<b onclick="changeBikeModels(allOptions);">Test</b>

<form name="searchForm">
<input value="Tester" name="bikeModel">
</form>

</body></html>
Avatar billede Slettet bruger
27. maj 2006 - 22:15 #2
Selve fejlen kan ses på : http://cykeltjek.notenet.dk :)
Den fremkommer kun i Firefox.
Avatar billede mclemens Nybegynder
27. maj 2006 - 23:20 #3
Har kigget lidt på den... Har dog ikke sat mig ind i xmlhttprequest... Hvorfor FF advarer undrer jeg mig lidt over... Ligner problemer med eval af af responsetext ved ikke om det er fordi det skal escapes eller om det skal leveres med en bestemt xml mimetype... Kan ikke lige se løsningen - desværre... :/
Avatar billede olebole Juniormester
27. maj 2006 - 23:27 #4
<ole>

Du skal returnere en streng. Ellers bør du ikke kunne bruge eval  :)

/mvh
</bole>
Avatar billede mclemens Nybegynder
27. maj 2006 - 23:28 #5
det her er strengen olebole
var allOptions = new Array(4); allOptions[0] = 'Alle'; allOptions[7] = 'BMX'; allOptions[5] = 'Road'; allOptions[6] = 'Shopper';
Avatar billede mclemens Nybegynder
27. maj 2006 - 23:29 #6
new Array(4); burde nok være new Array(); og resten nummeret fortløbende ... men det har ingen indflydelse på fejlen...
Avatar billede olebole Juniormester
27. maj 2006 - 23:29 #7
Jamen, det er jo ikke en streng. Der skal gåseøjne omkring  :)

var ret = "'noget', 'noget andet', 'noget tredie'";
eval("var myArray = new Array(" + ret + ");");
Avatar billede olebole Juniormester
27. maj 2006 - 23:31 #8
- og med dit eksempel:

var myStr = "var allOptions = new Array(4); allOptions[0] = 'Alle'; allOptions[7] = 'BMX'; allOptions[5] = 'Road'; allOptions[6] = 'Shopper';"

eval(myStr);
Avatar billede olebole Juniormester
27. maj 2006 - 23:32 #9
Hvis du alert'er din responseText, skal der stå:

var myStr = "var allOptions = new Array(4); allOptions[0] = 'Alle'; allOptions[7] = 'BMX'; allOptions[5] = 'Road'; allOptions[6] = 'Shopper';"

- i alert-box'en  ;o)
Avatar billede olebole Juniormester
27. maj 2006 - 23:34 #10
Vrøvl ...! Jeg må lige kikke din kode lidt nærmer efter - for kode-eksemplet i din spm-tekst passer ikke  =)
Avatar billede olebole Juniormester
27. maj 2006 - 23:38 #11
Det er bare dine linjeskift, der skaber problemer. Sørg for responseText'en ser sådan ud:

var allOptions = new Array(4);allOptions[0] = 'Alle';allOptions[2] = 'City Classic';allOptions[3] = 'Edge';allOptions[1] = 'Logic';
Avatar billede mclemens Nybegynder
27. maj 2006 - 23:39 #12
27/05-2006 22:15:40 , wicez kode er her ... gem siden rediger fetch.js : http_request.open('GET', '1.txt', true); og gem den streng jeg smed i 1.txt ...
Avatar billede mclemens Nybegynder
27. maj 2006 - 23:40 #13
update ok :)
Avatar billede olebole Juniormester
27. maj 2006 - 23:40 #14
Som du gør nu, svarer det til dette:

var myResponse = "var allOptions = new Array(4);
allOptions[0] = 'Alle';
allOptions[2] = 'City Classic';
allOptions[3] = 'Edge';
allOptions[1] = 'Logic';"

eval(myResponse);

- og det går naturligvis ikke  ;o)
Avatar billede Slettet bruger
27. maj 2006 - 23:42 #15
Jeg er ikke helt med mere. Bør det ikke fungere korrekt, eller skal jeg smide det hele i en variabel?
Avatar billede olebole Juniormester
27. maj 2006 - 23:44 #16
Du må bare ikke indsætte linjeskift i din responseText. Hvad bruger du som break-tegn - '\n'?
Avatar billede Slettet bruger
27. maj 2006 - 23:45 #17
Det gør ingen forskel om jeg fjerner linieskiftene.
Avatar billede olebole Juniormester
27. maj 2006 - 23:46 #18
Har du ændret det online?
Avatar billede Slettet bruger
27. maj 2006 - 23:47 #19
Det har jeg nu.
Avatar billede Slettet bruger
27. maj 2006 - 23:47 #20
Ja jeg brugte \n. Men det var alene for overskuelighedens skyld.
Avatar billede mclemens Nybegynder
27. maj 2006 - 23:51 #21
Lokalt får jeg også fejl ved denne her (forsøger bare på at alert'e responsetext) ... tyder på at xml requesteren har lidt problemer med xml leveringen - ved ikke om det er fordi den skal leveres med xml mime type og det derfor ikke virker lokalt ???

Fejl: Syntaksfejl
Kildefil: file:///C:/Documents%20and%20Settings/HP_Ejer/Dokumenter/1.txt
Linje: 1, Kolonne: 1
Kildekode:a^
... kun et a i kildefilen...
Avatar billede olebole Juniormester
27. maj 2006 - 23:54 #22
Prøv at sætte ignoreWhitespace=true på dit XMLHttpRequest-objekt
Avatar billede Slettet bruger
27. maj 2006 - 23:55 #23
Fejlen betyder heller intet funktionsmæssigt, da scriptet virker som det skal i både Internet Explorer og Firefox. Jeg er alene ked af tanken om, at jeg har lavet et script der ikke kan valideres som værende korrekt ifølge de af w3.org angivne standarder. :)
Avatar billede mclemens Nybegynder
27. maj 2006 - 23:58 #24
det er xml requesteren der vist bugger som olebole nævner ... hvis jeg skifter fetch.js til min xml requester får jeg ingen problemer ... så det kan ikke være resultatet ... og nok heller ikke whitespaces da der kun var et "a" i min test...
Avatar billede Slettet bruger
27. maj 2006 - 23:59 #25
Jeg vil antage at det skal sættes sådan:

http_request.ignorewhitespace(true);

Men får en fejl kastet i hovedet om, at ignorewhitespace ikke er en funktion.
Derfor prøvede jeg:

http_request.ignorewhitespace = true;

Hvilket dog bare giver mig samme problem som før.
Avatar billede mclemens Nybegynder
27. maj 2006 - 23:59 #26
må jeg requeste xml fra dit site midlertidig???
Avatar billede Slettet bruger
28. maj 2006 - 00:01 #27
Jep. Men jeg tror ikke det er xml jeg smider tilbage :)
Avatar billede mclemens Nybegynder
28. maj 2006 - 00:01 #28
ok, og nåh nej det er jo rigtigt :D
Avatar billede olebole Juniormester
28. maj 2006 - 00:02 #29
FF opfatter whitespace anderledes - både i HTML og XML - end IE gør. Derfor får du ingen fejl i IE.

Generelt har jeg erfaret, at med folks forskellige måder at encode på, m.m. er den sikreste måde at lave AJAX på, at sende et XML-dokument tilbage med et dokument-element, hvori strengen lægges CDATA-escaped.

Når browseren modtager, bruger du så dokument-elementets indhold, som du så kan eval'e
Avatar billede Slettet bruger
28. maj 2006 - 00:04 #30
Jeg har på fornemmelsen, at jeg udfører mit "AJAX" forkert, hvilket jeg naturligvis alene har gjort af uvidenhed, og ikke fordi jeg føler mig på et plan over andre :)

Hvis i vil uddybe lidt, hvordan jeg ellers vil kunne sende data fra php, som derefter bliver til indhold i mine select's, vil jeg være meget taknemmelig. Jeg har selv "bakset" det her sammen, så det er et produkt af min fantasi - ikke af en erfaren programmør.
Avatar billede Slettet bruger
28. maj 2006 - 00:06 #31
Jeg forstår godt systemet i xml, og finder det meget logisk og bekvemt, at man udskriver data som man gør. Det er mig derimod en gåde, hvordan jeg skal overføre det direkte til javascript og derfra til min sides indhold.
Avatar billede olebole Juniormester
28. maj 2006 - 00:13 #32
Hvis du lader PHP skrive noget på formen:

<?
header("Content-Type: text/xml; charset=ISO-8859-1");

$js = "var myArr = new Array('noget', 'noget andet', 'noget tredie')";
$xml = "<ajaxData><![CDATA[".$js."]]></ajaxData>";

print "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>";
print $xml;
?>

Så bør du kunne skrive:

var oResp = XMLOBJ.responseXML;
eval(oResp.documentElement.firstChild.firstChild.nodeValue);
Avatar billede olebole Juniormester
28. maj 2006 - 00:16 #33
- og sæt tegnsættet i HTML-dokumentet med en meta  ;o)
Avatar billede Slettet bruger
28. maj 2006 - 00:17 #34
Hvis jeg eksempelvis laver et dokument indeholdende:

<?xml version="1.0" encoding="ISO-8859-1"?>
<options>
    <_1>Mærke1</_1>
    <_2>Mærke2</_2>
    <_3>Mærke3</_3>
    <_4>Mærke4</_4>
</options>

Hvordan er det så muligt at få det ind som options i min <select> ?
Avatar billede olebole Juniormester
28. maj 2006 - 00:18 #35
Jeg tror, du skal beslutte dig for, hvad du vil - og hvordan du vil gøre det  :)
Avatar billede Slettet bruger
28. maj 2006 - 00:19 #36
Jeg vil bestemt gerne have xml ind. Det virker mest overskueligt (og åbenbart mest korrekt :))
Avatar billede olebole Juniormester
28. maj 2006 - 00:21 #37
Nej, der er ikke mest korrekt - men blot et valg. Der er ikke nogen bestemt måde at lave AJAX på, der er 'mest korrekt'. Har du prøvet det, jeg skrev før?
Avatar billede Slettet bruger
28. maj 2006 - 00:23 #38
Jeg sidder og kæmper. Jeg får en xml-fejl.

Min nye javascript funktion:

function changeBikeModels(newOptions) {
    var myEl = document.searchForm.bikeModel;
   
    eval(newOptions.documentElement.firstChild.firstChild.nodeValue);   
    createOpts(myEl, allOptions);
}

og mit php dokument der udskriver det:

<?php
header("Content-Type: text/xml; charset=ISO-8859-1");

class ajax {
    function bikeModels($bikeProducer) {
        global $core;
       
        $values[0] = "Alle";
        $query = $core->db->query("SELECT * FROM bikemodels WHERE producerId = ". $bikeProducer ." ORDER BY name ASC");
        while($row = mysql_fetch_object($query)) {
            $values[$row->id] = $row->name;
        }       

        $js[] = "var allOptions = new Array(". count($values) .");";
       
        foreach($values as $key => $name) {
            $js[] = "allOptions[". $key ."] = '". $name ."';";
        }
       
        $buffer[] = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>";
        $buffer = "<ajaxData><![CDATA[". implode($js) ."]]></ajaxData>";
       
    echo implode($buffer);
    }
}
?>
Avatar billede Slettet bruger
28. maj 2006 - 00:24 #39
Det virker som om, at den opfatter min "hovedside" som værende xml på grund af den nysatte header.
Avatar billede olebole Juniormester
28. maj 2006 - 00:24 #40
- hvad siger fejlen? Kan jeg se eksemplet på WWW?
Avatar billede Slettet bruger
28. maj 2006 - 00:26 #41
Yes nu er den oppe: http://cykeltjek.notenet.dk
Avatar billede Slettet bruger
28. maj 2006 - 00:27 #42
Fejlen skyldtes en fejl i mit php på 6. sidste linie. Den er rettet nu, og resultatet findes online også. Der sker bare intet. :/
Avatar billede olebole Juniormester
28. maj 2006 - 00:29 #43
Skrot projektet og begynd helt forfra med ganske simple eksempler, til du har fået styr på XML/AJAX. Det tror jeg, du kommer længst med  :)
Avatar billede olebole Juniormester
28. maj 2006 - 00:30 #44
- man skal ikke lære at svejse lodret-faldende ved at bygge en Storebælts bro  ;o)
Avatar billede Slettet bruger
28. maj 2006 - 00:32 #45
Jeg tror du har ret. Jeg vil bestemt ikke skrotte projektet, men jeg bør nok kigge lidt på generel AJAX, før jeg går videre til det mere avancerede. Kan jeg prikke til dig i denne tråd, hvis jeg opretter nye spørgsmål ang. AJAX?

Og smid et svar tak, begge to. Så smider jeg naturligvis 30 point til jer hver for indsatsen (omend ikke meget, så et symbol for min tak :)).
Avatar billede olebole Juniormester
28. maj 2006 - 00:35 #46
Mail-systemet er ikke helt pålideligt for tiden, men du er altid velkommen til at prikke - så må vi se, om jeg opdager det. Gør jeg, skal jeg nok komme dig til hjælp. Det er bare lidt svært at tage AJAX helt fra Adam og Eva i en tråd som denne  :)

Jeg mente naturligvis ikke 'droppe projektet' på dén måde. Kun i forbindelse med at lære AJAX  ;o)
Avatar billede olebole Juniormester
28. maj 2006 - 00:35 #47
- og et bette svar  :)
Avatar billede mclemens Nybegynder
28. maj 2006 - 00:38 #48
ok, har også kigget lidt på ajax... men da jeg p.t. kun kan xhtml så lod jeg det vente lidt på sig ... har ikke noget at bruge det til p.t. :/
Avatar billede Slettet bruger
28. maj 2006 - 00:44 #49
Avatar billede mclemens Nybegynder
28. maj 2006 - 00:45 #50
tak for point ... kom ikke rigtig til vejs ende med den xmlrequest test :/
- her var det punkt jeg nåede til ... men den er ikke komplet med error handling og om den kan håndtere xml texten kunne jeg ikke rigtig finde ud af :/


/* This function handles the data recieved */
function handleajaxreq(){
// Split the comma delimited response into an array
results = datafetcher.responseText;
eval(callback+results);
}


/* Dont touch below unless you want to change the ajax handling */
var busystate=false;
var datafetcher;
if(window.ActiveXObject){
datafetcher=new ActiveXObject("Microsoft.XMLHTTP");
}else if(window.XMLHttpRequest){
datafetcher=new XMLHttpRequest();
}

var callback="";
var act="";

function makeHttpRequest(action, callback_function){
act=action;callback=callback_function;
if(busystate==false){
  ajaxgetdata();
}
}

function ajaxgetdata(){
busystate = true;
datafetcher.open("GET", "fetchData/?"+act, true);
datafetcher.onreadystatechange=ajaxchkstate;
datafetcher.send(null);
}

function ajaxchkstate(){
if(datafetcher.readyState==4){
  handleajaxreq();
  busystate=false;
}
}
Avatar billede olebole Juniormester
28. maj 2006 - 00:46 #51
Personligt foretrækker jeg JSON til respons-formatering:
    http://www.json.org/

- fremfor XML ... eller rettere en blanding. Her ender jeg op med et dokument, der kan se sådan ud:

<?xml version="1.0" encoding="ISO-8859-1"?>
<ajaxDoc>
<dataData><![CDATA[
{enVar:"noget", "etArray":["noget", "noget andet", "noget tredie"]}
]]><dataData>
</ajaxDoc>

På klienten, kan jeg så skrive noget à la:

var oResp = XMLOBJ.responseXML;
var docElm = oResp.documentElement;
var sResp = docElm.getElementsByTagName("ajaxData")[0].firstChild.firstChild.responseText;

eval("var ajaxResp = " + sResp);

alert("returneret variabel =>" + ajaxResp.enVar);
alert("returneret array =>" + ajaxResp.etArray);

Det er en effektiv måde at komme udenom de værste problemer på  =)
Avatar billede olebole Juniormester
28. maj 2006 - 00:48 #52
Mjaaa ... sådan skal XML-dokumentet så se ud:

<?xml version="1.0" encoding="ISO-8859-1"?>
<ajaxDoc>
<ajaxData><![CDATA[
{enVar:"noget", "etArray":["noget", "noget andet", "noget tredie"]}
]]><ajaxData>
</ajaxDoc>
Avatar billede mclemens Nybegynder
28. maj 2006 - 00:49 #53
[ Det er en effektiv måde at komme udenom de værste problemer på  =) ]
... den gemmer jeg da lige så :) - hvis nu jeg vil rode med xmlrequest på et tidspunkt :)
Avatar billede olebole Juniormester
28. maj 2006 - 00:49 #54
Hvis du overvejer at bruge JSON, kan det være denne kan hjælpe til at forstå baggrunden:
    http://www.eksperten.dk/artikler/227
Avatar billede mclemens Nybegynder
28. maj 2006 - 00:50 #55
næsten ;)
<ajaxData> -> </ajaxData>
Avatar billede olebole Juniormester
28. maj 2006 - 00:51 #56
mclemens >> (28/05-2006 00:48:02)  ;o)
Avatar billede mclemens Nybegynder
28. maj 2006 - 00:53 #57
[ mclemens >> (28/05-2006 00:48:02)  ;o) ] - nemlig :o)
- og tak for link læser nok imorgen ... det er jo lidt sent :)
Avatar billede olebole Juniormester
28. maj 2006 - 00:59 #58
JSON er en herlig måde at få returneret data på, da de direkte kan bruges i JS. Et database kald vil således kunne returnere et recordset, der ser sådan ud:

{"rows":[{"id":"123", "navn":"olebole"}, {"id":"234", "navn":"mclemens"}, {"id":345, "navn":"wicez"}]}

Efter en eval, hvor du lægger respons-objektet i variablen 'oResp', kan du så:

for (var i=0; i<oResp.length; i++) {
    alert(oResp[i].navn + " har denne ID: " + oResp[i].id);
}

- fuldstændig, som du ville behandle et recordset på serveren. Livet bliver zq nemt  ;o)
Avatar billede olebole Juniormester
28. maj 2006 - 01:00 #59
- igen vrøvl  :D

for (var i=0; i<oResp.rows.length; i++) {
    alert(oResp.rows[i].navn + " har denne ID: " + oResp.rows[i].id);
}
Avatar billede mclemens Nybegynder
28. maj 2006 - 01:07 #60
Jeps, det ser lidt lettere ud :)
Avatar billede olebole Juniormester
28. maj 2006 - 01:19 #61
- og en ting, der afskrækker mange ved brugen af DOM, er, at man skal oprette alle de forbande elementer - formatere dem - og klistre dem ind. Her er et lille nordkaukasisk cowboy-trick:

<script type="text/JavaScript">
var oTempl = oDestBody = null;
window.onload = function() {
    var templCont = document.getElementById("templ");
    oTempl = templCont.getElementsById("tr")[0];
    templCont.parentNode.removeChild(templCont);
    oDestBody = document.getElementById("tblBody");
}
</script>

<div id="templ" style="display:none">
<table>
<tbody>
<tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
</tr>
</tbody>
</table>
</div>

<table>
<thead>
    <th>ID</th>
    <th>Navn</th>
</thead>
<tbody id="tblBody">
</tbody>
</table>

- så kan du, når du løber dit recordset igennem, indsætte brugere i tabellen på denne måde:

var oTmp, aCells, rows = oResp.rows;
for (var i=0; i<rows.length; i++) {
    oTmp = oTempl.cloneNode(true);
    aCells = oTmp.getElementsByTagName("td");
    aCells[0].firstChild.nodeValue = rows[i].id;
    aCells[1].firstChild.nodeValue = rows[i].navn;
    oDestBody.appendChild(oTmp);
}

Det kan naturligvis laves meget mere elegant, hvis man laver det OOP'et, men allerede på denne måde, er der tale om effektiv kode, der er tudelet at have med at gøre  :)
Avatar billede olebole Juniormester
28. maj 2006 - 01:28 #62
Hvad angår AJAX, skal man dog holde sig en altid nærværende faldgrubbe for øje:
    For en mand med en ny hammer kommer alt til at ligne søm

AJAX er godt til mange ting, men ikke indhold, der er vigtigt i forhold til søgemaskiner. Ellers skal der under alle omstændigheder linkes til det, så disse kan finde informationerne - og der skal måske laves en JS-redirect til AJAX-udgaven, hvis en bruger havner på siden for søgemaskinerne via et link på Google. Det kan gøres, men bliver let omfattende - og svært at vedligeholde, hvis man ikke holder tungen lige  :)

Desuden kan det være et problem i forhold til handicappede, som skal have mulighed for alternativ tilgang til vigtig information, valg, m.m.

Brugt fornuftigt er der dog ingen tvivl om, det er en teknik med store muligheder for at bedre brugervenlighed ..... og mindske serverload  ;o)
Avatar billede mclemens Nybegynder
28. maj 2006 - 01:28 #63
Jeps dom bliver bedrer og bedrer med øvelse... (vigtigst er nok abstract tankegang ved størrer koder og overskuelighed af disse) og nogle gange kan man være ekstrem heldig og få noget bonus man ikke lige regnede med (i slutningen af tråden) ... i den nævnte tråd brugte jeg også clonenode scriptet der var lavet af roenving - men slutresultatet blev noget lidt andet :D

har også leget med at løbe lidt ... http://www.eksperten.dk/spm/697893
- øvelse, vidensforøgelse og belønning (typisk point) det må være grundpillerne her på Eksperten :)
Avatar billede mclemens Nybegynder
28. maj 2006 - 01:33 #64
[ AJAX er godt til mange ting, men ikke indhold ... ] - helt enig ... der er mange ting jeg gerne ville - men afholder mig fra :/ http://www.eksperten.dk/spm/711688#rid6277373

[ Det kan gøres, men bliver let omfattende - og svært at vedligeholde, hvis man ikke holder tungen lige ] - jeps ... http://www.eksperten.dk/spm/711971 ... desværre
- de kunne godt tage og sørge for at søgemaskiner lærte js  :D (ved godt serverne at sikkert ville gå helt ned)
Avatar billede mclemens Nybegynder
28. maj 2006 - 01:34 #65
åh joh, den med clonenode var dette link ... det glemte jeg http://www.eksperten.dk/spm/702912
Avatar billede Slettet bruger
28. maj 2006 - 01:36 #66
Så virker det :)

http://cykeltjek.notenet.dk/

Den opretter et xml-dokument alá:

<?xml version="1.0" encoding="ISO-8859-1"?>
        <optionsList>
            <option id="0" name="Alle" />
            <option id="7" name="BMX" />
            <option id="5" name="Road" />
            <option id="6" name="Shopper" />
        </optionsList>

Og smider det perfekt ind i min select :)

Tak for hjælpen gutter. Og vær venlige at smide et svar i det andet spørgsmål.
Avatar billede mclemens Nybegynder
28. maj 2006 - 01:36 #67
P.s.: Du har nu nogle gode måder at viderebringe budskaber på i dine artikler Olebole ... jeg har ikke læst så meget endnu ... men, toget kører fra startstationen til slutstationen ved gennemlæsning af artiklen :)
Avatar billede mclemens Nybegynder
28. maj 2006 - 01:37 #68
super :)
Avatar billede Slettet bruger
28. maj 2006 - 01:38 #69
Jeg beklager den pludselige afbrydelse af jeres debat. Jeg ville såmænd ikke ødelægge diskussionen, jeg ville bare bringe lidt glæde på banen :)
Avatar billede mclemens Nybegynder
28. maj 2006 - 01:40 #70
- gør ikke spor ;D
Avatar billede olebole Juniormester
28. maj 2006 - 01:54 #71
wicez >> det er zq os, der hijacker din tråd. Der gik vi nok over stregen ....... og vi gør det igen imorgen  ;D

mclemens >> Tak - ja somme vil nok finde det lidt tumpet/infantilt med LillePer futtog und alles. Det er det nok også, men jeg tror, det virker  :)

Programmering er ikke så abstrakt, som det umiddelbart kan synes. Det er - ikke mindst, hvis man arbejder med OOP (og JS er jo netop objekt-baseret) - en klon af vores måde at opfatte omverdenen på ...... som objekter med egenskaber og indbyggede metoder - eller evner, om du vil.

Tricket er, at få folk til at opdage det. Så kan programmering af en applikation og den måde, man oplever koden på, blive ligeså konkret som det at sætte sig op på en cykel og køre til bageren efter basser.
I den forbindelse tror jeg på, analogier til manifestationer in real life, kan være en stor hjælp. Hvis de ovenikøbet er en smule sære/tumpede eller skiller sig ud på anden måde, er de faktisk lettere at huske.

I mine unge teenageår havde jeg altid svært ved at huske rækkefølgen i Ohm's Lov ... hvad skulle ganges med hvad for at give noget. Lige indtil en gammel radiomekaniker lærte mig "Ohm's Udvidede Lov":
    Spænding opstår, når man tager strøm på en pige, der yder modstand

Siden var der aldrig tvivl i mit sind - og jeg kan huske den små 40 år efter  ;o)
Avatar billede mclemens Nybegynder
28. maj 2006 - 02:16 #72
[ Tak - ja somme vil nok finde det lidt tumpet/infantilt med LillePer futtog und alles. Det er det nok også, men jeg tror, det virker ... ]
Det er jeg overbevist om at den gør ... det kunne nok ikke fortælles mere logisk
... det er nelig et fint tegn på en js funktion, kan forestille en "klon" af en del af en virkelighed, som du selv udtrykker det ... føler heller ikke programmering er speciel abstrakt når man kommer lidt ind i det :)
Avatar billede mclemens Nybegynder
28. maj 2006 - 02:34 #73
Fin artikel :)
Avatar billede olebole Juniormester
28. maj 2006 - 02:47 #74
Tak  :)
Avatar billede olebole Juniormester
28. maj 2006 - 02:48 #75
Har du kodet VBScript og kende de collections?
Avatar billede olebole Juniormester
28. maj 2006 - 02:59 #76
I så fald kan du lege lidt med dette objekt:

function BaseObject() {
    this.toString = function(){
        if (this._className) return "[object "+this._className+"]";
        return "[object Object]";
    };
    return this;
}

function JSCollectionObject(clName) {
    this._oRXp = new RegExp("[^a-z0-9\.\:\{\}_-]+", "i");
    this._className = (typeof clName!="string" || this._oRXp.test(clName)) ? "JSCollectionObject" : clName;
    this.prototype = new BaseObject;
    BaseObject.call(this);
    this._a = [];
    this.count = 0;
   
    this.add = function(item, key, inx) {
        if (typeof key!="string" || this._oRXp.test(key)) {
            alert("Key is not set - or is of wrong type");
            return false;
        }
        if (typeof inx=="number") this._a.splice(inx, 0, key);
        else this._a.push(key);
        this._a[key] = item;
        this.count++;
    }
   
    this.item = function(inx) {
        if (typeof inx=="number") return this._a[ this._a[inx] ];
        else if (typeof inx=="string" && !this._oRXp.test(inx)) return this._a[inx];
        else {
            alert("Index or key is of wrong type");
            return false;
        }
    }
   
    this.remove = function(inx) {
        if (typeof inx=="number") {
            if (inx>=this.count) return alert("Out of bound");
            delete this._a[ this._a[inx] ];
            this._a.splice(inx, 1);
            this.count--;
        }
        else if (typeof inx=="string" && !this._oRXp.test(inx)) {
            if (!this._a[inx]) return alert("Key can't be found");
            for (var i=0,j=this.count; i<j; i++) {
                if (this._a[i]==inx) this._a.splice(i, 1);
            }
            delete this._a[inx];
            this.count--;
        }
        else {
            alert("Index or key is of wrong type");
            return false;
        }
    }
   
    this.clear = function() {
        this._a = [];
        this.count = 0;
    }
   
    return this;
}

Det kan bruges ligesom VB-collections - f.eks:

var o = new JSCollectionObject("myTestObject");
alert(o);

var a = ["noget", "noget andet", "noget tredie"];
o.add(a, "myArray");
alert(o.item("myArray");
alert(o.count);
alert(o.item(0);

- og bruger de egenskaber, du lige har siddet og læst om. Gå lidt på opdagelse i det og lær  ;o)

Base-objektet bruger jeg, så objektet identificerer sig selv ved en evt. JS-fejl. Det bruger jeg efterfølgende til alle andre objekter i en given applikation og extend'er det af og til med yderligere properties/metoder - alt efter, hvad der måtte være behov for  :)
Avatar billede mclemens Nybegynder
28. maj 2006 - 03:00 #77
Aldrig, kun lært html fra ældgammel bog i '99
- "Egen hjemmeside på 15 minutter" vist nok...

Og sidste år:
- xhtml og css fra w3c.
- php og mysql fra php 5 og start på mysql.
- javascript fra bogen "Javascript 1.5" og i år:
tilretning/forbedring fra roenving samt dig...

... Er det bedrer med VBScript end C?
Avatar billede mclemens Nybegynder
28. maj 2006 - 03:02 #78
ok, kigger lidt på den imorgen :D
Avatar billede olebole Juniormester
28. maj 2006 - 03:09 #79
;o) ... I dette collection-objekt har hvert element en key og en talindekseret plads.

Metoder:
add(item, key, inx [optional])
    'inx' bestemmer, hvor emnet indsættes

item(inx)
    'inx' kan være en streng (key) eller tal

remove(inx)
    som 'item'

clear()
    tømmer collection'en

Properties:
count
    indeholder antallet af elementer
Avatar billede mclemens Nybegynder
28. maj 2006 - 20:48 #80
Ved ikke lige, hvad det scriptet kan bruges til, ud over holder til dokumentets/objektets funktioner, det er det selvfølgelig effektivt til. Det er nok godt til fejlfinding, som du nævner, om ikke andet kan jeg nok opbygge et eller andet ud fra skabelonen på et senere tidspunkt, når jeg får kigget scriptet igennem og har styr på prototype.

- Har aldrig helt følt at object holdere / constructors var mere effektive end arrays (sprang over det i php også - det virkede lidt forvirrende med klasser til det behov jeg havde)... kan dog godt se fordelen ved styleskiftet som vist i din artikel ... så tak for scriptet :)
Avatar billede olebole Juniormester
28. maj 2006 - 21:22 #81
Det med fejlfindingen gik nu kun på constructor'en, der hedder 'BaseObject'  :)

Det, jeg selv bruger den til, er, når jeg f.eks. bygger specielle GUI-komponenter. Skal det gå seriøt for sig - og koden skal være robust - bør man kun bruge HTML'en til visuel præsentation og som 'håndtag'.
Disse 'håndtag' sender så blot beskeder til applikationen bag og den abstakte struktur, der modsvarer GUI-komponenten.
En typisk collection-struktur i en sådan GUI-komponent er select-elementets options-collection.

OOP er intet mindre end en gave til menneskeheden. I virkeligheden bruger du det hele tiden i JS - dog måske uden at vide det.
JS er som sagt objekt-baseret og det betyder, at du hele tiden bruger JS' indbyggede objekter, deres properties og metoder. Hvergang du bruger:
  var a = new Array();
- eller:
  var im = new Image();
- bruger du object-constructors. Forskellen er bare, om 'forfatterne' af sproget har skrevet constructor'en - eller om du selv har  :)
Avatar billede mclemens Nybegynder
28. maj 2006 - 21:30 #82
[ Det, jeg selv bruger den til, er, når jeg f.eks. bygger ... ] - Ok, det hjælper nok når jeg kommer lidt mere ind i det :)

[ Forskellen er bare, om 'forfatterne' af sproget har skrevet constructor'en - eller om du selv har  :) ] - Ok, den klarlægger en del :)
Avatar billede Slettet bruger
29. maj 2006 - 11:11 #83
Jeg har et nyt spørgsmål, da det ikke virker i IE, åbenbart :/

http://www.eksperten.dk/spm/712444
Avatar billede mclemens Nybegynder
29. maj 2006 - 13:22 #84
Ved ikke om det har betydning...
Siden leveres som: text/html - Ved ikke om det hjælper ved levering som text/xml...
<?php header("Content-type: text/xml"); ?>

... Jeg skal nok have leget lidt med det i aften (kan heller ikke forstå den ikke virker) - har også testet lidt lokalt og når til samme resultat som dig: XML objectet bliver ikke loadet ... indholdet er dog loadet hvis man bruger responseText - så det tyder på at IE har lidt problemer med parsing af filen. Tror (måske) det er problemet med content type - da det burde virke iflg.: http://developer.mozilla.org/en/docs/AJAX:Getting_Started :/
Avatar billede mclemens Nybegynder
29. maj 2006 - 13:23 #85
ups forkert tråd :D
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