Php 智能定位表单字段
我在用户注册表单上有一个用于位置的文本字段 基本上,我希望这个字段能够根据谷歌地图(或等效)进行验证- 只允许通过有效的位置(理想的格式类似于滑铁卢、伦敦或英国伦敦) 要求:Php 智能定位表单字段,php,jquery,html,geolocation,location,Php,Jquery,Html,Geolocation,Location,我在用户注册表单上有一个用于位置的文本字段 基本上,我希望这个字段能够根据谷歌地图(或等效)进行验证- 只允许通过有效的位置(理想的格式类似于滑铁卢、伦敦或英国伦敦) 要求: 除了位置名称外,我还想返回该位置中心的坐标(lat、lng)(即使范围很广,如英国伦敦),因为我将交叉引用此坐标,以便向用户提供相关信息 当用户在字段*中键入时,基于有效位置(理想情况下只是政治位置-而不是街道特定位置)的自动完成列表/智能建议列表(编辑:见下文) 强制用户使用自动完成列表中的位置 允许此字段的权限将使用H
// Get more specific results from Google geocode
geocoder.geocode( { 'address': request.term, 'region': 'GB' }, function(results, status) {
$.map(results, function(item) {
var ignore = ['route', 'country', 'natural_feature', 'intersection', 'premise', 'subpremise', 'airport', 'park', 'point_of_interest', 'establishment', 'transit_station'];
if (valid_location(item.types, ignore) == 1) {
var sublocality;
var locality;
var region;
var country;
$.each(item.address_components, function (i, data) {
if ($.inArray('sublocality', data.types) > -1) {
sublocality = data.long_name;
}
if ($.inArray('locality', data.types) > -1) {
if (typeof sublocality == 'undefined') {
sublocality = data.long_name;
}
}
if ($.inArray('administrative_area_level_2', data.types) > -1) {
locality = data.long_name;
}
if ($.inArray('administrative_area_level_1', data.types) > -1) {
region = data.long_name;
}
if ($.inArray('country', data.types) > -1) {
country = data.long_name;
}
});
if ((country != 'United Kingdom') || ($.inArray('administrative_area_level_1', item.types) == -1)) {
var location = format_location(sublocality, locality, region, country);
if (duplicate(matches, location) == 0) {
matches.push({
label: location,
value: location,
latitude: item.geometry.location.lat(),
longitude: item.geometry.location.lng()
});
}
}
}
});
// Update autocomplete
response(matches);
})
两者的结合很好地提供了智能搜索和多种建议。困扰我的一个问题是,当我同时使用两个源(geonames和google geocode)时,输入选择范围非常不可靠-有时它会自动填充,选择附加部分,然后保持高亮显示,其他时候蓝色高亮显示消失(虽然它的行为就像它仍然在那里,即在按键时选择消失),而其他时候光标直接指向输入的末尾。我认为与谷歌地图有些冲突,而不是多个源问题,因为如果我有两个geonames源,这不会发生吗
任何人只要能改进,都能得到正确答案!
谢谢这里有一页相关的jQuery插件: 具体来说,对于您的问题:
.autocomplete()
是一个初始化函数。它不需要在每次keyup
上调用。这在调用.autocomplete()后自动处理
在jQuery元素上。在每个keyup
上调用它将导致巨大的性能损失以及许多其他神秘和/或意外的后果blur
检查这些值是一个坏主意。虽然我不赞成存储从autocomplete
返回的所有合法值,但我现在想不出更好的解决方案。我所做的是将每个合法值存储在<输入项的code>.data(),要在.blur()
上进行检查。它存储为哈希/关联数组,这意味着我们可以免费删除重复项Blur
存在问题,因为从autocomplete
建议中选择项目会在填充所选值之前固有地模糊输入。换句话说,您很可能会有一个无效位置。)这将要求您保存一个字符串作为匹配数据的一部分,该字符串可以发送回服务器进行验证。另一个问题是,如果您的服务器速度较慢,例如GeoNames free access,您可能无法立即获得用户的反馈自动完成
,并将有效的解决方案存储在输入
对象中作为jQuery数据。我还将其编码为扩展,因此可以在任何jQuery选择器上调用它:
很抱歉,我不得不取消选中此选项作为答案(关于第2点),因为这不会给出正确的自动完成结果,也不会影响所有结果