Avatar billede hoppe11 Nybegynder
25. november 2007 - 18:11 Der er 20 kommentarer og
2 løsninger

sende _POST variabler uden en form

er det muligt at sende post variabler uden direkte brug af en form?
Avatar billede softspot Forsker
25. november 2007 - 18:30 #1
Ja, du kan benytte XMLHttpRequest i de nyere browsere og et ActiveXObject i de lidt ældre version af IE (dvs. IE 6.0 og tidligere):

<script language="Javascript">
function xmlhttpPost(strURL) {
    var xmlHttpReq = false;
    var self = this;
    // Mozilla/Safari
    if (window.XMLHttpRequest) {
        self.xmlHttpReq = new XMLHttpRequest();
    }
    // IE
    else if (window.ActiveXObject) {
        self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }
    self.xmlHttpReq.open('POST', strURL, true);
    self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    self.xmlHttpReq.onreadystatechange = function() {
        if (self.xmlHttpReq.readyState == 4) {
            alert(self.xmlHttpReq.responseText);
        }
    }
    self.xmlHttpReq.send(getquerystring());
}

function getquerystring() {
  var v = 'p1=parametervaerdi1';
  v += '&p2=parametervaerdi2'; 
  return v;
}
</script>


for at sende data kalder du funktionen xmlhttpPost med adressen på den side du vil sende data til og funktionen getquerystring returnerer det der svarer til formfelterne (altså en streng med name/value adskilt af ampersand & - som en normal querystring).

Koden er baseret på eksemplet på denne side: http://www.degraeve.com/reference/simple-ajax-example.php
Avatar billede hoppe11 Nybegynder
07. december 2007 - 23:08 #2
i min alert får jeg udskrevet _POST variablerne, men ikke på selve siden

http://electrobeat.dk.linux17.wannafind.dk/v3/_tst3.php

_POST:<br>
<?
foreach($_POST as $v) echo $v.'<br>';
?>
Avatar billede softspot Forsker
08. december 2007 - 00:39 #3
Næh, men du gør jo heller ikke noget for at få dem udskrevet på selve siden.

Der er to ting du bør erkende med AJAX

1. Du returnerer kun det nødvendige data
2. Du får mest ud af AJAX hvis du er relativ hård til DOM og JS

Pt. returnerer du blot et helt HTML-dokument i dit kald og så har metoden ikke givet meget gevinst frem for bare at genopfriske hele siden.

Jeg ved godt det er et proof of concept, men du bør måske gøre det mere realistisk og kun returnere da data som rent faktisk skal opdateres (resten af siden er jo allerede i browseren). Nu er jeg ikke PHP-kyndig, men jeg vil forvente at koden til AJAX-kaldet skulle se nogenlunde således ud (i sin fulde længde):

<?
foreach($_POST as $v) echo $v.'<br>';
?>

Hvis du så gemmer den i en separat php-fil som du kalder i stedet for at kalde siden selv (dvs. _tst3.php), så vil resultatet i alert'en givetvis kun vis POST-variablene og ikke koden til hele siden. Derefter kan du ændre lidt på _tst3.php, så der oprettes et element hvori resultatet fra AJAX-kaldet (responseText) kan lægges. Lad os antage at du ændrede:

_POST:<br>
<?
foreach($_POST as $v) echo $v.'<br>';
?>

til:

_POST:<br>
<div id="divpostvars"></div>


og ændrede denne del af JS-funktionen xmlhttpRequest fra:

    self.xmlHttpReq.onreadystatechange = function() {
        if (self.xmlHttpReq.readyState == 4) {
            alert(self.xmlHttpReq.responseText);
        }
    }

til:

    self.xmlHttpReq.onreadystatechange = function() {
        if (self.xmlHttpReq.readyState == 4) {
            document.getElementById("divpostvars").innerHTML = self.xmlHttpReq.responseText;
        }
    }

så dukker post-variablene måske op på siden...
Avatar billede hoppe11 Nybegynder
08. december 2007 - 07:16 #4
jeg vil lige kigge lidt på det igen..

men med andre ord loader den nærmst siden i baggrunden eller on-the-fly i selve scriptet?
Avatar billede w13 Novice
08. december 2007 - 07:58 #5
Ja. =)
Avatar billede hoppe11 Nybegynder
27. december 2007 - 17:00 #6
hvis jeg nu kun ville returnerer innerHTML af body tag'et i stedet for hele respoceText?
Avatar billede w13 Novice
27. december 2007 - 17:03 #7
Så bruger du invalid JavaScript. =) Men okay. Mener da at du kan sige responseText.getElementsByTagName("body")[0].innerHTML - alternativt skal du muligvis erstatte responseText med responseXml, der så henter siden som elementer.
Avatar billede w13 Novice
27. december 2007 - 17:04 #8
Men det er generelt en rigtig dårlig idé at generere andet end det, du skal bruge.
Avatar billede hoppe11 Nybegynder
27. december 2007 - 17:10 #9
men hvordan kunne jeg så nøjes med bare at generere body tag'et? :)

