/ Forside / Teknologi / Udvikling / Java Scripts / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java Scripts
#NavnPoint
molokyle 5410
Klaudi 2799
smorch 2439
kim 1360
Harlekin 1134
bentjuul 984
gibson 800
severino 695
Random 675
10  konsulent.. 626
JSON, eval og IE
Fra : Jacob Bunk Nielsen


Dato : 14-07-08 09:21

Hej

Jeg sidder og koder på en webapplikation, hvor en del af interfacet er
en popup-dialog, som er et <div>-element, som jeg lægger oven på resten
af siden. Indholdet kommer fra webserveren, og bliver hentet via et
stykke JavaScript.

Indholdet i min "popup" indeholder også noget JavaScript, som skal
fortolkes når det indlæses. Derfor har jeg lavet en funktion der gør
følgende ved det der hentet for at udgøre indholdet af popup'en:

/* Recursively run through elements and eval javascript in them */
function fix_children (elt) {
var children = elt.childNodes;
for (var i = 0; i < children.length-1; i++) {
var child = children[i];
if (child.type == 'text/javascript') {
eval(child.text);
}
fix_children(child);
}
return;
}

Tanken er at den løber igennem alle elementer der er hentet. Hvis de har
typen 'text/javascript', så bliver de evalueret.

Det virker fint i Firefox 2 (på Linux), men slet ikke i Internet
Explorer 7 (på Windows XP). Jeg er ret meget på bar bund mht. hvordan
jeg debugger på IE (jeg er ikke Windows-bruger til daglig), men jeg har
da fundet frem til at den slet ikke finder nogle elementer der har typen
'text/javascript'.

Er der nogen der har en løsning eller et bud på hvordan jeg kommer
videre?

--
Jacob - www.bunk.cc

 
 
Jacob Bunk Nielsen (14-07-2008)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 14-07-08 13:19

Jacob Bunk Nielsen <spam@bunk.cc> writes:

> Indholdet i min "popup" indeholder også noget JavaScript, som skal
> fortolkes når det indlæses. Derfor har jeg lavet en funktion der gør
> følgende ved det der hentet for at udgøre indholdet af popup'en:

Det er gået op for mig at problemet formentlig opstår fordi dette
indhold jeg henter sættes som:

var html=value.responseText;
insert_new_elt.innerHTML=html;

Her bliver den nye HTML ikke DOM-parset, og dermed virker min
fix_children funktion ikke. Nogle bud på hvordan jeg får IE til at
parse den nye HTML?

--
Jacob - www.bunk.cc

Lars Madsen (14-07-2008)
Kommentar
Fra : Lars Madsen


Dato : 14-07-08 14:34

Jacob Bunk Nielsen wrote:
> Jacob Bunk Nielsen <spam@bunk.cc> writes:
>
>> Indholdet i min "popup" indeholder også noget JavaScript, som skal
>> fortolkes når det indlæses. Derfor har jeg lavet en funktion der gør
>> følgende ved det der hentet for at udgøre indholdet af popup'en:
>
> Det er gået op for mig at problemet formentlig opstår fordi dette
> indhold jeg henter sættes som:
>
> var html=value.responseText;
> insert_new_elt.innerHTML=html;
>
> Her bliver den nye HTML ikke DOM-parset, og dermed virker min
> fix_children funktion ikke. Nogle bud på hvordan jeg får IE til at
> parse den nye HTML?
>

Det undrer mig lidt at du skriver JSON i titlen, menningen med JSON er
jo netop at der ikke er nogen html i den JSON som sendes tilbage.
HTML-koden skal du selv lave.

Man skal tilsyneladende passe med på innerHTML da den ikke er en del af
standarden.

Måske skulle du i stedet forklare lidt mere om hvad det er du ønsker at
lave. Måske er der en anden metode.

--

/daleif (remove RTFSIGNATURE from email address)

LaTeX FAQ: http://www.tex.ac.uk/faq
LaTeX book: http://www.imf.au.dk/system/latex/bog/ (in Danish)
Remember to post minimal examples, see URL below
http://www.tex.ac.uk/cgi-bin/texfaq2html?label=minxampl
http://www.minimalbeispiel.de/mini-en.html

Adam Sjøgren (14-07-2008)
Kommentar
Fra : Adam Sjøgren


Dato : 14-07-08 15:10

On Mon, 14 Jul 2008 10:20:40 +0200, Jacob wrote:

