Avatar billede Morten Nybegynder
06. oktober 2005 - 20:44 Der er 12 kommentarer og
1 løsning

XMLHttpRequest Object

Jeg er blevet henvist til nedenstående scritp (jeg fatter næsten minus Javascript).

<script type="text/javascript">
var xmlhttpfunction loadXMLDoc(url)
{
// code for Mozilla, etc.
if (window.XMLHttpRequest)
  {
  xmlhttp=new XMLHttpRequest()
  xmlhttp.onreadystatechange=xmlhttpChange
  xmlhttp.open("GET",url,true)
  xmlhttp.send(null)
  }
// code for IE
else if (window.ActiveXObject)
  {
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
    if (xmlhttp)
    {
    xmlhttp.onreadystatechange=xmlhttpChange
    xmlhttp.open("GET",url,true)
    xmlhttp.send()
    }
  }
}function xmlhttpChange()
{
// if xmlhttp shows "loaded"
if (xmlhttp.readyState==4)
  {
  // if "OK"
  if (xmlhttp.status==200)
    {
    // ...some code here...
    }
  else
    {
    alert("Problem retrieving XML data")
    }
  }
}
</script>

Det jeg ønsker mig er at når brugeren klikke i en checkbox så skal der selvfølelig først chekes for om den er sat eller ikke derefter skal den enten inserte eller Delete i en Database.

Jeg har 2 stor problemer:

1. hvad indsætter jeg i min <input type="checkbox">

2. Hvor indsætter jeg min kode til DB sjovet.... (vil gætte på at dette skal stå der hvor der i scriptet står some code here)

Nogen hajer som kan hjælpe?
Avatar billede olebole Juniormester
06. oktober 2005 - 21:25 #1
<ole>

Det må du have misforstået fundamentalt. Du kan ikke sætte DB-kode ind i dit JS - det skal ordnes serverside  :)

/mvh
</bole>
Avatar billede Morten Nybegynder
06. oktober 2005 - 21:28 #2
Hmmm... Jeg har ikke misforstået - jeg fatter minus som sagt - det var hvad jeg fik at vide...

Det vil sige at jeg ikke kan lave en SQL et eller andet sætning som trigges af ovenstående Java script - sådan at databasen opdateres uden at jeg skal reloade siden eller åbne en ny side?

Vil være dejligt hvis du kan give enegyldigt svar så jeg kan komme videre...

:O)
Avatar billede olebole Juniormester
06. oktober 2005 - 21:51 #3
Du kan sende noget til et dokument, som så kan sætte ind i en DB
Avatar billede Morten Nybegynder
06. oktober 2005 - 22:28 #4
Okay - bare jeg ikke skal reloade siden hvor der krydses/afkrydses i checkboxen.

Kan du så hjælpe mig der?

Altså som skrevet - jeg er nød til at vide om checkboxen er sat eller ej (true og false) og have denne info med.

Har du forslag...?
Avatar billede olebole Juniormester
06. oktober 2005 - 23:02 #5
Skal du bare sende data til serveren, er det langt mere X-browser at gøre det med f.eks. et billede:

<script type="text/JavaScript">
function doMyServerShit(id) {
  var oHttp = newImage();
  oHttp.src = "http://www.domain.dk/myHttpPic.php?id=" + id;
}
</script>

<input id="gnu" type="checkbox" onclick="if(this.checked)doMyServerShit(this.id)">

På serveren kan du så redirect'e til en 1x1 pixel, ensfarvet gif i 'myHttpPic.php':

<?php
  // Her gør du dit DB-gejl med variablen $_GET["id"]

  Header( "Location: myLittleGif.gif" );
?>

Så minimerer du de bytes, der sendes frem og tilbage ... browseren modtager kun de ca. 45 bytes, en 1x1px gif fylder.

Såvidt jeg kan se på dine andre spm, er du PHP'er, så det skulle være til at forstå  :)
Avatar billede Morten Nybegynder
06. oktober 2005 - 23:06 #6
Hmm det lyder som noget der kan bruges...

Lige et tillæg - hvis checkboxen nu er afkrydset så skal den også kører - kan man det?
Avatar billede Morten Nybegynder
06. oktober 2005 - 23:07 #7
Og lige er par spørgsmål mere:

Hvad er id="gnu"???
Skal javascriptet ligge i Headeren eller er det lige meget??
Avatar billede Morten Nybegynder
06. oktober 2005 - 23:09 #8
til min indlæg 23:06:22

Altså jeg skal kører doMyServerShit når brugeren klikker checkboxen fra eller til... altså noget i stil med en if --- else sætning.... hvis man kan det i javascript???
Avatar billede olebole Juniormester
06. oktober 2005 - 23:16 #9
Ja - og så kan vi i funktionen afgøre, om den er checked eller ej:

<script type="text/JavaScript">
function doMyServerShit(inp) {
  // Hvis du skal bruge checkbox'ens id, kan du sende med:
  // oHttp.src = "http://www.domain.dk/myHttpPic.php?id=" + inp.id;
  // Skal du bruge dens value, bruger du:
  // oHttp.src = "http://www.domain.dk/myHttpPic.php?val=" + inp.value;

  if (inp.checked) {
    // Skidtet er checked ... gør noget
  } else {
    // Skidtet er ikke checked ... gør noget andet
  }
}
</script>

<input id="gnu" value="strange_animal" type="checkbox" onclick="doMyServerShit(this)">

JavaScriptet kan stå, hvorsomhelst mellem <html> og </html>, men oftest skriver man det mellem <head> og </head>
Avatar billede Morten Nybegynder
06. oktober 2005 - 23:19 #10
Det ser spændende ud - jeg vil lige kigge det lidt igennem og prøve mig frem.

