Avatar billede mogenhelge Nybegynder
16. januar 2007 - 18:01 Der er 16 kommentarer

Execute Javascript kode modtaget med Ajax request..

Hejsa Eksperter,

Jeg har et spørgsmål der umiddelbart lyder simpelt, men har vist sig at være tricky for mig.

Jeg har en Ajax funktion som sætter innerhtml'et på div'et (f.eks. "lal" <div id=lal>&nbsp;</div> ) til noget Javascript kode, således resultatet bliver: "<div id=lal>MyJavaScriptFunction();</div>"..
MEN! MyJavaScriptFunction(); funktionen bliver aldrig executed - og jeg er da ved at blive vanvittig, hehe! Nogen der har nogen ideer til hvordan jeg kan få funktionen executed som bliver returneret vha. Ajax?

Nedenfor er et lille eksempelt - bare hvor der er brugt en knap i stedet for Ajax, men problemet er præcis det samme:

<html><head></head>
<body>
<FORM>
<INPUT TYPE=BUTTON VALUE="Test" onClick = "document.getElementById('lal').innerHTML='<script>alert(\'1-2-3-test\');</script>'">
</FORM>

<div id="lal">
&nbsp;
</div>

</body>
</HTML>
Avatar billede erikjacobsen Ekspert
16. januar 2007 - 18:44 #1
Du skal nok være lidt mere præcis: hvad er det du ønsker at opnå i det eksempel du har vist her? (det med AJAX kan vi så tage senere)
Avatar billede mclemens Nybegynder
16. januar 2007 - 19:20 #2
Hvis nu du har en funktion der hedder MyJavaScriptFunction og din AJAX returnerer:
MyJavaScriptFunction(); som tekst streng så prøv med en eval(jsajaxvariablen); dette gælder også hvis det er en stribe ting der skal udføres f.eks.:



<!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><meta name="robots" content="index, follow">

<script type="text/javascript">

function xmlreq(){

  var xmlobj,xmlres;

  if(window.XMLHttpRequest)xmlobj=new XMLHttpRequest(); // IE7, FF, Moz m.v.
  else if(window.ActiveXObject)xmlobj=new ActiveXObject("Microsoft.XMLHTTP"); // IE<7
  else return false;

  xmlobj.open("GET","test.txt",true);

  xmlobj.onreadystatechange=function(){
    if(xmlobj.readyState==4){
      var xmlres = xmlobj.responseText;
      eval(xmlres);
    }
  }

  xmlobj.send(null);

}

xmlreq();


function funktionsnavn(t){
  alert("variablen er: "+t);
}
</script>

</head><body>

</body></html>




og test.txt:
alert(123);


eller hvis kaldet skulle være til en funktion:
funktionsnavn(123);
Avatar billede mogenhelge Nybegynder
16. januar 2007 - 19:26 #3
Alt hva' jeg egentlig ønkser er at få executed min Javascript kode som bliver sat ind i DOM'et med innerhtml fra min Ajax funktion.

Så, for at svare på dit spørgsmål: Ovenstående eksempel ville jeg umiddelbart spå til at vise en Alert msgbox med "1-2-3-test", men det gør min browser altså ikke. Jeg kan se på nettet at flere har det samme issue - men har ikke lige umiddelbart kunne finde en løsning.

Men kunne også spørge spørgsmålet helt pædagoisk: "Hvordan kan jeg eksekvere Javascript kode som jeg har modtaget gennem Ajax"?

Håber det gjorde det lidt mere klart...

Smiles
/j
Avatar billede mclemens Nybegynder
16. januar 2007 - 19:28 #4
... med eval() ...
Avatar billede mogenhelge Nybegynder
16. januar 2007 - 19:30 #5
Mclemens, - det maker meget godt sense det der... har godt overvejet om Eval kunne være min ven i nøden. Det ser meget godt ud det eksempel; den ide vil jeg bestemt arbejde videre med.

Tak for hjælpen :)

Smid et svar, og du vil få velfortjente point!

Smiles
/j
Avatar billede mclemens Nybegynder
16. januar 2007 - 19:31 #6
Velbekomme, her er et svar :)
Avatar billede mclemens Nybegynder
16. januar 2007 - 19:34 #7
I nogle tilfælde kan det vist være nødvendig med parenteser omkring
eval("(" + ajaxstreng +")"); - jeg er dog ikke selv løbet ind i det
problem endnu ... http://www.eksperten.dk/artikler/1053
Avatar billede olebole Juniormester
17. januar 2007 - 15:26 #8
<ole>

