[JS] Problemen in IE 7 (at random )

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Ik ben bezig met een applicatie te maken die om de 1 second een woord op het scherm plaatst die hij uit de database haalt, om dit te doen zonder te refreshen moet ik gebruik maken van ajax.

Nu werkt dit heel goed in Chrome en Firefox maar heb ik problemen met IE 8, lagere versies ook. Het probleem is echter niet makkelijk te achterhalen vermits hij op andere momenten blijft hangen en hij op sommige PC's, ook met IE 8, wel goed gaat.

Hieronder vind je de error en de code :

Message: 'document.getElementById(...)' is null or not an object Line: 42 Char: 1 Code: 0 URI: http://axonet.be/projects/yzebaert/system/js/ajax.js

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/* comment voor lijnen goed te zetten */
sessvars.step = sessvars.step || 1;
var seconds = 1;
var divid = "words";
var woord = 0;
var url = "generatewords.php";
var aantalwoorden = 15;

////////////////////////////////
//
// Refreshing the DIV
//
////////////////////////////////

function refreshdiv(list){
    setTimeout(function(){document.getElementById(divid).innerHTML = "";},1000);    
// The XMLHttpRequest object
var xmlHttp;
try{
xmlHttp=new XMLHttpRequest(); // Firefox, Opera 8.0+, Safari
}
catch (e){
try{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); // Internet Explorer
}
catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e){
alert("Your browser does not support AJAX.");
return false;
}
}
}

var nocacheurl = url+"?num="+woord+"&list="+list;
// The code...

xmlHttp.onreadystatechange=function(){
if(xmlHttp.readyState==4){
document.getElementById(divid).innerHTML=xmlHttp.responseText;
if(woord == aantalwoorden)
{
    setTimeout('doorsturen()',1000)
}
else
{
    setTimeout("refreshdiv('"+list+"')",seconds * 1000);
}
}
}
xmlHttp.open("GET",nocacheurl,true);
xmlHttp.send(null);
woord = woord + 1;
}
// Start the refreshing process
function doorsturen(){
        window.location="./words.php?step="+sessvars.step+"&act=invoer";
        sessvars.step++;
    }


Wat heb ik al geprobeerd :

- De innerhtml te vervangen door een functie omdat IE innerhtml niet ondersteund. Dit was zonder resultaat want het bleef nog op bepaalde ogenblikken hangen.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik heb je project even bekeken maar waarom, in vre-des-naam, gebruik misbruik je hier Ajax voor :? :X
Een arraytje van 15 woorden in JS uitpoepen is toch geen rocket science? En dat scheelt je (per bezoeker!) 15 http requests...

Je gebruikt al PHP. Haal 15 random woorden op en poep die als een JS array uit. Voila.

PHP:
1
2
3
4
5
6
7
8
9
<html>
    <head>
        <script type="text/javascript" src="foo.js"></script>
        <script type="text/javascript" src="bar.js"></script>
        <script type="text/javascript">
            var words = new Array(<?php printwords(); ?>);
        </script>
    </head>
...


En dan maak je een printwords() functie die iets uitpoept als:
code:
1
'appel','banaan','stoep','tweaker','flapdrol'

