所以,正如@sahmad 所建议的那样,看起来 AJAX 是要走的路。就像我之前说的,我开始尝试使用浏览器插件解决问题。我为此使用了喷火。一路上学到了一些艰难的教训。最重要的是,当您对插件进行更改时,您要么需要使插件崩溃并重新加载页面,要么需要重新启动浏览器。我浪费了很多时间,对这个简单的事实一无所知。这个插件方向对我来说也花了更长的时间,因为我的 C++ 技能处于开发的早期阶段。
AJAX 路由很容易学习。我使用这个页面作为我的起点: http: //www.degraeve.com/reference/simple-ajax-example.php
我以为我会完成我的示例并报告我的解决方案,然后这件事就全部结束了。但是,在创建示例的过程中,我提出了另一个问题。以下是文件:
我像这样修改了html文件:
<html>
<head>
<title>Simple Ajax Example</title>
<script language="Javascript">
function xmlhttpPost(strURL) {
var xmlHttpReq = false;
var self = this;
// Mozilla/Safari
if (window.XMLHttpRequest) {
self.xmlHttpReq = new XMLHttpRequest();
}
// IE
else if (window.ActiveXObject) {
self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
self.xmlHttpReq.open('POST', strURL, true);
self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
self.xmlHttpReq.onreadystatechange = function() {
if (self.xmlHttpReq.readyState == 4) {
updatepage(self.xmlHttpReq.responseText);
}
}
self.xmlHttpReq.send(getquerystring());
}
function getquerystring() {
qstr = 'latLon=' + escape(document.forms['f1'].lat.value + ':' + document.forms['f1'].lon.value);
return qstr;
}
function updatepage(str){
document.getElementById("result").innerHTML = str;
}
function moveMarker(){
document.getElementById("timer").innerHTML= parseFloat(document.getElementById("timer").innerHTML) + 1
xmlhttpPost("/cgi-bin/ajax3.py")
var latFromGPS = document.forms["f1"]["gpsLat"].value;
var lonFromGPS = document.forms["f1"]["gpsLon"].value;
document.forms["f1"]["lat"].value=latFromGPS;
document.forms["f1"]["lon"].value=lonFromGPS;
}
window.setInterval('moveMarker()', 2000);
</script>
</head>
<body>
<form name="f1">
<p id=timer>0</p>
<p><input type="text" id="lat" name="lat" value="35.0"> </p>
<!-- <input type="hidden" name="gpsLat" value="35.0"> -->
<p><input type="text" id="lon" name="lon" value="-106.0"> </p>
<div id="result"></div>
</form>
</body>
</html>
这是我的python cgi脚本(对于这个例子,它应该在cgi-bin中保存为ajax3.py):
#! /usr/bin/python
import cgi
import cgitb; cgitb.enable() # for troubleshooting
print "Content-type: text/html"
print ""
# Create instance of FieldStorage
form = cgi.FieldStorage()
gpsLat = float(form.getvalue("latLon").split(":")[0])
gpsLon = float(form.getvalue("latLon").split(":")[1])
print '<input type="hidden" name="gpsLat" value="%s">' % (gpsLat + 0.001)
print '<input type="hidden" name="gpsLon" value="%s">' % (gpsLon + 0.001)
我试图通过简单地将千分之一度添加到 cgi 脚本中的纬度和经度来模拟 GPS 报告坐标。然后通过隐藏的输入类型将此结果发送回原始页面。有趣的是,我实际上必须以两倍于我希望报告坐标的频率调用 moveMarker()。这不是问题,但我想了解为什么会这样。从我幼稚的角度来看,我认为
xmlhttpPost("/cgi-bin/ajax3.py")
命令将在下一个命令之前执行并完成
var latFromGPS = document.forms["f1"]["gpsLat"].value;
被处决。然而,情况并非如此。那么第一个命令是仅在一定时间后完成还是直到 moveMarker() 完成后才完成?