Her points for din store hjælp.... jeg vender tilbage med min løsning når jeg er færdig...

Tak!!!
Avatar billede olebole Juniormester
07. oktober 2005 - 02:18 #11
Selvtak og tak for points  :)

Faktisk tog jeg lige et hiv til af 'den sjove' og kom i tanker om en måde at lave et supersimpelt http-objekt, der kan sende et antal variabler til en server - og til en vis grad modtage svar:

Man sender et antal variabler til serveren - f.eks. via en funktion 'sendHttp':
  <button onclick="sendHttp('context','testing', 'myVar','gnu')">Test 1</button>

Denne knap vil sende to variabler:
1. 'context' med værdien 'testing'
2. 'myVar' med værdien 'gnu'

Der skal kunne sendes et vilkårligt antal variabel-par på denne måde - kun begrænset af en query-strengs sædvanlige længde-begrænsning (omkring 2000 tegn).

På serveren modtages disse variabler i $_GET-array'et. Hvis man nu har f.eks. 100 gif'er liggende, der alle er 1px høj og fra 1 til 100px bred - så kan du vælge at redirect'e til én af disse giffer og bredden af den gif vil så repræsentere svaret fra serveren ... ét svar ud af 100 mulige.
Gifferne navngives: 'http_1.gif' til 'http_100.gif'. Naturligvis kunne du vælge et andet antal - det bestemmer din applikations behov  :)

På klienten loades billedet ind i et skjult span, som vi måler bredden på, når billedet loader.
Loader billedet af en eller anden grund ikke, vil der komme en fejlbesked (det sker på billedets onabort- eller onerror-event).
Finder vi derimod en bredde, handler vi på den:

<script type="text/JavaScript">
var serverURL = "http://localhost/___Eksperten/httpPic.php";

var messages = new Array();
messages[1] = "Der opstod en fejl. Variablerne kunne ikke bruges på serveren.";
messages[80] = "Her er en besked fra serveren ... der blev returneret 80.\n- hvad det betyder, ved kun du :)";
messages[90] = "Her er en besked fra serveren ... der blev returneret 90.\n- hvad det betyder, ved kun du :)";
messages[100] = "Her er en besked fra serveren ... der blev returneret 100.\n- hvad det betyder, ved kun du :)";

function sendHttp() {
    var im, o, aQ=[], a = arguments;
    for (var i=0; i<a.length; i+=2) aQ.push( a[i]+"="+escape(a[i+1]) );
    im = document.createElement("img");
    im.onload = recieveHttp;
    im.onabort = im.onerror = httpError;
    o = document.getElementById("httpLoader");
    o.replaceChild(im, o.firstChild);
    im.src = serverURL + "?" + aQ.join("&");
}
function httpError() {
    // Enten kunne php-filen ikke findes
    // - eller der blev redirected til et billede, der ikke findes
    alert("Der opstod en fejl")
}
function recieveHttp() {
    var w = document.getElementById("httpLoader").offsetWidth;
    // Her handler du på værdien af w, som svarer til $ret på serveren.
    alert( messages[w] );
}
</script>

<span id="httpLoader" style="position:absolute;visibility:hidden">&nbsp;</span>

<button onclick="sendHttp('context','testing', 'myVar','gnu')">Test gnu</button><br>
<button onclick="sendHttp('context','testing', 'myVar','hest')">Test hest</button><br>
<button onclick="sendHttp('context','testing', 'myVar','ko')">Test ko</button><br>
<button onclick="sendHttp('context','testing', 'myVar','guldfisk')">Test guldfisk (ukendt myVar-variabel)</button><br>
<button onclick="sendHttp('context','test', 'myVar','ko')">Test ko (med ukendt context-variabel)</button>

- og PHP-dokumentet:

<?
$ret = "1";
if ( isset($_GET["context"]) && $_GET["context"]=="testing" ) {
   
    if ( isset($_GET["myVar"]) ) {
        switch ($_GET["myVar"]) {
            case "hest":
                // Her handles på at $_GET["myVar"] har værdien 'hest'
                // - og du sætter $ret til en svar-værdi:
                $ret = "100";
            break;
            case "ko":
                // Her handles på at $_GET["myVar"] har værdien 'ko'
                // - og du sætter $ret til en svar-værdi:
                $ret = "90";
            break;
            case "gnu":
                // Her handles på at $_GET["myVar"] har værdien 'gnu'
                // - og du sætter $ret til en svar-værdi:
                $ret = "80";
            break;
        }
    }
   
}

Header( "Location: http_".$ret.".gif" );
?>
Avatar billede olebole Juniormester
07. oktober 2005 - 02:30 #12
- og nej, kom ikke i tanker om at bruge GDlib til at lave en gif on-the-fly. Det gode ved løsningen er, at den trækker ekstremt lidt på serverens CPU/RAM - og kun sender mellem 43 og 49 bytes tilbage  ;o)

At jeg har valgt at bruge returværdien til at alert'e en streng i et array, er kun for eksemplets skyld.
Du kunne i stedet flytte et element et bestemt sted hen - sætte en bredde på et element - skifte src på et billede - eller hvad du nu kan finde på at bruge de forskellige, foruddefinerede svarværdier til  :)
Avatar billede olebole Juniormester
09. oktober 2005 - 01:11 #13
Jeg skal for en ordens skyld lige rette en fejl, der blev opdaget ved genbrug i denne tråd:
    http://www.eksperten.dk/spm/654409

I eksemplet ovenfor (06/10-2005 23:02:19), står der:
    var oHttp = newImage();

- hvilket er en lille, men meget dum og alvorlig fejl! Der skal stå:
    var oHttp = new Image();

Hvis der skulle være nogen, der på et senere tidspunkt falder over spm'et og ønsker at bruge/teste løsningen  :)
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