(Even opletten dat je wel escaped waar nodig, zodat 'ie niet op z'n bek gaat bij 's-Hertogenbosch ofzo ;) )

[ Voor 64% gewijzigd door RobIII op 26-03-2010 00:47 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
RobIII schreef op vrijdag 26 maart 2010 @ 00:38:
Ik heb je project even bekeken maar waarom, in vre-des-naam, gebruik misbruik je hier Ajax voor :? :X
Een arraytje van 15 woorden in JS uitpoepen is toch geen rocket science? En dat scheelt je (per bezoeker!) 15 http requests...

Je gebruikt al PHP. Haal 15 random woorden op en poep die als een JS array uit. Voila.
Ik heb dit gedaan om de gebruiker in staat te stellen via een administratiepaneel de woorden aan te passen in de database. Naar mijn weten kan je geen connectie met de database maken vanuit JavaScript, hiervoor had ik Ajax nodig.

Ophalen moet toch via Ajax, anders moet ik deze in hidden fields gaan zetten om deze op te halen niet?

[ Voor 6% gewijzigd door Droned op 26-03-2010 00:42 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Droned schreef op vrijdag 26 maart 2010 @ 00:41:
Ik heb dit gedaan om de gebruiker in staat te stellen via een administratiepaneel de woorden aan te passen in de database.
Dus :?
Droned schreef op vrijdag 26 maart 2010 @ 00:41:
Naar mijn weten kan je geen connectie met de database maken vanuit JavaScript
Dat hoeft toch ook niet? Je kunt toch server-side die array bouwen en als "dynamisch script" uitpoepen? Zie mijn vorige post.
Droned schreef op vrijdag 26 maart 2010 @ 00:41:
Ophalen moet toch via Ajax, anders moet ik deze in hidden fields gaan zetten om deze op te halen niet?
Nee :?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Ok bedankt voor de informatie, maar los hiervan, waaraan ligt het probleem dan dat ik krijg?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Droned schreef op vrijdag 26 maart 2010 @ 00:44:
Ok bedankt voor de informatie, maar los hiervan, waaraan ligt het probleem dan dat ik krijg?
Geen idee maar als ik jou was zou ik er niet eens moeite in steken dit nog op te lossen. Dit is echt een schoolvoorbeeld way-waaaay overengineered en "Ajax!!11 want dat is hip!!111". Drop it. Die hele lap code die je in de TS hebt staan kun je vervangen door 1 regel.

offtopic:
Ik keek zojuist nog eens:
var words = new Array(<br />
<b>Fatal error</b>: Call to undefined function printwords() in <b>/home/admin/domains/axonet.be/public_html/projects/yzebaert/words.php</b> on line <b>16</b><br />
:X Je neemt me iets té letterlijk... Maar ik neem aan dat dit een "Work in Progress is" ;) :P

[ Voor 34% gewijzigd door RobIII op 26-03-2010 00:52 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
RobIII schreef op vrijdag 26 maart 2010 @ 00:45:
[...]

Geen idee maar als ik jou was zou ik er niet eens moeite in steken dit nog op te lossen. Dit is echt een schoolvoorbeeld way-waaaay overengineered en "Ajax!!11 want dat is hip!!111". Drop it. Die hele lap code die je in de TS hebt staan kun je vervangen door 1 regel.

offtopic:
Ik keek zojuist nog eens:
var words = new Array(<br />
<b>Fatal error</b>: Call to undefined function printwords() in <b>/home/admin/domains/axonet.be/public_html/projects/yzebaert/words.php</b> on line <b>16</b><br />
:X Je neemt me iets té letterlijk... Maar ik neem aan dat dit een "Work in Progress is" ;) :P
Ja inderdaad dit is "work in progress". Bedankt in iedergeval voor de goede raad. Ik had op het internet voor een manier om random woorden te tonen gezocht en iedereen zei "Ajax", vandaar het gebruik ervan. Daarom vind ik het fijn zo een mensen als jou te ontmoeten die met een nuchtere kijk de zaak benaderen !

Edit :

Ik ben ook helemaal geen expert in Javascript, ik krijg de array nu binnen maar hoe kan ik deze met een white space tussen tonen? Dus dat het woord 2 seconden blijft staan dan 1sec wit en dan het nieuwe woord?

Hier wat ik nu heb maar dan gaat hij ze gewoon af en toont de laatste natuurlijk :)

JavaScript:
1
2
3
4
5
6
7
8
9
10
function showwords(list)
{
    var i = 0;
    while(i < list.length)
    {
        document.getElementById("words").innerHTML = list[i];
        i++;
    }
    
}

[ Voor 18% gewijzigd door Droned op 26-03-2010 01:53 ]


Acties:
  • 0 Henk 'm!

  • Rvanlaak
  • Registratie: Juni 2005
  • Laatst online: 19-09 10:52
Je zult variabele i buiten de functie moeten plaatsen, anders dan zal de variabele opgeruimde worden als de functie is doorlopen.

Daarna zul je de functie door middel van een javascript interval moeten aanroepen. In de functie zelf zul je dan nog moeten checken of je nog niet de hele array doorlopen hebt.

Dus, iets in de zin van

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var i = 0;
var y = window.setInterval('showwords()', 1000);

function showwords(list)
{

    if( i < list.length() )
    {
        document.getElementById("words").innerHTML += list[i] + " ";
        i++;
    }
    else
       window.clearInterval(y);
    
}

Acties:
  • 0 Henk 'm!

  • pieturp
  • Registratie: April 2004
  • Laatst online: 18-09 15:56

pieturp

gaffa!

JavaScript:
1
var y = setInterval(showwords, 1000);

Geen code in strings gebruiken voor setTimeout/setInterval :X
Eval is evil en traaag. Gebruik gewoon een verwijzing naar een functie :)

... en etcetera en zo

Pagina: 1