使用 AJAX 将 lat/long 插入 SESSION 变量不起作用
Posted
技术标签:
【中文标题】使用 AJAX 将 lat/long 插入 SESSION 变量不起作用【英文标题】:Using AJAX to insert lat/long into SESSION variables not working 【发布时间】:2014-10-17 16:06:13 【问题描述】:我有一个带有企业目录的网站,其中包含城市链接,用户可以点击这些链接并找到该城市附近的企业。
到目前为止,我只是在链接上使用 GET 变量并使用 php 和 Google Maps API 处理位置来完成此操作。不幸的是,该站点开始每天生成超过 2500 个查询,因此我决定尝试使用 javascript API 在用户单击链接时检索 lat/lng 客户端,然后使用 AJAX 将其设置为 SESSION。我以为我走在正确的轨道上,但它不起作用。它似乎根本不起作用,或者只是在多次单击链接后才更改 SESSION 变量。我以为设置async:false
会解决它,但它没有
有什么想法吗?
这是我的测试页面:
<?php
session_start();
require_once('../includes/header.php');
echo $_SESSION["address"] . "<br>";
echo $_SESSION["lat"] . "<br>";
echo $_SESSION["lng"] . "<br>";
?>
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js"></script>
<a href="test.php" id="Orlando" class="loc">Orlando</a><br /><br />
<a href="test.php" id="Tampa" class="loc">Tampa</a><br /><br />
<a href="test.php" id="Daytona" class="loc">Daytona</a><br /><br />
<script type="text/javascript">
function setLoc(lat,lng,address)
$.ajax(
async: false,
type: 'POST',
url: 'setLoc.php',
data: lat: lat,lng: lng,address: address
);
$('.loc').each(function()
$(this).click(function()
var address = $(this).attr('id');
var geocoder = new google.maps.Geocoder();
geocoder.geocode( 'address': address+'FL', function(results, status)
var location = results[0].geometry.location;
lat=location.lat();
lng=location.lng();
setLoc(lat,lng,address);
);
);
);
</script>
<?php
require_once('../includes/footer.php');
?>
这是 setLoc.php 文件:
<?php
session_start();
unset($_SESSION["address"]);
unset($_SESSION["lat"]);
unset($_SESSION["lng"]);
$_SESSION["lat"] = $_POST["lat"];
$_SESSION["lng"] = $_POST["lng"];
$_SESSION["address"] = $_POST["address"]
?>
我添加了未设置,因为我认为每次清除它都会有所作为,但它没有
【问题讨论】:
首先,永远不要将 async 设置为 false,这里有龙。请记住,AJAX 是异步的,因此在 AJAX 完成之前不会设置 SESSION 变量。你可能想使用.when()
unsets
似乎没有必要。
感谢您指出正确的方向,我最终使用preventDefault()
和success:
函数来完成我需要的工作。
【参考方案1】:
我能够使用这个实现我想要的结果:
<script type="text/javascript">
function setLoc(lat,lng,address,href)
$.ajax(
type: 'POST',
url: 'setLoc.php',
data: lat: lat,lng: lng,address: address,
success: function()
location.href=href;
);
$('.loc').each(function()
$(this).click(function(e)
var href=$(this).attr('href');
e.preventDefault();
var address = $(this).attr('id');
var geocoder = new google.maps.Geocoder();
geocoder.geocode( 'address': address+'FL', function(results, status)
var location = results[0].geometry.location;
var lat=location.lat();
var lng=location.lng();
setLoc(lat,lng,address,href);
);
);
);
</script>
【讨论】:
以上是关于使用 AJAX 将 lat/long 插入 SESSION 变量不起作用的主要内容,如果未能解决你的问题,请参考以下文章
TileProvider 方法 getTile - 需要将 x 和 y 转换为 lat/long