【问题标题】:Javascript - function not working inside jQuery(document).ready (Google map geocode)Javascript - 函数在 jQuery(document).ready 中不起作用(谷歌地图地理编码)
【发布时间】:2012-12-06 09:38:35
【问题描述】:

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

在此处查看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 输入..)???

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

【问题讨论】:

    标签: javascript jquery google-maps-api-3


    【解决方案1】:

    简单的解决方法是替换

    function codeAddress() { ... }
    

    codeAddress = function() { ... }
    

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

    【讨论】:

    • 谢谢,它确实有效 - 但我想了解一下,以免重复这个错误。如果我使用 jquery()click. 事件 - 而不是 onclick) - 那么我可以将它移回内部??
    • @ObmerkKronen 是的,这也有效。原因是您随后在其可见范围内(在声明它的函数内)绑定该函数。绑定函数后,引用它的变量 codeAddress 将离开作用域,因此“codeAddress”将未定义,但它所引用的函数将保持绑定到 DOM 元素的单击事件。
    • +1 用于评论解释并为可能的解决方案投票 - 请参阅我的更新。谢谢..
    • @ObmerkKronen 你不必为不接受答案而道歉——我回答问题是为了强迫自己每天至少处理一个对我来说陌生的问题。这不是为了声誉,而是为了保持大脑润滑:)
    • 不是为了道歉 - 但老实说,所有答案 - 即使显示不同的逻辑 - 对我来说都可以。而且我了解“大脑润滑”-根据可用时间,我也尝试这样做(尽管不是与 JS 相关的问题-更多的 PHP 和 Wordpress ..)再次感谢。
    【解决方案2】:

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

    例如

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

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

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

    【讨论】:

    • 这不是对所提问题的回答
    • 它会解决被问到的问题并且是更好的做法。
    • 它确实解决了问题,实际上 - 我误读了你的答案。不过,我不同意这是最佳做法。我发现如果按钮的单击处理程序绑定在 onclick 属性中,则更容易理解按钮应该做什么,因为当您查看元素时该行为立即可见,而不必搜索对它的引用。我认为在代码中绑定真正有利的唯一情况是当您实际进行动态绑定时。
    • 问题不是我不熟悉不显眼的 javascript 的概念,而是我不同意它作为一个全面的解决方案。对于与 DOM 元素具有固定 1:1 关系的函数,我发现 HTML 内绑定非常合理且更具可读性。
    【解决方案3】:

    单击按钮时,会在全局范围内查找 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
            }
        })
    });
    

    【讨论】:

    • 感谢您的回答-但为了更好地理解-您在说什么,我根本不需要 document.ready 吗?对于所有功能?如果不是 - 为什么只有那个?。
    • @ObmerkKronen 不,只是为了定义您将在$(document).ready( ... )之外 的其他地方使用的函数。
    • 好的。我知道这是我自己在这里说话的无知 - 但是当文档加载完成时,$(document).ready( ... )function 不应该加载任何其他函数,并使它们可供使用?或者你的意思是onclick实际上被认为是outside
    • @ObmerkKronen 函数声明本身不做任何事情,因此它们在就绪处理程序之外是安全的。其余代码应保留在内部,因为它们只能在文档实际准备好时运行。是的,onclick 属性中的代码全局运行。
    • +1 + 解释和耐心。学到了很多。见更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多