[php]Ajax werkt soms niet in IE6

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Ik maak in een php script gebruik van ajax en wel voor het volgende:

De gebruiker voert een postcode in in een tekstvel bij het verlaten van de focus wordt een php script uitgevoerd dat adhv de ingevoerde postcode gaat kijken wat het bijbehorende "ID" is van de postcode (omdat ik hier intern mee werk ipv de postcode..)..

Deze code (javascript is het volgende:)

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
function updatepc(){
   
    
    var XMLHTTPObject = new XMLHttpRequest();
    XMLHTTPObject.open('GET', 'ajax/postcode.php?pc='+document.profiel.postcode.value, true);
    XMLHTTPObject.setRequestHeader("Cache-Control", "no-cache");
    XMLHTTPObject.setRequestHeader("X_USERAGENT", "controleerpostcode");
    XMLHTTPObject.send(null);
            //alert(XMLHTTPObject.readyState);
                XMLHTTPObject.onreadystatechange=function() {
                if (XMLHTTPObject.readyState==4) {
                    terug = XMLHTTPObject.responseText;
                    alert(terug);
                    
                    if(terug.length !=0){       
                            
                            document.getElementById('meerpostcodes').innerHTML ="<fieldset><legend>Gevonden overeenkomsten<font class='fout'> <b>(Corrigeer indien nodig!)      </b></font></legend><table>"+terug+"</table></fieldset></td></tr>";
                            stelin();
                    }else{
                        document.getElementById('meerpostcodes').innerHTML="<font color='red'><center><b>ONGELDIGE POSTCODE</b></center></font>";
                        document.profiel.pcinternnummer.value = "";
                    }
                    
                                        
                    
                }
            }
    }
    function stelin(){
        var res = document.profiel.keuzes.value;
        if (document.profiel.keuzes.value = 'undefined' ){
                for(var i = 0; i < document.profiel.keuzes.length; i++) { 
                    if(document.profiel.keuzes[i].checked) { 
                        var res = document.profiel.keuzes[i].value;
                    } 
                }
        } 
    
        document.profiel.txtPCIntern.value=res;
    }


De functie updatepc() wordt uitgevoerd na een onchange op het postcode tekstvak, de functie stelin) wordt opgeroepen vanuit updatepc() om een hidden tekstfield te vullen met het id dat schuilgaat achter de postcode..

en de phpcode die hiermee ook wordt uitgevoerd:

PHP:
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
<?php
    include("../db_connect.php");
    //Deze file dient voor het controleren van de ingevoerde postcode en toont als het nodig is de gebruiker een popup waarin hij de juiste postcode kan kiezen
    //(in het geval er meermaals dezelfde pc voorkomt!)
    if(isset($_SERVER['HTTP_X_USERAGENT']) && $_SERVER['HTTP_X_USERAGENT'] =='controleerpostcode')
    {
        $postcode = addslashes($_GET['pc']);
        $query="SELECT * FROM postcodes WHERE postcode='".$postcode."'";
        $resultaat = mysql_query($query) or die(mysq_error());
        $terug="";
        $aantal =0;
        while($p = mysql_fetch_array($resultaat)){
            $aantal++;
            if($aantal ==1){
                $terug.="<tr><td><input type='radio' name='keuzes' value='".$p['id']."' checked onclick='stelin();'></td><td>".$p['gemeente']."</td></tr>";
            }else{
                $terug.="<tr><td><input type='radio' name='keuzes' value='".$p['id']."' onclick='stelin();'></td><td>".$p['gemeente']."</td></tr>";
            }
        }
        echo($terug);
        
    }
    else
    {
        include("../404.php");
    }
    
?>


Nu het probleem:

- In firefox werkt dit perfect, het heeft nog nooit vastgelopen of gedaan wat het niet moet doen...
- in IE6 geeft het soms wel problemen, soms voert hij de php code uit en soms niet, ik heb getest met het doen uitvoeren van een alert(terug) in updatepc, en als ik niet het gewenste resultaat krijg te zien dan krijg ik een lege alert te zien..

Kan iemand me vertellen wat er verkkeerd is waarom dit niet in IE6 werkkt?

Acties:
  • 0 Henk 'm!

  • N3oC
  • Registratie: Juni 2006
  • Laatst online: 19-09 16:56
Php uitvoeren licht niet aan de browser (tenzij deze je Javasript niet uitvoert), dit heeft volledig te maken met de PHP server. Staat in IE6 javasript wel aan?

[ Voor 14% gewijzigd door N3oC op 22-07-2007 15:48 ]

https://www.linkedin.com/in/coenversluis || http://www.judovianen.nl


Acties:
  • 0 Henk 'm!

  • funkwurm
  • Registratie: December 2005
  • Laatst online: 22-02-2021
N3oC schreef op zondag 22 juli 2007 @ 15:48:
Php uitvoeren licht niet aan de browser (tenzij deze je Javasript niet uitvoert), dit heeft volledig te maken met de PHP server. Staat in IE6 javasript wel aan?
Hij krijgt een alert() en jij vraagt of javascript wel aan staat...

