Avatar billede kkaen Nybegynder
12. august 2010 - 11:07 Der er 8 kommentarer og
1 løsning

Fejl ved brug af GoogleMaps

Jeg har en applikation, som jeg har arbejdet på i mange måneder efterhånden. Så jeg har haft den oppe at køre adskillige gange.

Men pludselig vil den ikke mere. Jeg har en logging-funktion til at begynde med, så det styres, om en bruger kan rette i en mysql-database eller ej. Dette har også virket fint tidligere.

Jeg udvikler i Netbeans, og deri bruger jeg serveren Glassfish. Når jeg tester applikationen lokalt, så virker den fint. Men når jeg så lægger den ud på vores server, hvor applikationen bruger TomCat (altså kun denne applikation internt), så virker det pludselig ikke mere. Så giver browseren fejlen:

Detaljer om fejl på websiden

Brugeragent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Tidsstempling: Thu, 12 Aug 2010 08:58:35 UTC

Meddelelse: 'google.maps' er null eller ikke et objekt
Linje: 42
Tegn: 1151
Kode: 0
URI: http://maps.gstatic.com/intl/da_ALL/mapfiles/api-3/2/0/main.js

Er dette en fejl på google's server (grundet URI'en) eller hvordan kan jeg fejlsøge yderliggere?
(applikationen ligger på intranettet, hvorfor jeg desværre ikke kan oplyse en url til den. Jeg har netop i dag lavet en System.out.println() hele vejen ned gennem jsp'en, for at sikre mig, at alt forløb, som det skulle. Jeg har fået rettet nogle få fejl, og det virker som sagt lokalt i Netbeans. Kan der være fejl i TomCat på serveren, så jeg muligvis skal installere Glassfish på serveren? Eller kan TomCat have fået en fejl i sig, så TomCat skal geninstalleres?)
Avatar billede claes57 Ekspert
12. august 2010 - 12:04 #1
uden at gå videre ind i det, så har jeg oplevet at alm services på nettet, hvor man kan hente indhold til ens hjemmeside ikke virker, hvis man kører på lokalhost - det gælder bla nogle vejrkort. Google-maps kunne tænkes at have samme restriktioner.
Avatar billede kkaen Nybegynder
12. august 2010 - 12:40 #2
Som sagt har det virket fint i mange måneder. Og det både lokalt og udgivet. Problemet viser sig også kun, når det er den udgivede version, der forsøges brugt. Og det er vel det stik modsatte af, hvad du lige skrev :-)
Avatar billede kkaen Nybegynder
12. august 2010 - 13:48 #3
Nu fandt jeg ud af, hvordan man bruger debuggeren i Netbeans, og har efterfølgende debugget linie for linie i den problemfyldte jsp-side. Alt under debugningen forløb fint uden fejl. Men der var et enkelt sted i koden under gennemløbet, at jeg ved et tilfælde så, at der ved en javascript-funktion stod:

function navn(){;
...
}