kan selvfølgelig godt se at det ville være spild det andet
Avatar billede hoppe11 Nybegynder
27. december 2007 - 17:13 #10
responseText og responseXml er måske variabler som er sat på "forhånd"?
Avatar billede w13 Novice
27. december 2007 - 17:22 #11
Nu ved jeg jo ikke hvad du skal generere, men principielt kan du bare generere f.eks.:
---------------------
<b>Hej</b>
<u>How goes?</b>
---------------------
Og responseText og responseXml er ikke variabler men snarere metoder knyttet til Ajax-funktionaliteten.

Den måde du bruger Ajax på nu er dog meget hullet og kan let fucke, når bare nogle få brugere er på din side samtidig.
F.eks. bør du overføre data, ikke med HTML, men med enten XML eller - endnu bedre - JSON, for at undgå at der bruges for meget kraft på en Ajax-forespørgsel.
Avatar billede w13 Novice
27. december 2007 - 17:24 #12
Ligeledes bør den meget bugfyldte funktion innerHTML heller ikke bruges - som alternativ til dette bør du bruge DOM (Document Object Model).
Avatar billede hoppe11 Nybegynder
27. december 2007 - 17:49 #13
JSON er vel nærmest bare et flerdimensionelt assoc array?

http://en.wikipedia.org/wiki/JSON

Ved returnering af data som JSON skal jeg vel også ændre Content-Type fra "application/x-www-form-urlencoded" til "application/json"

Men kan ikke lige se for mig hvordan man konverterer responset til JSON?

responseXML lader til først at komme til i IE7
Avatar billede w13 Novice
27. december 2007 - 17:53 #14
JSON er i virkeligheden et js-objekt, som kan indeholde andre objekts/arrays.

Du skal ikke ændre "application/x-www-form-urlencoded", for så kan du ikke overføre til den som en formular.

Dog skal du i json-dokumentet indsætte <%Response.ContentType="applikation/json"%> forudsat, at du bruger ASP. Så skal json-filen naturligvis hedde .asp!

Og så henter du output fra filen med:

    var json=eval("("+req.responseText+")");
    alert(json.noget);

"noget" svarer her til en værdi fra json-dokumentet:

<%Response.ContentType="application/json"%>{"noget":"Gæst","id","12"}

Derved får du resultatet "Gæst".
Avatar billede w13 Novice
27. december 2007 - 17:54 #15
Hov, en slåfejl:

<%Response.ContentType="application/json"%>{"noget":"Gæst","id":"12"}
Avatar billede hoppe11 Nybegynder
27. december 2007 - 19:50 #16
jeg har nu nogenlunde fået det til at virke

function json_post(get_str, url_str)
{
    if(!url_str) url_str = '/v3/response.json.php';
   
    var xmlhttp;
    var self = this;
   
    if(window.XMLHttpRequest)
    {
        // FF
       
        self.xmlhttp = new XMLHttpRequest();
    }
    else if(window.ActiveXObject)
    {
        // IE
       
        self.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
   
    self.xmlhttp.open('POST', url_str, true);
    self.xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    self.xmlhttp.onreadystatechange = function()
    {
        if(self.xmlhttp.readyState == 4)
        {
            var json = eval('('+self.xmlhttp.responseText+')');
            alert(json.noget);
        }
    }
    self.xmlhttp.send(get_str);
}

<select onchange="json_post('response=1')">

response.json.php:
-----------------------------------
<?
header('content-type: applikation/json');
echo '{"noget":"det virker!"}';
?>

---------------------------

Her virker det fint og "det virker!" bliver promptet.

Men hvis jeg i mit script ændrer
alert(json.noget);
til
return json.noget;

og

<select onchange="json_post('response=1')">
til
<select onchange="alert(json_post('response=1'))">

får jeg undefined?
Avatar billede softspot Forsker
27. december 2007 - 20:57 #17
Det er fordi json_post udfører et asynkront kald til serveren og du derfor ikke får noget resultat tilbage med det samme, med andre ord så returnerer din funktion ikke noget i selve kaldet. Der kommer først noget tilbage i den funktion som du tildeler

self.xmlhttp.onreadystatechange

Du kan altså ikke forvente nogen returværdi fra json_post.
Avatar billede hoppe11 Nybegynder
29. december 2007 - 13:16 #18
mange tak for hjælpen begge to og smid et svar selvom det nok var mere værd :)
Avatar billede w13 Novice
29. december 2007 - 13:44 #19
Her er et svar fra mig. =)
Avatar billede softspot Forsker
29. december 2007 - 17:37 #20
Velbekomme :)
Avatar billede hoppe11 Nybegynder
29. december 2007 - 19:30 #21
:D
Avatar billede softspot Forsker
29. december 2007 - 22:24 #22
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