2014-01-12 167 views
0

我正在嘗試構建一個簡單的移動應用程序,用於檢查數據庫並根據用戶的位置爲用戶提供正確的場所。基本上,我有兩個文件:一個用geolocation,JavaScript和AJAX調用,另一個用php檢查數據庫併發回正確的結果。一切都自行完成,但是當我嘗試將geolocation座標發送給PHP時,它將返回undefined。爲什麼它沒有選取座標(它們在另一個窗口中彈出)?我該如何解決它?將AJAX通過JavaScript變量傳遞給PHP時的未定義變量

這是我geolocation和AJAX代碼:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 
    <script> 
      $(document).ready(function() { 

       var latitude; 
       var longitude; 

       if (navigator.geolocation) { 
        var timeoutVal = 10 * 1000 * 1000; 
        navigator.geolocation.getCurrentPosition(
        displayPosition, 
        displayError, 
        { enableHighAccuracy: true, timeout: timeoutVal, maximumAge: 0 } 
       ); 
       } 
       else { 
        alert("Geolocation is not supported by this browser"); 
       } 

       function displayPosition(position) { 
        var latitude = position.coords.latitude; 
        var longitude = position.coords.longitude; 
        alert("Latitude: " + position.coords.latitude + ", Longitude: " + position.coords.longitude); 
       } 


       function displayError(error) { 
        var errors = { 
        1: 'Permission denied', 
        2: 'Position unavailable', 
        3: 'Request timeout' 
        }; 
        alert("Error: " + errors[error.code]); 
       } 

       var request = $.ajax({ 
        url: "http://cs11ks.icsnewmedia.net/mobilemedia/ajax.php?latitude=" + latitude + "&longitude=" + longitude, 
        type: "GET",  
        dataType: "html" 
       }); 

       request.done(function(msg) { 
        $("#ajax").html(msg);   
       }); 

       request.fail(function(jqXHR, textStatus) { 
        alert("Request failed: " + textStatus); 
       }); 
      }); 
    </script> 

這裏是PHP的處理這些變量位:

if (isset($_GET['latitude']) && isset($_GET['longitude'])) { 
         $latitude = $_GET['latitude']; 
         $longitude = $_GET['longitude']; 
         echo "Geolocation seems to work..."; 
         echo $latitude; 
         echo $longitude; 
         //continue here 
        }else{ 
          echo "Hello. I am your geolocation and I am not working."; 
        } 

我得到的是「地理位置似乎工作... undefinedundefined「

回答

1

地理位置API是異步的,所以您必須等待結果返回

function displayPosition(position) { 
    var latitude = position.coords.latitude; 
    var longitude = position.coords.longitude; 

    $.ajax({ 
     url  : "http://cs11ks.icsnewmedia.net/mobilemedia/ajax.php", 
     data  : {latitude : latitude, longitude : longitude}, 
     type  : "GET",  
     dataType : "html" 
    }).done(function(msg) { 
     $("#ajax").html(msg);   
    }).fail(function(jqXHR, textStatus) { 
     alert("Request failed: " + textStatus); 
    }); 
} 
+0

謝謝你的快速回復!不幸的是,這並沒有幫助 - 現在什麼都沒有顯示出來,所以我猜AJAX通話已經壞了。 – Hakashi

+0

這應該起作用,它必須以這種或那種形式出現,同樣,Geolocation API是異步的,並且不能在回調之外使用返回的數據。警報是否彈出,您確定同源策略在這裏不是問題嗎? – adeneo

+0

我只是在手機上測試它,以確保它不是模擬器故障。由於警報(「緯度:」+ position.coords.latitude +「,經度:」+ position.coords.longitude);現在不再有任何東西出現了。但我也沒有得到一個錯誤。只是一個空白頁面。 – Hakashi

-1

不要在你的displayPosition函數中使用var。你不想在函數的作用域內聲明新的變量,你想爲前面在全局作用域中聲明的現有變量賦值。

+0

我宣佈他們在最高層。在displayPosition函數中,我只是分配值。除非有不同的方式才能做到這一點,可能會有所幫助? – Hakashi

+0

查看@FuMe的回答,基本上是說同樣的事情。如果您只是「分配值」,則不應使用var關鍵字。通過在displayPosition函數中使用var,您正在創建只存在於該函數內的新變量。見[這裏](http://coding.smashingmagazine.com/2009/08/01/what-you-need-to-know-about-javascript-scope/)。 您是否嘗試在ajax調用之前將緯度和經度變量回傳到控制檯?這可以確定它們在發送到PHP腳本時所持有的內容。 – Matt

0
function displayPosition(position) { 
       var latitude = position.coords.latitude; 
       var longitude = position.coords.longitude; 
       alert("Latitude: " + position.coords.latitude + ", Longitude: " + position.coords.longitude); 
      } 

在兩個變量中刪除var。這兩個在displayPosition之外是不可見的。當您使用$ .ajax調用時,您使用的是在$(document).raedy()下聲明的經度和緯度,但是您從不向其分配任何內容,因此它們未定義。 希望能解決您的問題。

P.S.你選擇警報中的值,因爲你使用的是位置而不是變量。

+0

不幸的是他們仍然顯示爲未定義。但是,無論如何謝謝你的幫助! – Hakashi

+0

將我的解決方案與@adeneo混合使用。你應該解決這個問題。所以等待地理定位api ..然後讓阿賈克斯呼籲... – FuMe

+0

這是我也認爲,這是有道理的。但是每當我將這兩個變量從displayPosition中取出時,它就會打破一個Ajax並且什麼都不顯示。當我把Ajax放在這個函數中時,它也停止工作。我一直在以各種不同的配置移動這兩個位,我總是得到相同的結果 - 一個空白頁。 – Hakashi