Javascript-函数在jQuery(document).ready(谷歌地图地理代码)中不起作用

Javascript-函数在jQuery(document).ready(谷歌地图地理代码)中不起作用,javascript,jquery,google-maps-api-3,Javascript,Jquery,Google Maps Api 3,我有一个小的谷歌地图脚本,可以从Lat-Lon对或address获取位置,还可以更新Lat、Lon和address输入字段 看这里 单击“绘制”按钮时,应调用名为codeAddress()的函数。 但在firebug控制台上,我得到: Error: ReferenceError: codeAddress is not defined 我不明白为什么没有定义codeAddress() 奇怪的是,如果我把函数移到 jQuery(document).ready(function(){} (我还需要移

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

看这里

单击“绘制”按钮时,应调用名为
codeAddress()
的函数。 但在firebug控制台上,我得到:

Error: ReferenceError: codeAddress is not defined
我不明白为什么没有定义
codeAddress()

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

jQuery(document).ready(function(){}

(我还需要移动
var标记
——否则它只会将地图居中,并给出
标记未定义
错误

所以我的问题很简单,我做错了什么? 为什么同一个函数在
jQuery(document).ready(function(){}
外部工作,但在内部不工作

还有一个附带问题:当拖动标记时(比如lon-lat输入),如何更新地址输入字段


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

您应该为document.ready方法中所需的元素指定一个单击处理程序,而不是使用onclick

例如

将代码地址函数分配给所有输入框的click事件,显然您希望将其针对特定的类或ID


这是最佳做法,而不是使用onclick。

单击按钮时,会在全局范围内查找
codeAddress()
,但您已在
$(document).ready()中定义了它

$(document).ready()之外声明函数在这里可能是最好的,只有从ready处理程序内部调用的函数才应该在内部定义;这样做还可以使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
        }
    })
});

简单的解决办法是替换

function codeAddress() { ... }


您的问题是,您将codeAddress声明为一个变量,其作用域是绑定到document ready处理程序的函数的本地范围。因此,一旦该函数退出,codeAddress就不再存在。第二个声明(请注意缺少的“var”)将codeAddress声明为全局变量,因此在ready函数退出后,它将保持可访问性。

这不是对所问问题的回答。这将解决所问问题,是更好的做法。事实上,它确实解决了问题-我误读了你的答案。不过,我不同意,这是最佳做法。我发现它非常容易如果按钮的单击处理程序绑定在onclick属性中,则更容易理解按钮应该做什么,因为当您查看元素时,行为会立即可见,而不必搜索对它的引用。我认为在代码中绑定真正有利的唯一时间是当您实际动态绑定时。请参阅:pr问题不是我不熟悉不引人注目的javascript的概念,而是我不同意将其作为一个整体解决方案。对于与DOM元素具有固定的1:1关系的函数,我发现HTML绑定非常合理且更具可读性。感谢您的回答-但为了更好地理解-您是什么ying,我不需要这个文档。准备好了吗?所有的函数都需要吗?如果不需要,为什么只有那个呢?@ObmerkKronen不,只是为了定义你将在
$(文档)之外的其他地方使用的函数。准备好了(…)
。好的。我知道这是我自己的无知,但
$(文档)。准备好了吗(…)
应该加载的函数当文档加载完成时,任何其他函数都在其中,并使它们可供使用??或者您的意思是,
onclick
实际上被认为是
外部
?@ObmerkKronen函数声明本身不做任何事情,因此它们在就绪处理程序之外是安全的。其余的其中的代码应该留在内部,因为它们只能在文档实际准备就绪时运行。是的,内部的代码
onclick
属性全局运行。+1+感谢您的解释和耐心。学到了很多。请参阅UpdateAnks,它确实有效-但为了不重复此错误,我想了解一下。如果我使用
jquery()单击。
event-而不是
onclick
)-然后我可以将其移回@ObmerkKronen中是的,这也可以。原因是您随后将从函数可见的范围内(在声明函数的函数内)绑定函数。绑定函数后,引用它的变量codeAddress将离开作用域,因此“codeAddress”将是未定义的,但它引用的函数将始终绑定到DOM元素的单击事件。+1用于注释解释,并向上投票以获得可能的解决方案-请参阅我的更新。谢谢..@ObmerkKronen您不必为不接受答案而道歉-我回答问题是为了强迫自己每天至少处理一个问题这对我来说是陌生的一天。这不是为了名誉,而是为了保持大脑的润滑:)不是为了道歉——但老实说,所有的答案——即使表现出不同的逻辑——对我来说都是可以的。我理解“大脑润滑”——基于可用的时间,我也尝试这样做(虽然不是关于JS的问题-更多关于PHP和Wordpress…)再次感谢。
function codeAddress() { ... }
codeAddress = function() { ... }