Ik zou je script eens strippen totdat het probleem niet meer voorkomt, wat je dan als laatste heb weggehaald was waarschijnlijk de oorzaak. Begin bijvoorbeeld eens met het weglaten van die X_USERAGENT header. Zou me best voor kunnen stellen dat IE niet goed met die headers is (lezen is al een probleem, dus laat staan schrijven).

Acties:
  • 0 Henk 'm!

  • N3oC
  • Registratie: Juni 2006
  • Laatst online: 19-09 16:56
Srry idd, heb ik verkeerd gelezen :S

https://www.linkedin.com/in/coenversluis || http://www.judovianen.nl


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Wat wil je sowieso bereiken met die useragent check? Als ik dat zou zien kan ik met n firefox extensie makkelijk mn useragent faken en alsnog direct die pagina aanroepen. Wat geeft het dat iemand die pagina direct zou aanroepen?

Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
opzich niets...

Ik heb die check weggehaald en het probleem blijft...

[ Voor 65% gewijzigd door bibawa op 22-07-2007 18:58 ]


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 12:54
Ik weet niet of het er mee te maken heeft, maar ik zie in de JavaScript function "stelin" een aantal gekke dingen staan. Ten eerste gebruik je maar 1 '=' teken in het eerste if-statement, ipv 2 ==. Ook declareer je twee maal dezelde variabele naam, je doet tweemaal "var res", gaat die twee toekenning ooit goed komen als je uit je loops gaat?

Acties:
  • 0 Henk 'm!

  • Fatamorgana
  • Registratie: Augustus 2001
  • Laatst online: 21-07 01:24

Fatamorgana

Fietsen is gezond.


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
MJa inderdaad, ik heb er maar meteen == van gemaakt en bij de tweede res de var weggehaald, maar dat lost het probleem ook nog niet op grmbl :@...

Acties:
  • 0 Henk 'm!

  • Cobalt
  • Registratie: Januari 2004
  • Laatst online: 28-08 14:11
new XMLHttpRequest(); wordt niet ondersteund door IE 6 en eerder, pas in IE 7 kan je XMLHttpRequest() direct aanroepen zoals in Opera, Safari en Firefox

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
var versies = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];          
var xmlHttpRequest  = null;
if(window.XMLHttpRequest){
    xmlHttpRequest = new XMLHttpRequest();
}else if(window.ActiveXObject){                 
    for(var i = 0; i < versies.length; i++){
        try{
            xmlHttpRequest = new ActiveXObject(versies [i]);
        }catch (error){
        }
    }
}
//TODO: for loop laten stoppen wanneer een xmlHttpRequest object succesvol gemaakt is

Acties:
  • 0 Henk 'm!

  • funkwurm
  • Registratie: December 2005
  • Laatst online: 22-02-2021
Crisp heeft een soortgelijke oplossing maar door te returnen wordt de loop gestopt:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
if (!window.XMLHttpRequest) {
  window.XMLHttpRequest = function () {
    var types = ['MSXML2.XMLHTTP','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP.4.0','MSXML2.XMLHTTP.5.0','Microsoft.XMLHTTP'];
    var i = types.length;
    while (i--) {
      try {
        return new ActiveXObject(types[i]);
      }
      catch (e) {}
    }
    return undefined;
  }
}

Maar als het script het soms wel en soms niet doet dan vraag ik me af of dit de oplossing biedt. Ik zou me kunnen voorstellen dat als het aan het gebruik van IE6 of IE7 ligt, dat TS er dan al wel achter was gekomen dat het een versie-probleem was en niet alleen IE vs. FF.

Dus ik was er vanuit gegaan dat TS zijn XMLHttpRequest for IE6 code gewoon niet gepost had.

[ Voor 31% gewijzigd door funkwurm op 23-07-2007 16:12 ]


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
funkwurm schreef op maandag 23 juli 2007 @ 16:08:
Crisp heeft een soortgelijke oplossing maar door te returnen wordt de loop gestopt:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
if (!window.XMLHttpRequest) {
  window.XMLHttpRequest = function () {
    var types = ['MSXML2.XMLHTTP','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP.4.0','MSXML2.XMLHTTP.5.0','Microsoft.XMLHTTP'];
    var i = types.length;
    while (i--) {
      try {
        return new ActiveXObject(types[i]);
      }
      catch (e) {}
    }
    return undefined;
  }
}

Maar als het script het soms wel en soms niet doet dan vraag ik me af of dit de oplossing biedt. Ik zou me kunnen voorstellen dat als het aan het gebruik van IE6 of IE7 ligt, dat TS er dan al wel achter was gekomen dat het een versie-probleem was en niet alleen IE vs. FF.

Dus ik was er vanuit gegaan dat TS zijn XMLHttpRequest for IE6 code gewoon niet gepost had.
Dat had ik identiek hetzelfde, buiten het feit dat mijn stuk code met een for lus ipv while werkte.. Nu heb ik het vervangen door dat van jouw , maar met hetzelfde resultaat (wat ook logisch is :p)..

Ik snap het probleem eigenllijk niet, vanaf het moment er een postcode wordt ingegeven die 2 gemeenten teruggeeft dan loopt het mis :s


---
EDIT: blijkbaar is het echt een caching probleem :X ik heb een random nummer bij m'n get toegevoegd en nu blijkt het ding wel te werken in IE...

[ Voor 5% gewijzigd door bibawa op 24-07-2007 19:53 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
if (!window.XMLHttpRequest) {
    window.XMLHttpRequest = function() {
        // http://blogs.msdn.com/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx
        var types = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0'];
        for (var i = 0; i < types.length; i++) {
            try {
                return new ActiveXObject(types[i]);
            } catch(e) {}
        }
        return undefined;
    }
}

Dit is voor zover ik weet de 'nette' versie van crisp's code. Belangrijk is de verwijzing naar http://blogs.msdn.com/xml...in-internet-explorer.aspx

[ Voor 15% gewijzigd door RobIII op 24-07-2007 20:03 ]

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!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

RobIII schreef op dinsdag 24 juli 2007 @ 19:53:
[...]
Dit is voor zover ik weet de 'nette' versie van crisp's code. Belangrijk is de verwijzing naar http://blogs.msdn.com/xml...in-internet-explorer.aspx
jep, sommige XHR ActiveX controls zijn deprecated en/of buggy.

Overigens doen wij dit in ons ajax framework om clientside cacheing te voorkomen:
JavaScript:
1
2
3
4
5
if (options['nocache'])
{
    options['headers']['Cache-Control'] = 'no-cache';
    url += appendURLParms(url, { nocache: new Date().getTime() });
}

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
bibawa schreef op dinsdag 24 juli 2007 @ 19:43:
[...]

Dat had ik identiek hetzelfde, buiten het feit dat mijn stuk code met een for lus ipv while werkte.. Nu heb ik het vervangen door dat van jouw , maar met hetzelfde resultaat (wat ook logisch is :p)..

Ik snap het probleem eigenllijk niet, vanaf het moment er een postcode wordt ingegeven die 2 gemeenten teruggeeft dan loopt het mis :s


---
EDIT: blijkbaar is het echt een caching probleem :X ik heb een random nummer bij m'n get toegevoegd en nu blijkt het ding wel te werken in IE...
Dat hoeft niet persé de schuld te zijn van IE, kan ook aan de headers die jij zelf stuurt liggen. Het beste kan je het met (no cache) headers oplossen. Ik zie ook nog iets anders, waar je code in theorie fout zou kunnen lopen.

Je doe namelijk eerst de XMLHTTPRequest (aanroepen van de send methode), voordat je de onreadystatechange handler definieert. De response zou dan al eerder binnen kunnen zijn waardoor de handler nooit aangeroepen wordt.

Daarom zou ik altijd de handler vooraf definieren.

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Borizz schreef op dinsdag 24 juli 2007 @ 20:06:
[...]

Daarom zou ik altijd de handler vooraf definieren.
De readystatechange handler kan je het beste na de open() en voor de send() definieren

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • funkwurm
  • Registratie: December 2005
  • Laatst online: 22-02-2021
crisp schreef op dinsdag 24 juli 2007 @ 20:06:
[...]

jep, sommige XHR ActiveX controls zijn deprecated en/of buggy.
Dat weet je dan ook pas sinds de laatste keer dat ik je jouw ActiveX-oplossing zag posten :P Daarbij gebruik ik eigenlijk altijd liever while (i--) omdat het korter en qua performance uiteindelijk ook sneller is, of ben ik wat dat betreft ook alweer out-of-date?

(en dat het met een array van 2 weinig uitmaakt qua performance weet ik, maar ik heb er nu eenmaal een goede gewoonte van gemaakt)

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
funkwurm schreef op dinsdag 24 juli 2007 @ 20:43:
[...]

Dat weet je dan ook pas sinds de laatste keer dat ik je jouw ActiveX-oplossing zag posten :P Daarbij gebruik ik eigenlijk altijd liever while (i--) omdat het korter en qua performance uiteindelijk ook sneller is, of ben ik wat dat betreft ook alweer out-of-date?
Denk je echt dat dat merkbaar is :? Op een lus met duizenden of miljoenen iteraties misschien, niet voor een lus met 2 iteraties :D

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!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

funkwurm schreef op dinsdag 24 juli 2007 @ 20:43:
[...]

Dat weet je dan ook pas sinds de laatste keer dat ik je jouw ActiveX-oplossing zag posten :P
Sinds die blogpost van het MS XML team (oktober vorig jaar dus) :P
Daarbij gebruik ik eigenlijk altijd liever while (i--) omdat het korter en qua performance uiteindelijk ook sneller is, of ben ik wat dat betreft ook alweer out-of-date?

(en dat het met een array van 2 weinig uitmaakt qua performance weet ik, maar ik heb er nu eenmaal een goede gewoonte van gemaakt)
In dit geval gebruik ik liever de for-construct omdat volgorde van testen hier wel degelijk uitmaakt (je kan beter versie 6 dan versie 3 gebruiken) en je bij while (i--) dus ook de volgorde van je array zou moeten aanpassen naar iets dat onlogisch is.

Intentionally left blank

Pagina: 1