我有一个表单从用户那里获取地址,然后将该地址发送到我的服务器。我们的目标是使用Google的地理编码,确保在使用服务器打扰服务器之前,地址是唯一且可进行地理编码的。
我可以成功绑定form.submit,geocode,获取我的地标,确保它们是唯一的或不是..但我完全无法在回调中提交提交。这让我觉得我不应该在回调中这样做,但那就是我在这里的原因。
基本上,我需要一种方法来在表单调用上提交我的验证,这会触发回调 - 如果/当回调成功时,回调需要能够提交表单(不是AJAX帖子,谢谢)而不再触发验证。
Pseudocode跟随,从内存中输入..我已经尝试了两个.unbind('submit')。submit()并直接调用DOM提交,既没有工作,但我把它们都包括在这里为它的地狱
<html>
<head>
<!-- .. load google maps and jquery .. -->
<script type="text/javascript">
$(document).ready(function() {
// ... insure Google, get geocoder, etc.
geocoder = ...;
function geocodeCallback(result) {
// .. check if result was a success, and unique
if (.. yes, success ..) {
// use my not-included snazzy function to normalize the address
$('#loc').val(normalize(result.Placemark[0]));
$('#myform').unbind('submit');
$('#myform')[0].submit(); // see note above
} else {
// do something magically useful
}
}
$('#myform').bind('submit', function() {
geocoder.getLocations($('#loc').val(), geocodeCallBack);
return false;
});
});
</script>
</head>
<body>
<form id="myform" method="post" action="thispage.html">
<input type="text" name="loc" />
<input type="submit" name="sub" value="Submit" />
</form>
</body>
</html>
答案 0 :(得分:2)
基本上你需要设置一些sentinel值来表明它是有效的。例如:
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript">
num = 1;
$(function() {
$("#form").submit(function() {
if ($("#valid").val() == "false") {
setTimeout(callback, 1000);
$("#comment").text("comment " + num);
num++;
return false;
}
});
});
function callback() {
$("#valid").val("true");
$("#form").submit();
}
</script>
</head>
<body>
<form id="form">
<div id="comment"></div>
<input type="hidden" id="valid" name="valid" value="false">
<input type="text" name="loc">
<input type="submit" value="Submit">
</form>
</body>
</html>
值得指出的是,您不应该依赖此验证,而应该在服务器上重复此验证,因为无法阻止潜在的恶意攻击者欺骗看似有效的表单提交。
答案 1 :(得分:0)
您可以延迟表单提交决定,直到数据经过验证:
<script type="text/javascript">
$(document).ready(function() {
// ... insure Google, get geocoder, etc.
geocoder = ...;
var processingGeo = false;
var geoResult = false;
function geocodeCallback(result) {
// .. check if result was a success, and unique
if (.. yes, success ..) {
// use my not-included snazzy function to normalize the address
$('#loc').val(normalize(result.Placemark[0]));
geoResult = true;
} else {
// do something magically useful
geoResult = false;
}
processingGeo = false;
}
$('#myform').bind('submit', function() {
processingGeo = true;
geoResult = false;
geocoder.getLocations($('#loc').val(), geocodeCallBack);
while (processingGeo) {}
return geoResult;
});
});
</script>