> if (child.type == 'text/javascript') {

Virker det at checke på child.nodeName=='SCRIPT' i stedet?

Kørbart eksempel her: <http://koldfront.dk/misc/browsers/runjs.html> -
hvis det virker kommer der en alert() med teksten "YES!" frem.


Mvh.

Adam


(Jvnf. <http://msdn.microsoft.com/en-us/library/ms534190(VS.85).aspx>)

--
"But after all, who is? At least in our case - no one Adam Sjøgren
is such a great musician. But we are stubborn." asjo@koldfront.dk

Jacob Bunk Nielsen (14-07-2008)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 14-07-08 16:50

Lars Madsen <daleif@RTFSIGNATUREimf.au.dk> writes:

> Det undrer mig lidt at du skriver JSON i titlen, menningen med JSON er
> jo netop at der ikke er nogen html i den JSON som sendes tilbage.
> HTML-koden skal du selv lave.

Ja, det er vel egentlig også en fejl - det først et andet sted i flowet
at jeg bruger JSON - det er ikke kun mig der vedligeholder koden, så jeg
har nok fået blandet lidt sammen. Det beklager jeg. Efter rigtig megen
googling fandt jeg også ud af at det burde være lidt lettere hvis
tingene kom i JSON format.

> Man skal tilsyneladende passe med på innerHTML da den ikke er en del
> af standarden.

Jeps - jeg har fundet lange forklaringer, både for og imod.

> Måske skulle du i stedet forklare lidt mere om hvad det er du ønsker
> at lave. Måske er der en anden metode.

Det kan helt sikkert laves anderledes, men i så fald skal jeg også kode
min serverside komponent om.

Som sagt, jeg leverer et stykke HTML som skal vises i en dialog-boks for
brugeren. En af de ting der findes i denne dialogboks er et autocomplete
felt. Alt dette laves serverside og sættes ind i et div-element via
noget JavaScript. For at aktivere autocomplete feltet skal der køres en
lille smule JavaScript. Det går også fint med den kode jeg startede med
at poste i Firefox, men ikke i IE. Det fandt jeg senere ud af skyldes at
IE ikke parser det HTML den får retur ind i en passende DOM-struktur.

--
Jacob - www.bunk.cc


Jacob Bunk Nielsen (14-07-2008)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 14-07-08 16:52

asjo@koldfront.dk (Adam Sjøgren) writes:

> On Mon, 14 Jul 2008 10:20:40 +0200, Jacob wrote:
>
>> if (child.type == 'text/javascript') {
>
> Virker det at checke på child.nodeName=='SCRIPT' i stedet?

Det virker i Firefox - jeg prøver med IE i morgen når jeg er tilbage på
fabrikken (jeg har ikke nogen IE herhjemme), men jeg tvivler desværre.

--
Jacob - www.bunk.cc

Adam Sjøgren (14-07-2008)
Kommentar
Fra : Adam Sjøgren


Dato : 14-07-08 16:55

On Mon, 14 Jul 2008 17:51:54 +0200, Jacob wrote:

> asjo@koldfront.dk (Adam Sjøgren) writes:

>> Virker det at checke på child.nodeName=='SCRIPT' i stedet?

> Det virker i Firefox - jeg prøver med IE i morgen når jeg er tilbage på
> fabrikken (jeg har ikke nogen IE herhjemme), men jeg tvivler desværre.

Your faith is weak, young jedi - jeg poster da ikke sådan noget uden at
teste i MSIE først


Mvh.

Adam

--
"You have to be optimistic about the possibility of Adam Sjøgren
solving the problem, but skeptical about the value of asjo@koldfront.dk
whatever solution you've got so far."

Adam Sjøgren (14-07-2008)
Kommentar
Fra : Adam Sjøgren


Dato : 14-07-08 16:55

On Mon, 14 Jul 2008 17:50:02 +0200, Jacob wrote:

> Det går også fint med den kode jeg startede med at poste i Firefox,
> men ikke i IE. Det fandt jeg senere ud af skyldes at IE ikke parser
> det HTML den får retur ind i en passende DOM-struktur.

.... det tror jeg ikke er forklaringen, jvnf. runjs.html eksemplet - mon
ikke bare elt.type er en ikke-standard-ting og/eller noget MSIE ikke
implementerer?


Mvh.

Adam

--
"It's such a sadness, that you think you've seen a Adam Sjøgren
film on your fucking telephone. Get real." asjo@koldfront.dk

Jacob Bunk Nielsen (15-07-2008)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 15-07-08 08:25

asjo@koldfront.dk (Adam Sjøgren) writes:
> On Mon, 14 Jul 2008 17:51:54 +0200, Jacob wrote:
>> asjo@koldfront.dk (Adam Sjøgren) writes:
>
>>> Virker det at checke på child.nodeName=='SCRIPT' i stedet?
>
>> Det virker i Firefox - jeg prøver med IE i morgen når jeg er tilbage på
>> fabrikken (jeg har ikke nogen IE herhjemme), men jeg tvivler desværre.
>
> Your faith is weak, young jedi - jeg poster da ikke sådan noget uden at
> teste i MSIE først

Jo, men indpakningen er en anelse mere kompleks end den du har fundet
på. Jeg har tilføjet lidt til dit eksempel på:

http://ting.bunk.cc/runjs.html - hvis det virker skal du se to
alert-bokse. Det virker ikke hos mig. Hverken i Firefox eller IE.

--
Jacob - www.bunk.cc

Jacob Bunk Nielsen (15-07-2008)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 15-07-08 08:27

asjo@koldfront.dk (Adam Sjøgren) writes:
> On Mon, 14 Jul 2008 17:50:02 +0200, Jacob wrote:
>
>> Det går også fint med den kode jeg startede med at poste i Firefox,
>> men ikke i IE. Det fandt jeg senere ud af skyldes at IE ikke parser
>> det HTML den får retur ind i en passende DOM-struktur.
>
> ... det tror jeg ikke er forklaringen, jvnf. runjs.html eksemplet - mon
> ikke bare elt.type er en ikke-standard-ting og/eller noget MSIE ikke
> implementerer?

Nix, MSIE vil godt kendes ved elt.type. Jeg har prøvet at kigge lidt på
innerDOM¹, men jeg har endnu ikke rigtig fået det til at virke.

¹) http://innerdom.sourceforge.net/

--
Jacob - www.bunk.cc


Adam Sjøgren (15-07-2008)
Kommentar
Fra : Adam Sjøgren


Dato : 15-07-08 10:09

On Tue, 15 Jul 2008 09:24:35 +0200, Jacob wrote:

> Jo, men indpakningen er en anelse mere kompleks end den du har fundet
> på.

Mit eksempel viser at man kan via DOM kan traversere børnene i det
indsatte HTML og finde script-elementer, right?

> Jeg har tilføjet lidt til dit eksempel på:

> http://ting.bunk.cc/runjs.html - hvis det virker skal du se to
> alert-bokse. Det virker ikke hos mig. Hverken i Firefox eller IE.

Så er der nok en fejl i koden... Lad os se:

| for (var i = 0; i < children.length-1; i++) {

Her skipper du det sidste barn... Prøv at køre hele children-array'et
igennem, så kommer begge alert()s:

<http://koldfront.dk/misc/browsers/runjs.html>


,

Adam

--
"So this is what being a morning person is like, I Adam Sjøgren
thought. It's like being 80 years old." asjo@koldfront.dk

Adam Sjøgren (15-07-2008)
Kommentar
Fra : Adam Sjøgren


Dato : 15-07-08 10:18

On Tue, 15 Jul 2008 09:27:17 +0200, Jacob wrote:

> asjo@koldfront.dk (Adam Sjøgren) writes:

>> On Mon, 14 Jul 2008 17:50:02 +0200, Jacob wrote:

>>> Det går også fint med den kode jeg startede med at poste i Firefox,
>>> men ikke i IE. Det fandt jeg senere ud af skyldes at IE ikke parser
>>> det HTML den får retur ind i en passende DOM-struktur.

>> ... det tror jeg ikke er forklaringen, jvnf. runjs.html eksemplet - mon
>> ikke bare elt.type er en ikke-standard-ting og/eller noget MSIE ikke
>> implementerer?

> Nix, MSIE vil godt kendes ved elt.type.

Du har har ret .type virker fint i MSIE - det må være den dér off-by-one
der har snydt os hele tiden, så.


Mvh.

Adam

--
"We read all day and the teachers say, Adam Sjøgren
that it's all for your brighter future days. asjo@koldfront.dk
A chain gang song, in my ears,
I was not so good at school."

Jacob Bunk Nielsen (15-07-2008)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 15-07-08 10:30

asjo@koldfront.dk (Adam Sjøgren) writes:
> On Tue, 15 Jul 2008 09:24:35 +0200, Jacob wrote:
>
> Så er der nok en fejl i koden... Lad os se:
>
> | for (var i = 0; i < children.length-1; i++) {
>
> Her skipper du det sidste barn... Prøv at køre hele children-array'et
> igennem, så kommer begge alert()s:

Tak!

Så virker det sørme i både Firefox og MSIE, også når man checker:

if (child.type == 'text/javascript')

Herligt!

--
Jacob - www.bunk.cc

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste