Avatar billede kbirk Nybegynder
03. december 2009 - 16:45 Der er 13 kommentarer

Google Chrome is not AJAX enabled?

Hej med jer
Jeg sidder og arbejder med noget ajax og ville gerne have det til at virke i google chrome, da det også omhandler Google Maps.

Når jeg bruger nedenstående:
function GetXmlHttpObject() {
    if (window.xmlhttprequest) {
        // chrome, Firefox, IE7+, Opera, Safari
        return new xmlhttprequest();
    }
    // IE6
    try {
        // The latest stable version. It has the best security, performance, 
        // reliability, and W3C conformance. Ships with Vista, and available 
        // with other OS's via downloads and updates. 
        return new ActiveXObject('MSXML2.XMLHTTP.6.0');
    } catch (e) {
        try {
            // The fallback.
            return new ActiveXObject('MSXML2.XMLHTTP.3.0');
        } catch (e) {
            alert('This browser is not AJAX enabled.');
            return null;
        }
    } 

Returnere Chrome "This browser is not AJAX enabled.";


Bruger jeg denne:
function GetXmlHttpObject() {
        try { return new XMLHttpRequest(); } catch (e) { }
        try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { }
        alert("XMLHttpRequest not supported");
        return null;
}

Returnere xmlhttp status 0 i chrome, og IE virker slet ikke.

Sidste forsøg er:
function GetXmlHttpObject() {
if (window.XMLHttpRequest)
  {
  // code for IE7+, Firefox, Chrome, Opera, Safari
  return new XMLHttpRequest();
  }
else if (window.ActiveXObject)
  {
  // code for IE6, IE5
  return new ActiveXObject("Microsoft.XMLHTTP");
  }
else
  {
  alert("Your browser does not support XMLHTTP!");
  }
}

Her siger IE access denied og chrome for igen status 0 ud.

Mangler nogle guldkorn.

På forhånd tak

/Kasper
Avatar billede tjens Nybegynder
03. december 2009 - 20:40 #1
Jeg har en simpel demo fra et andet spørgsmål her:

http://tjens.dk/eksperten/888851/

Jeg mener den kører i alle browsere, men jeg synes også at koden ligner din.
Måske er dit første eksempels chrome-problem noget med at du har skrevet  i lowercase.

Det med at IE giver access denied, er vist kun når du kører direkte  fra harddisken: Prøv at lægge det under en webserver så linket starter med http://
Avatar billede mcardle Nybegynder
03. december 2009 - 21:17 #2
Det er muligvis fordi den er case sensitive:

prøv:
return new XMLHttpRequest();

// mcardle
Avatar billede mcardle Nybegynder
03. december 2009 - 21:18 #3
Hehe, så ikke lige din post tjens :o)
Avatar billede mcardle Nybegynder
03. december 2009 - 21:20 #4
Jeg har hapset denne kode fra http://dengodekode.dk, som er Ole Boles herinde fra:

(function(){
    if (window.XMLHttpRequest) return;
    var o = null, s,
    a = ["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
    for (var i=0,j=a.length; i<j; i++) {
        s=a[i];
        try {
            if (o=new ActiveXObject(s))  break;
        }
        catch(e){};
    }
    window.XMLHttpRequest = o ? function(){return new ActiveXObject(s)} : null;
    o = null;
})();

Så kan du kalde var ajax = new XMLHttpRequest(); ligemeget hvilken browser du sidder i.

//mcardle
Avatar billede kbirk Nybegynder
04. december 2009 - 09:20 #5
Hej med jer og tak for svarende..

Jeg har forsøgt med at ændre casen, og er kommet frem til denne:

if (window.ActiveXObject) {
        // try XMLHTTP ActiveX (Internet Explorer) version
        return new ActiveXObject("Microsoft.XMLHTTP");

    }
    else if (window.XMLHttpRequest) {
        // browser has native support for XMLHttpRequest object
        return new XMLHttpRequest();
    }
    return null;

Som det er der virker det stadig kun i IE. Stadig status 0 i chrome.

Hvis if'erne er byttet om så jeg først tester på "(window.XMLHttpRequest)" så virker det ikke i nogen browser.

Jeg kører det fra visual studio, så adressen er http://localhost:2388/VehicleInformationGoogleMapsTestSite/. Så det bør vel ikke gøre nogem forskel om jeg lægger det op på en IIS?

På forhånd tak..
Avatar billede kbirk Nybegynder
04. december 2009 - 09:21 #6
Hvordan skal...

(function(){
    if (window.XMLHttpRequest) return;
    var o = null, s,
    a = ["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
    for (var i=0,j=a.length; i<j; i++) {
        s=a[i];
        try {
            if (o=new ActiveXObject(s))  break;
        }
        catch(e){};
    }
    window.XMLHttpRequest = o ? function(){return new ActiveXObject(s)} : null;
    o = null;
})();

...benyttes?
Avatar billede mcardle Nybegynder
04. december 2009 - 10:09 #7
Du indsætter den i toppen af din side og så kan den bruges ved at sige var oHttp = new XMLHttpRequest(); og så kan du bruge objektet.

Se evt. mere på http://www.dengodekode.dk

// mcardle
Avatar billede tjens Nybegynder
04. december 2009 - 10:33 #8
#5
Hvad mener du med status 0 i chrome?
Bliver der dannet et XMLHttpRequest objekt, og status 0 opstår når du bruger objektet?
Hvis ja, skal du vise os koden med selve kaldet.

Men jeg synes du skal teste det på en rigtig webserver:
Måske giver dit Visual Studio testsite en smule anderledes svar end en rigtig webserver.
Avatar billede kbirk Nybegynder
07. december 2009 - 09:39 #9
Hej igen
Beklager forsinkelsen.

I GetXmlHttpObject() kan ses alle de forsøg jeg har prøvet.

Jeg er blevet lidt usikker på om det kan være denne der fejler i stedet.

function GetXmlDoc(inputXml) {
    if (window.DOMParser) {
        parser = new DOMParser();
        xmlDoc = parser.parseFromString(inputXml, "text/xml");
    }
    else // Internet Explorer
    {
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(inputXml);
    }
    return xmlDoc;
}



Min xmlhttp kode ser sådan ud pt.

var xmlhttp;
function loadData() {
    document.getElementById("txtStatus").innerHTML = 'Loading data...';
    document.getElementById("txtDebug").innerHTML = "1";

    nowDateTime = new Date();

    if (lastRequest == "") {
        nowDateTime.setDate(nowDateTime.getDate() - 7);
        lastRequest = "/" + nowDateTime.getFullYear() + "/" + (parseInt(nowDateTime.getMonth()) + 1) + "/" + nowDateTime.getDate() + "/" + nowDateTime.getHours() + "/" + nowDateTime.getMinutes() + "/" + nowDateTime.getSeconds();
        nowDateTime = new Date();
    }

    currentRequest = "/" + nowDateTime.getFullYear() + "/" + (parseInt(nowDateTime.getMonth()) + 1) + "/" + nowDateTime.getDate() + "/" + nowDateTime.getHours() + "/" + nowDateTime.getMinutes() + "/" + nowDateTime.getSeconds();


    var url = "http://pit-fleet-view/vehicleinformationservice/Service.svc/vis/vehicles/coordinates" + lastRequest;

    lastRequest = currentRequest;

    xmlhttp = GetXmlHttpObject();
    //xmlhttp = createXMLHttpRequest();
    if (xmlhttp == null) {
        alert("Your browser does not support AJAX!");
        return;
    }
    xmlhttp.onreadystatechange = loadDataDone;
    xmlhttp.open("GET", url, true);
    xmlhttp.send(null);
}

function loadDataDone() {
    if (xmlhttp.readyState == 4) {
        if (xmlhttp.status == 200 || xmlhttp.status == 304) {
            document.getElementById("txtStatus").innerHTML = '';
            DrawRoutes(xmlhttp.responseText);
            document.getElementById("txtDebug").innerHTML = 'OK: ' + " " + xmlhttp.status + " " + xmlhttp.statusText;
        }
        else {
            document.getElementById("txtStatus").innerHTML = 'Error: ' + " " + xmlhttp.status + " " + xmlhttp.statusText;
        }

    }
}

function GetXmlHttpObject() {
    /*if (window.XMLHttpRequest)
    {
    // code for IE7+, Firefox, Chrome, Opera, Safari
    return new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
    // code for IE6, IE5
    return new ActiveXObject("Microsoft.XMLHTTP");
    }
    else
    {
    alert("Your browser does not support XMLHTTP!");
    }*/


    /*try { return new XMLHttpRequest(); } catch (e) { }
    try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { }
    alert("XMLHttpRequest not supported");
    return null;*/

    /*if (window.XMLHttpRequest) {
    // chrome, Firefox, IE7+, Opera, Safari
    return new XMLHttpRequest();
    }
    // IE6
    try {
    // The latest stable version. It has the best security, performance, 
    // reliability, and W3C conformance. Ships with Vista, and available 
    // with other OS's via downloads and updates. 
    return new ActiveXObject('MSXML2.XMLHTTP.6.0');
    } catch (e) {
    try {
    // The fallback.
    return new ActiveXObject('MSXML2.XMLHTTP.3.0');
    } catch (e) {
    alert('This browser is not AJAX enabled.');
    return null;
    }
    }  */

    /*if (!window.XMLHttpRequest) {
    window.XMLHttpRequest = function() {
    var a = ["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
    var o = null;
    for (var i = 0, j = a.length; i < j; i++) {
    try {
    if (o = new ActiveXObject(a[i])) return o;
    }
    catch (e) { };
    }
    return a = o = null;
    }
    }*/

    /*
    // Hvis XMLHttpRequest understøttes, så returner en ny instans
    if (window.XMLHttpRequest) return new XMLHttpRequest();

    // Ellers - hvis ActiveX heller ikke understøttes, så returner null
    if (!window.ActiveXObject) return null;

    // Ellers oprettes et array med de forskellige objekt versioner - nyeste først
    var a = ["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
    var o = null;
    // For hver version ...
    for (var i = 0, j = a.length; i < j; i++) {
    // Undgå at generere fejl, hvis versionen ikke genkendes
    try {
    // Hvis objektet kan oprettes, så returner det
    if (o = new ActiveXObject(a[i])) return o;
    }
    catch (e) { };
    }
    // Hvis intet lykkedes, ryddes op og der returneres null
    return a = o = null;
    */

    if (window.ActiveXObject) {
        // try XMLHTTP ActiveX (Internet Explorer) version
        return new ActiveXObject("Microsoft.XMLHTTP");

    }
    else if (window.XMLHttpRequest) {
        // browser has native support for XMLHttpRequest object
        return new XMLHttpRequest();
        //return new ActiveXObject("Microsoft.XMLHTTP");
    }
    return null;
}

(function() {
    if (window.XMLHttpRequest) return;
    var o = null, s,
    a = ["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
    for (var i = 0, j = a.length; i < j; i++) {
        s = a[i];
        try {
            if (o = new ActiveXObject(s)) break;
        }
        catch (e) { };
    }
    window.XMLHttpRequest = o ? function() { return new ActiveXObject(s) } : null;
    o = null;
})();

function createXMLHttpRequest() {
    try { return new XMLHttpRequest(); } catch (e) { }
    try { return new ActiveXObject("Microsoft.XMLDOM"); } catch (e) { }
    alert("XMLHttpRequest not supported");
    return null;
}
Avatar billede tjens Nybegynder
07. december 2009 - 19:39 #10
Du behøver ikke at konvertere svaret fra XMLHttpRequest, for at bruge XML-DOM kommandoer på det.

Dette objekt er et XML_DOM objekt allerede:
xmlhttp.responseXML.documentElement
som du kan bruge direkte

Check sourcen til dette eksempel: (som er testet i flere browsere)
http://tjens.dk/javascript/examples/AddsFromXml/

som indlæser følgende XML: http://tjens.dk/javascript/examples/AddsFromXml/adds.xml
Avatar billede kbirk Nybegynder
08. december 2009 - 12:52 #11
Tak for tippet tjens.. Men det løser ikke mit problem med at få det til at køre i chrome.

i loadDataDone returnerer:

document.getElementById("txtDebug").innerHTML = 'OK: ' + " " + xmlhttp.status + " " + xmlhttp.statusText;

og

document.getElementById("txtStatus").innerHTML = 'Error: ' + " " + xmlhttp.status + " " + xmlhttp.statusText;

Error: 0 <- i chrome og OK: 200 OK i IE
Avatar billede tjens Nybegynder
08. december 2009 - 15:33 #12
Prøv at indsætte flere debuglinier.
f.eks.
  document.getElementById("txtDebug").innerHTML += 'readyState: ' + xmlhttp.readyState + "  status " + xmlhttp.status + '<br>';
som første linie i loadDataDone.

Bemærk at jeg bruger += i stedet for =. Det skal også ændres på andre tilsvarende linier (på nær den første der køres).


PS: Har du testet at svaret er gyldig XML?
f.eks. ved at lade MSIE åbne linket til XML-filen manuelt i adresselinien: http://pit-fleet-view/vehicleinformationservice/Service.svc/vis/vehicles/coordinates + den dato du tilsætter linket i scriptet.
Avatar billede kbirk Nybegynder
08. december 2009 - 16:01 #13
Har prøvet at debugge lidt på det:

Har sat ind så koden ser sådan ud:

function loadData() {
    document.getElementById("txtStatus").innerHTML = 'Loading data...';

    nowDateTime = new Date();

    if (lastRequest == "") {
        nowDateTime.setDate(nowDateTime.getDate() - 100);
        lastRequest = nowDateTime.getFullYear() + "-" + (parseInt(nowDateTime.getMonth()) + 1) + "-" + nowDateTime.getDate() + ";" + nowDateTime.getHours() + ":" + nowDateTime.getMinutes() + ":" + nowDateTime.getSeconds();
        nowDateTime = new Date();
    }

    currentRequest = "/" + nowDateTime.getFullYear() + "/" + (parseInt(nowDateTime.getMonth()) + 1) + "/" + nowDateTime.getDate() + "/" + nowDateTime.getHours() + "/" + nowDateTime.getMinutes() + "/" + nowDateTime.getSeconds();

    var url = "http://pit-fleet-view/vehicleinformationservice/Service.svc/vis/vehicles/coordinates/?q=" + lastRequest;
   
    lastRequest = currentRequest;
   
    xmlhttp = GetXmlHttpObject();
    //xmlhttp = createXMLHttpRequest();
    if (xmlhttp == null) {
        alert("Your browser does not support AJAX!");
        return;
    }
    document.getElementById("txtDebug").innerHTML += 'url: ' + url + '<br>';
    xmlhttp.onreadystatechange = loadDataDone;
    document.getElementById("txtDebug").innerHTML += 'After xmlhttp.onreadystatechange = loadDataDone<br>';
    xmlhttp.open("GET", url, true);
    xmlhttp.send(null);
}

function loadDataDone() {
    document.getElementById("txtDebug").innerHTML += 'readyState: ' + xmlhttp.readyState + '<br>';
    if (xmlhttp.readyState == 4) {
        document.getElementById("txtDebug").innerHTML += 'status: ' + xmlhttp.status + '<br>';
        if (xmlhttp.status == 200 || xmlhttp.status == 304) {
       
            document.getElementById("txtStatus").innerHTML = '';
            DrawRoutes(xmlhttp.responseXML.documentElement);
            document.getElementById("txtDebug").innerHTML += 'OK: ' + " " + xmlhttp.status + " " + xmlhttp.statusText + '<br>';
        }
        else {
            document.getElementById("txtStatus").innerHTML += 'Error: ' + " " + xmlhttp.status + " " + xmlhttp.statusText + '<br>';
        }

    }
}

RESULAT:

IE:
------------
DEBUG
url: http://pit-fleet-view/vehicleinformationservice/Service.svc/vis/vehicles/coordinates/?q=2009-8-30;15:58:31
After xmlhttp.onreadystatechange = loadDataDone
readyState: 1
readyState: 1
readyState: 2
readyState: 3
readyState: 4
status: 200
OK: 200 OK

Chrome:
------------
DEBUG
url: http://pit-fleet-view/vehicleinformationservice/Service.svc/vis/vehicles/coordinates/?q=2009-8-30;15:59:33
After xmlhttp.onreadystatechange = loadDataDone
readyState: 1
readyState: 4
status: 0
Loading data...Error: 0


Jeg har kigget på xml'en. Og med mindre chrome har meget strenge krav som IE ikke har, kan det ikke være den.
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