Javascript 为什么我的Google Maps API回调在前面的内联脚本之前执行?
我以前在site.js中声明了回调名为Javascript 为什么我的Google Maps API回调在前面的内联脚本之前执行?,javascript,jquery,google-maps,asp.net-core,callback,Javascript,Jquery,Google Maps,Asp.net Core,Callback,我以前在site.js中声明了回调名为initializeMap(但仍然在内联脚本中初始化),但为了简洁和隔离,我将其移到了这里,希望能够解决这个问题。但同样的问题依然存在 我知道async指示api在解析时并行获取并在可用时立即进行评估,但它不应该在内联脚本之前可用,对吗 我还了解到,defer表示在解析文档之前不会执行api,因此它仍然不应该可用 我确实看到了关于延迟的内容: 此属性允许消除解析器阻塞JavaScript,浏览器在继续解析之前必须加载和评估脚本。异步在这种情况下也有类似的效果
initializeMap
(但仍然在内联脚本中初始化),但为了简洁和隔离,我将其移到了这里,希望能够解决这个问题。但同样的问题依然存在
我知道async
指示api在解析时并行获取并在可用时立即进行评估,但它不应该在内联脚本之前可用,对吗
我还了解到,defer
表示在解析文档之前不会执行api,因此它仍然不应该可用
我确实看到了关于延迟的内容:
此属性允许消除解析器阻塞JavaScript,浏览器在继续解析之前必须加载和评估脚本。异步在这种情况下也有类似的效果
但是defer
仍然不应该阻止内联脚本首先执行,因为如果内联
标记上使用了属性,那么它只允许JavaScript不必被解析器阻塞
所以我很困惑。您上面的内联脚本确实是先运行的,但是
$(函数(){
是一个jQuery构造,它只在文档准备好后才在内部运行回调。看起来Google脚本是先运行的
如果您给Google的脚本赋予了defer
属性,它将只在DOM构建完成后运行,并且$(函数(){
将是不必要的。因此,只需将$(函数(){
中的所有内容移出init
即可,这样init
将处于顶层,并且在Google的脚本加载时可由Google调用:
Uncaught (in promise)
ld {message: "init is not a function", name: "InvalidValueError", stack: "Error at new ld (https://maps.googleapis.com/.......&callback=init:141:124"}
另一个控制流可能更容易理解的选项是将所有内容放在Google加载时调用的命名函数中(给定
defer
属性,只有在页面加载后才会出现)。您上面的内联脚本确实是先运行的,但$(函数(){
是一个jQuery构造,它只在文档准备好后在内部运行回调。它看起来像是Google脚本首先运行
如果您给Google的脚本赋予了defer
属性,它将只在DOM构建完成后运行,并且$(函数(){
将是不必要的。因此,只需将$(函数(){
中的所有内容移出init
即可,这样init
将处于顶层,并且在Google的脚本加载时可由Google调用:
Uncaught (in promise)
ld {message: "init is not a function", name: "InvalidValueError", stack: "Error at new ld (https://maps.googleapis.com/.......&callback=init:141:124"}
另一个控制流可能更容易理解的选项是将所有内容放在一个命名函数中,Google在加载时调用该函数(给定
defer
属性,该函数只会在页面加载后出现).不能肯定,自从我处理maps API以来,它已经是永久性的了。但这可能是因为在加载DOM之后才定义init
函数(它是在$(函数(){…});
中定义的;而使用的脚本(尽管它是在脚本之后定义的)在触发document ready事件之前正在执行。不能肯定,自从我处理maps API以来,它就一直在执行。但这可能是因为在加载DOM之前(它是在$(函数(){…})中定义的)
;而使用(虽然它是在脚本之后定义的)在触发document ready事件之前执行。比我快30秒。:)啊,伙计。我知道,但它没有为我点击,因为我使用了$(document)的速记。准备好了。谢谢你的回答。我会将其标记为正确,我会在早上检查。比我快30秒。:)啊,伙计。我知道,但它没有为我点击,因为我使用了$(文档)的速记。准备好了。谢谢你的回答。我会把它标记为正确的,我会在早上检查。
<script>
function init() {
var origin = {
isGoogle: $("#origin-isgoogle").val(),
coordinate: new google.maps.LatLng(@origin.Latitude, @origin.Longitude),
address: "@origin.StreetAddress",
marker: "@origin.MarkerName"
}, destination =
// etc
$(initializeAdpSummaryListener);