3

我有一个小的谷歌地图脚本可以从 Lat Lon 对或 address 获取位置,还可以更新那些 lat, lon 和 address 输入字段..

在这里查看jsfiddle

单击“绘制”按钮时 -codeAddress()应该调用一个被调用的函数。但在萤火虫控制台上我得到:

Error: ReferenceError: codeAddress is not defined

我不明白为什么codeAddress()没有定义...

奇怪的是,如果我将函数移到

jQuery(document).ready(function(){}它确实有效(请参阅jsFIDDLE

(我还需要移动var marker- 否则它只会使地图居中,并给出marker is undefined错误;

所以我的问题很简单,我做错了什么?为什么相同的功能在外部起作用jQuery(document).ready(function(){}但在内部不起作用?

还有一个问题:拖动标记时如何更新地址输入字段(如 lon lat 输入..)?

UPDATE - 感谢大家 - 学到了另一件重要的事情。不幸的是 - 所有都是有效的答案和解决方案 - 但我只能接受一个,对我来说,最容易理解的解决方案(对 JS 非常不熟悉 - 尽管它可能不是完美的做法)是 @cowls 再次感谢大家。 .

4

3 回答 3

3

简单的解决方案是更换

function codeAddress() { ... }

codeAddress = function() { ... }

您的问题是您将 codeAddress 声明为一个变量,其范围对于您绑定到文档就绪处理程序的函数是本地的。因此,该函数一退出,codeAddress 就不再存在。第二个声明(注意缺少的“var”)将 codeAddress 声明为全局变量,因此在准备函数退出后它仍可访问。

于 2012-12-06T09:48:48.583 回答
2

而不是使用 onclick,您应该为 document.ready 方法内的所需元素分配一个点击处理程序。

例如

$(input).click(function() { codeAddress() });

将代码地址函数分配给所有输入框的单击事件,显然您希望将其定位在特定的类或 id

这是最佳实践,而不是使用 onclick。

于 2012-12-06T09:45:45.257 回答
2

单击按钮时,codeAddress()将在全局范围内查找,但您已在$(document).ready().

在外面声明函数$(document).ready()可能是这里最好的方法,只有你只会从就绪处理程序内部调用的函数才应该在里面定义;这样做也会使您准备好的处理程序保持清洁。

要在标记被拖动到某个位置时找到该位置,您需要使用GeoCoder服务器将其映射到文本位置:

var geocoder = new google.maps.Geocoder();

google.maps.event.addListener(marker, 'dragend', function(evt) {
    geocoder.geocode({latLng: evt.latLng}, function(results, status) {
        if (status==google.maps.GeocoderStatus.OK && results.length) {
            // do something with results[0..x].formatted_address
        }
    })
});
于 2012-12-06T09:46:22.253 回答