Jeg fik naturligvis slettet ; efter {, men det gjorde ingen forskel i kørslen. Det kan være, at javascript-enginen er bygget til at ignorere sådanne fejl.

Så nu tester jeg igen gennem server-kald - altså ikke lokalt gennem Netbeans. Og jeg får stadig fejl.
I Firefox:
"
Denne side viderefører ikke forespørgslen korrekt
Firefox har opdaget at webstedet viderestiller forespørgslen til sig selv på en måde, der forhindrer den i nogensinde at blive færdig.
    *  Dette problem kan nogle gange skyldes, at cookies er slået fra, eller modtagelse af cookies er blevet nægtet.
"

Og i IE:
"
Detaljer om fejl på websiden

Brugeragent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Tidsstempling: Thu, 12 Aug 2010 11:45:17 UTC

Meddelelse: 'google.maps' er null eller ikke et objekt
Linje: 42
Tegn: 1151
Kode: 0
URI: http://maps.gstatic.com/intl/da_ALL/mapfiles/api-3/2/0/main.js
"
Avatar billede arne_v Ekspert
13. august 2010 - 03:52 #4
Har du overvejet at bruge noget mere færdigt?

ren JSP: http://www.lamatek.com/GoogleMaps/
(tilsyneladende er der dog en lille ting som skal fixes - se http://stackoverflow.com/questions/2364504/google-map-in-jsp-document )

JSF: http://code.google.com/p/gmaps4jsf/
Avatar billede kkaen Nybegynder
13. august 2010 - 08:27 #5
Ja, jeg havde faktisk overvejet det tag-library dér. Men jeg ser nogle problemer i det. For det første så har jeg benyttet en del javascript i den version, jeg selv laver. Altså hvor brugeren blot får tilsendt et resultset fra serveren, og javascripten så står for at benytte den. På den måde antog jeg, at en stor del af den ressource-krævende regnekraft overgik fra serveren til brugeren.
For det andet så ser jeg mulige problemer i det faktum, at når jeg besøger det link, vi taler om, og/eller endda går ind på siden med eksempler, så sker der ikke rigtig noget (linket skriver "Please wait", mens "hjulet" bliver ved med at køre rundt. Eksempelsiden skriver blot "please wait").
Derfor antager jeg, at brug af dette tag-lib blot vil give andre problemer.

Siden i går har jeg dog fundet ud af, at en del af problemet er, at der i IE er strenge krav til, hvor javascripten er placeret. Javascripten er muiligvis ikke årsag til den aktuelle problematik, men det er da en mulighed.
Javascript-funktioner kan placeres i HEAD, og de kan så kaldes gennem onload(). På den måde vil de først blive eksekveret efter body er renderet. Men jeg kan ikke umiddelbart se, hvordan javascripten så kan benyttes til at generere og indsætte html-kode inde i body-delen? Har jeg overset nogle muligheder i teknologien her?
Avatar billede kkaen Nybegynder
13. august 2010 - 08:38 #6
Jeg kunne naturligvis generere AL html-koden fra det punkt, hvor den aktuelle javascript-funktion skulle generere noget html-kode, inde i javascript-funktionen. Jeg er bare ikke sikker på, at det er en korrekt måde. Kode-genereringen bliver jo ikke opdelt i god programmør-skik.
Avatar billede kkaen Nybegynder
13. august 2010 - 11:34 #7
Nu har jeg forsøgt at tage tyren ved hornene.
Jeg har slettet alt "overflødigt" kode fra jsp-siden, og sat 2 test-pins ind. Resultatet er, at siden vises fint nok i Firefox. Men i IE kommer der stadig fejl.

Siden er vel efterhånden så simpel som muligt. Men hvorfor bliver IE ved med at brokke sig?

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><!--VIRKER-->
<!--<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">--><!--TIL CHECK AF SYNTAX (IF USED DURING RUNTIME THEN THE PAGE WONT SHOW!!!)-->
<html>
    <head>
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
        <title>Testpage</title>
        <script type="text/javascript" defer src="http://maps.google.com/maps/api/js?sensor=false&language=DK&region=DK"></script>
        <script type="text/javascript" defer>
            function addLoadEvent(func) {
                var oldonload = window.onload;
                if (typeof window.onload != 'function') {
                    //func= addLoadEvent(function){}
                    window.onload = func;
                }else {
                    //document.write("<table border=\"1\"><tr><td></td></tr></table>");
                    initialize();
                    window.onload = function() {
                        if (oldonload) {
                            oldonload();
                        }
                        func();
                    }
                }
            }

            //Doesn't seem to have any effect:'
            //Setup the map
            addLoadEvent(function() {
                //load();
                //showAddress("raleigh, nc");
                initialize();
            })

            var geocoder = null;
            var map = null;
            var coordinates = null;

            var numberOfMarkers=0;

            var hasLogoutBeenPressed="false";

            /***************************************************************************************************
            ********************When page is loaded a GeoCoder is initialized and the 'addressVar' is***********
            ********************added to the map****************************************************************
            ***************************************************************************************************/
            function load()
            {
                geocoder = new google.maps.Geocoder();
                geocoder.getLocations(addressVar, addToMap());
            }

            /***************************************************************************************************
            ********************This function adds the point to the map*****************************************
            ***************************************************************************************************/
            function addToMap(response)
            {
                //called in initialization of page:
                //Retrieve the object
                place = response.Placemark[0];

                // Retrieve the latitude and longitude
                point = new GLatLng(place.Point.coordinates[1],
                place.Point.coordinates[0]);

                point.toString();

                // Center the map on this point
                map.setCenter(point, 13);

                // Create a marker
                marker = new GMarker(point);

                // Add the marker to map
                map.addOverlay(marker);

                // Add address information to marker
                marker.openInfoWindowHtml(place.address);
            }

            var markerFromDB=new Array();

            function initialize() {
            var latlng = new google.maps.LatLng(55.8619, 9.8475);
                var markerlocations = new Array();
                markerlocations=[new google.maps.LatLng(55.94368,9.89451), new google.maps.LatLng(55.97368,9.84451)];
          var myOptions = {zoom: 10, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP};

                map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

                function deleteThisPinInTheDatabase(value)
                {
                    window.location = deletePinUrl+value;
                }

                //to modify the url to contain the typed value:
                function testResults(value) {
                    var TestVar=value;
                    //somehow the javascript-function CAN'T handle if the value ends with '0'. This is handled when the pin is created then.
                    //If the latitude/longtitude of the pin ends with '0' then it's deleted as it has no effect anyway
                    window.location = testResultsUrl+TestVar;
                }

                function deletePin(form){
                    var TestVar = form.dataField.value;
                    point=null;
                    srchType = null;
                    document.getElementById("srchType")=null;

                    windows.location = deletePinUrl+TestVar;
                }

                function modifyPin(form){
                    var TestVar = form.dataField.value;

                    if(TestVar.charAt(0)=='(' && TestVar.charAt(0)==')'){
                        TestVar=Testvar.subString(1, TestVar.length()-1);
                    }

                    //if NO ' is set around the videoUrl then the google-parser will produce an error!!!
                    window.location = modifyPinUrl+TestVar+"&modify=true&linkURL="+document.loginForm.linkURL.value+"&category="+document.loginForm.category.value+"&embedVideo='"+document.loginForm.embedVideo.value+"'&description="+document.loginForm.description.value+"'&location="+document.loginForm.location.value;
                }

                for(i=0; i<markerlocations.length; i++)
                {
                    markerFromDB[i]=new google.maps.Marker(
                    {  position: markerlocations[i],
                        map: map,
                        title: "Dobbeltklik for at ændre indholdet."
                    });

                google.maps.event.addListener(markerFromDB[i], 'click',
                    function(){
                        markerClick(this);
                    }
                );
                google.maps.event.addListener(markerFromDB[i], 'rightclick',
                    function(event) {
                        markerRightClick(this);
                    }
                );

                function markerRightClick(mark)
                {
                    for(var m3=0; m3<markerFromDB.length; ++m3)
                    {
                        if(markerFromDB[m3]==mark)
                        {
                            var answer=confirm("Er du sikker på, at du vil slette disse data fra databasen?");
                            if(answer){
                                deleteThisPinInTheDatabase(markerlocations[m3]);
                                markerFromDB[m3].setMap(null);
                                markerlocations[m3].setMap(null);
                                markerFromDB[m3]=null;
                            }
                            return;
                        }
                    }
                }

                    google.maps.event.addListener(markerFromDB[i], 'dblclick',
                        function(){
                                markerDblClick(this);
                        }
                    );
            }


            function markerDblClick(mark)
            {
                for(var m2=0; m2<markerFromDB.length; ++m2)
                {
                    if(markerFromDB[m2]==mark)
                    {
                        testResults(markerlocations[m2]);
                        return;
                    }
                }
            }

            function markerClick(mark)
            {
                for(var m=0; m<markerFromDB.length; ++m)
                {
                    if(markerFromDB[m]==mark)
                    {
                        map.set_center(markerlocations[m]);
                        map.set_zoom(16);
                        return;
                    }
                }
            }

            google.maps.event.addListener(map, 'click', function(event) {
              placeMarker(event.latLng);
            });
                    load();
                }

                var markerPosition;

                function placeMarker(location) {
                    //when manually mouseclick to set pin:
                    /***************************************************************************************************
                    ********************only allow 1 marker to be put on the map at a time******************************
                    ***************************************************************************************************/
                    if(numberOfMarkers<1){
                        var marker = new google.maps.Marker({
                            position: location,
                            draggable: true,
                            map: map
                        });
                        numberOfMarkers++;

                        /***************************************************************************************************
                        ********************To handle a single rightclick to delete marker on map***************************
                        ***************************************************************************************************/
                        //HAS to be placed here because the listener NEEDS a reference to each marker. The marker is generated in this function!
                        google.maps.event.addListener(marker, "rightclick", function() {
                            deleteMarker(this);
                        });

                        function deleteMarker(mark)
                        {
                            mark.setMap(null);
                            numberOfMarkers--;

                            var srchType = document.getElementById("srchType");
                            //save the position of the marker in the hidden form-value
                            srchType.value="";
                        }
                    }
                    markerPosition=marker.position;

                    /***************************************************************************************************
                    ********************save a javascript-variable in a variable in the form****************************
                    ***************************************************************************************************/
                    //get reference to hidden value in form
                    var srchType = document.getElementById("srchType");

                    //save the position of the marker in the hidden form-value
                    srchType.value=markerPosition;
                    map.setCenter(location);
                }

                /***************************************************************************************************
                ********************Pinpoints a location on the map from the coordinates entered********************
                ***************************************************************************************************/
                function codeLatLng()
                {
                    var input;

                    if(input != null){
                        input = null;
                    }
                    //the writen coordinates from the textfield:
                    input = document.getElementById("coordinates").value;

                    var latlngStr, lat, lng, latlng;
                    if(latlngStr!=null){
                        latlngStr=null;
                    }
                    if(lat!=null){
                        lat=null;
                    }
                    if(lng!=null){
                        lng=null;
                    }
                    if(latlng!=null){
                        latlng=null;
                    }
                    if(document.getElementById("srchType") != null){
                        document.getElementById("srchType").value = "";
                    }

                    latlngStr = input.split(",",2);
                    lat = Number(latlngStr[0]);
                    lng = Number(latlngStr[1]);

                    latlng = new google.maps.LatLng(lat, lng);

                    if (geocoder)
                    {
                      geocoder.geocode({'latLng': latlng}, function(results, status) {
                        if(status == google.maps.GeocoderStatus.OK)
                        {
                            if (results[1])
                            {
                                if(numberOfMarkers<1){
                                    map.setZoom(13);

                                    if(coordinates!=null){
                                        coordinates=null;
                                    }

                                    coordinates=results[0].geometry.location;

                                    var hiddenElem;
                                    if(hiddenElem != null){
                                        hiddenElem =null;
                                    }
                                    //store variable in hidden field:
                                    hiddenElem = document.getElementById("hid");

                                    if(hiddenElem){
                                        hiddenElem.value = coordinates;
                                    }

                                    var srchType;
                                    if(srchType != null){
                                        srchType =null;
                                    }
                                    //store variable in hidden field as in mouseClick
                                    //get reference to hidden value in form
                                    srchType = document.getElementById("srchType");

                                    //save the position of the marker in the hidden form-value
                                    srchType.value=latlng;

                                    //Initial way to do it, but it's not accurate:
                                    //map.setCenter(results[0].geometry.location);
                                    //instead of inaccurate way:
                                    map.setCenter(latlng);
                                    var marker = new google.maps.Marker({
                                        position: latlng,
                                        map: map
                                    });

                                    //HAS to be placed here because the listener NEEDS a reference to each marker. The marker is generated in this function!
                                    google.maps.event.addListener(marker, "rightclick", function() {
                                        deleteMarker(this);
                                    });

                                    numberOfMarkers++;

                                    function deleteMarker(mark)
                                    {
                                        mark.setMap(null);
                                        numberOfMarkers--;
                                        mark=null;

                                        document.getElementById("srchType")=null;
                                        var srchType = document.getElementById("srchType");
                                        //save the position of the marker in the hidden form-value
                                        srchType.value="";
                                    }
                                }else
                                {
                                    alert("Du har allerede indsat en pin. Hvis du vil sætte en ny pin, skal den gamle først slettes via et højreklik via musen på pin'en!");
                                }
                            }else
                            {
                                alert("Result[] ikke result[1]");
                            }
                        }else{
                            if(status == google.maps.GeocoderStatus.ZERO_RESULTS)
                            {
                                alert("Fejl i Google: Google opfatter det angivne som en ikke-eksisterende adresse eller en 'afsides beliggenhed'.");
                            }else{
                                    alert("Koordinaterne ikke fundet: " + status);
                                }
                        }
                      });
                    }else{
                        alert("Fejl i GeoCoder som er en del af Google");
                    }
                }

                function test(){
                    var hiddenElem = document.getElementById("hidden");
                    if(hiddenElem)
                        hiddenElem.value = marker;
                }
        </script>
        <link rel="stylesheet" href="dialog.css" media="all" type="text/css"/>
        <link rel="stylesheet" href="example-variants.css" media="all" type="text/css"/> <!-- optional: black drip style -->
        <style type="text/css">
            .btnExample {
                color: #FFF;
                background: #0000ff;
                font-weight: bold;
                border: 1px solid #900;
            }
            .btnExample:hover {
                color: #0000ff;
                background: #FFF;
            }
        </style>
        <style type="text/css">
            .dialog {
                position:relative;
                margin:0px auto;
                min-width:8em;
                max-width:760px; /* based on image dimensions - not quite consistent with drip styles yet */
                color:#fff;
                z-index:1;
                margin-left:0px; /* default, width of left corner */
                margin-bottom:0px; /* spacing under dialog */
            }

            .dialog .content,
            .dialog .t,
            .dialog .b,
            .dialog .b div {
                background:transparent url(../src/dialog2-blue-800x1600.png) no-repeat top right;
                _background-image:url(../src/dialog2-blue.gif);
            }

            .dialog .content {
                position:relative;
                _overflow-y:hidden;
                padding:0px 0px -20px 0px;
            }

            .dialog .t {
                /* top+left vertical slice */
                position:absolute;
                left:0px;
                top:0px;
                width:12px; /* top slice width */
                margin-left:-12px;
                height:100%;
                _height:1600px; /* arbitrary long height, IE 6 */
                background-position:top left;
            }

            .dialog .b {
                /* bottom */
                position:relative;
                width:100%;
            }

            .dialog .b,
            .dialog .b div {
                height:30px; /* height of bottom cap/shade */
                font-size:1px;
            }

            .dialog .b {
                background-position:bottom right;
            }

            .dialog .b div {
                position:relative;
                width:12px; /* bottom corner width */
                margin-left:-12px;
                background-position:bottom left;
            }

            .dialog .hd,
            .dialog .bd,
            .dialog .ft {
                position:relative;
            }

            .dialog .wrapper {
                /* extra content protector - preventing vertical overflow (past background) */
                position:static;
                max-height:1000px;
                overflow:auto; /* note that overflow:auto causes a rather annoying redraw "lag" in Firefox 2, and may degrade performance. Might be worth trying without if you aren't worried about height/overflow issues. */
            }

            .dialog h1,
            .dialog p {
                margin:0px; /* margins will blow out backgrounds, leaving whitespace. */
                padding:0px 0px 0px 0px;
            }

            .dialog h1 {
                padding-bottom:0px;
            }
        </style>
    </head>
    <body onload="addLoadEvent();" >
        <!-- test if the browser is Firefox which the application is developed to fit: -->
        <noscript>
            <p style="font-weight: bold">JavaScript must be enabled in order for you to use this site.
                However, it seems JavaScript is either disabled or not supported by your browser.
                To view the maps and use the other features on this site you must enable JavaScript by
                changing your browser-options and then try again.
            </p>
        </noscript>
        <script TYPE="text/javascript">
            <!-- -->  <HR>
            <!-- -->  <P ALIGN=center><STRONG>Your browser does not appear to
            <!-- -->  support JavaScript.
            <!-- -->  <BR>This form will not be useful to you
            <!-- -->  without a browser that supports JavaScript.</STRONG></P>
            <!-- -->  <HR>

            <!--
            if (0 < navigator.userAgent.indexOf("Opera/3")) {
                document.write ("<HR><P ALIGN=center><BIG>Opera 3.x"
                    + " Warning</BIG></P>");
                document.write ("<P>Versions 3.0 through 3.51 of the Opera Web"
                    + " browser contain flaws that prevent the hemisphere"
                    + " indication and designation from working properly."
                    + " It is recommended that you use another browser to"
                    + " view and use this page.<HR>");
            }
            -->
        </script>
        <div id="tableDiv" style="height: 27%">
        <table border="0" width="100%" style="margin-right: -10px; margin-bottom: -35px; margin-top: -10px; margin-left: 0px; padding: -10px;">
            <tr>
                <td>
                    Test:
                </td>
            </tr>
        </table>
        </div>
        <div id="map_canvas" style="width:100%; height:73%"></div>
        <object id="obj" style="visibility: hidden"></object>
    </body>
</html>
Avatar billede kkaen Nybegynder
13. august 2010 - 13:24 #8
Det var "defer", som skulle slettes. Nu kan siden da vises. Men jeg må lige teste lidt mere på mandag :-)
Avatar billede kkaen Nybegynder
13. september 2010 - 09:58 #9
Det ser ud som om, problemet blev løst. Det eksisterer dog stadig, når netsiden tilgås fra bestemte systemer. Men jeg vil tro, årsagen til det er, at det er lave versioner af IE, samt at diverse plugins ikke er installeret.
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
Kurser inden for grundlæggende programmering

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