innerHTML bruger man aldrig sammen med Ajax! Meningen med Ajax er at udveksle rå data mellem server og klient - og oprette/indsætte elementer på klienten med disse data via DOM.

innerHTML har aldriv været del af nogen officiel standard, da den strider lodret mod idéerne bag W3C's arbejde - og er i øvrigt komplet inkompatibel med XHTML  =)

/mvh
</bole>
Avatar billede mclemens Nybegynder
17. januar 2007 - 16:18 #9
Jeg tror ønsket var at køre en ajax returneret funktion - mere end det var ønsket at bruge innerHTML - innerHTML var et forsøg på at få kørt denne funktion.

... Men som Ole siger, undgå innerHTML så vidt muligt :)
Avatar billede olebole Juniormester
18. januar 2007 - 14:56 #10
mclemens >> jeg har læst første linje i (16/01-2007 19:26:22), så jeg tror ikke, innerHTML blot bliver brugt til test. Brugen af innerHTML er en fundamental - og desværre ekstremt udbredt - misforståelse omkring AJAX. Derfor nævner jeg det, hvergang jeg ser det  :)

- og da det altid er muligt at undgå innerHTML, så bør man såmænd bare undgå den  ;o)
Avatar billede mogenhelge Nybegynder
19. januar 2007 - 19:35 #11
OleBole... Jeg er lidt i tvivl om hva' du mener mht. innerHTML. Hvordan vil du ellers - fra et UI mæssigt synspunkt - ligge og ændre content dynamisk på din side? Er vi ikke alle sammen blevet lidt "for gamle" til at rode med removeChild og appendChild - som vel dybest set er det som sker "inde bagved" innerHTML.
Jeg kan ikke komme på nogen moderne browser som ikke har taget innerHTML til sig; vel af den logiske grund at det er "tro" mod DOM'et.

Jeg synes i hvert fald det er forkert at sige innerHTML er ikke en del af Ajax. For mig at se er Ajax er blot et begreb, en ikke en standard. "En asynkron krøllet tanke som blevet brugbar for mange websites" - kunne man sige.

Smiles
/j
Avatar billede mogenhelge Nybegynder
19. januar 2007 - 19:37 #12
... "For mig at se er Ajax blot et begreb, en ikke en standard." - skulle der ha' stået. :)
Avatar billede erikjacobsen Ekspert
19. januar 2007 - 19:39 #13
etelement.innerHTML = "<b>hundemad";

Det er jo ikke efter standarden, men browseren acceptere det. Har vi gang i XHTML kan man jo ikke give det en mening. Derfor er det ikke muligt i XHTML.

innerHTML er for børnehavebørn, og når man bliver "for gammel" indser man nødvendigheden af at rode med appendChild og venner.  ;)
Avatar billede mogenhelge Nybegynder
19. januar 2007 - 19:51 #14
hehehe, ja, det kan være jeg bliver stor nok en dag hiver removeChild og appendChild op af skuffen :)

Rigtig god weekend...

/j
Avatar billede olebole Juniormester
22. januar 2007 - 14:14 #15
Jeg er naturligvis helt på linje med Erik - og derudover strider innerHTML lodret mod W3C's DOM-tanke. Idéen er jo netop, at alt skal opfattes/behandles som noder - ikke som strenge - hvilket styrker logikken og letter arbejdet væsentligt i mere komplekse strukturer  =)

Ajax er ganske korrekt ikke en teknologi, men en teknik. Der er som sådan ikke en standard for teknikken, men de, der definerede og navngav teknikken, fremhæver netop fordelene ved kun at udveksle rå data fremfor strenge:
1) Begrænsning af unødig trafik
2) Platforms- og sproguafhængighed
3) Logikken i (X)HTML's node-system bibeholdes
4) Teknikken kan anvendes indenfor gældende standarder

I øvrigt er innerHTML en del ældre end W3C's ECMA-DOM bindinger, så argumentet for din holdning skulle altså være, at du er for gammel til at rode med de mest moderne teknologier ... det foretrækker jeg at blande mig udenom  ;o)
Avatar billede tsunami Nybegynder
22. januar 2007 - 20:08 #16
Egentlig sjovt at innerHTML udfra de forsøg jeg har læst var hurtigere til at blive udført end W3C's måde at gøre det på... hmmm... dette kan så opfattes på mange måder :p
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



IT-JOB

Cognizant Technology Solutions Denmark ApS

Test Manager

Unik System Design A/S

Udviklingschef