为什么 google.load 会导致我的页面变为空白?

IT技术 javascript google-visualization google-loader
2021-02-23 05:41:02

好吧,这看起来很奇怪,但我找不到解决方案。

为什么这个小提琴http://jsfiddle.net/carlesso/PKkFf/显示页面内容,然后当 google.load 发生时,页面变为空白?

如果 google.load 立即完成,它运行良好,但延迟它根本不起作用。

这里是你的懒惰(或更聪明)的页面源:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Ciao</title>
    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
  </head>
  <body>
    <h1>Test</h1>
    <div id="quicivanno">
      <p>ciao</p>
    </div>
  </body>
  <script type="text/javascript">
       setTimeout(function() {google.load('visualization', '1.0', {'packages':['corechart']});}, 2000);
  </script>
</html>​
5个回答

看起来 google.load 正在使用 document.write() 将脚本添加到页面中,如果在页面加载后使用,则会清除 html。

这解释更深入:http : //groups.google.com/group/google-ajax-search-api/browse_thread/thread/e07c2606498094e6

使用其中一个想法,您可以使用负载回调来强制它使用 append 而不是 doc.write:

setTimeout(function(){google.load('visualization', '1', {'callback':'alert("2 sec wait")', 'packages':['corechart']})}, 2000);

这演示了延迟警报窗口的 2 秒等待

我不想显示警报窗口是否有任何工作可以做到这一点?
2021-05-05 05:41:02
警报只是一个示例代码片段。它可以是任何东西。
2021-05-09 05:41:02
只需添加一个空的回调参数即可为我修复它。
2021-05-11 05:41:02
这很棒。我更改为按预期工作的唯一一件事是调用 drawChart 函数而不是警报函数。
2021-05-13 05:41:02

您只需要定义一个回调,它就不会清除页面(也许旧版本的 google.load() 可以,但如果与回调一起使用,新版本显然不会)。这是我加载“google.charts”库时的一个简化示例:

if(google) {
    google.load('visualization', '1.0', {
        packages: ['corechart'],
        callback: function() {
            // do stuff, if you wan't - it doesn't matter, because the page isn't blank!
        }
    } )
}

在没有回调()的情况下执行此操作时,我仍然会得到空白页 - 但是通过回调,它对我来说是固定的。

注意:以下内容有助于避免时间延迟 - 时间刚刚好。该示例通常可用于所有脚本(需要它),但特别适用于 Greasemonkey。它还以 Google 图表 API 为例,但此解决方案超越了其他 Google API,可用于您需要等待脚本加载的任何地方。

在使用 Greasemonkey 添加 Google 图表时,将 google.load 与回调一起使用并没有解决问题。在这个过程中(Greasemonkey 注入页面),添加了 www.google.com/jsapi 脚本节点。为谷歌的jsapi javascript添加这个元素后,注入的(或页面)脚本就可以使用google.load命令(需要在添加的节点中加载),但是这个jsapi脚本还没有加载。设置超时有效,但超时只是 Google jsapi 脚本加载与注入/页面脚本的计时竞争的一种解决方法。移动脚本执行 google.load(可能还有 google.setOnLoadCallback)的位置会影响计时竞争情况。下面提供了一种在调用 google.load 之前等待 google 脚本元素加载的解决方案。下面是一个例子:

// ********* INJECTED SCRIPT *********//
// add element
var gscript = document.createElement('script');
gscript.setAttribute("type", "application/javascript");
gscript.setAttribute("id", "XX-GMPlusGoogle-XX");
document.body.appendChild(gscript);

// event listener setup     
gscript.addEventListener("load",    
    function changeCB(params) {
        gscript.removeEventListener("load", changeCB);
        google.load("visualization", "1", {packages:["corechart"], "callback": 
            function drawChart() {
                var data;
                // set the durationChart data (not in example)
                data = new google.visualization.arrayToDataTable(durationChart);

                var options = {
                    title:"Chart Title",
                    legend: {position:"none"},
                    backgroundColor:"white",
                    colors:["white","Blue"],
                    width: window.innerWidth || document.body.clientWidth,
                    height: window.innerHeight || document.body.clientHeight,
                    vAxis: {title: "Durations", baselineColor: "black", textStyle:{fontSize:12}},
                    hAxis: {title: "Days Since First Instance"},
                    height: ((cnt > 5)? cnt * 50 : 300),
                    isStacked: true
                }; // options


                // put chart into your div element
                var chart = new google.visualization.BarChart(document.getElementById('XX-ChartDiv-XX'));
                chart.draw(data, options);
            } // drawChart function
        }); //packages within google.load & google load
    } // callback changeCB
);

// can use SSL as "https://www.google.com/jsapi";
gscript.src = "http://www.google.com/jsapi";

您不需要设置超时。还有一种方法:

$.getScript("https://www.google.com/jsapi", function () {
     google.load('visualization', '1', { 'callback': 'alert()', 'packages': ['corechart'] });
});

解释:

 function () {
     google.load('visualization', '1', { 'callback': 'alert()', 'packages': ['corechart'] });
 }

加载JSAPI脚本成功后会执行,google.load()成功后会执行alert()

我在尝试google.load(…)在 jQuery$(document).ready(…)包装器中移动 a 时遇到了这个问题google.load(…) back移到就绪函数之外以便立即执行解决了问题。

例如,这不起作用:

$(document).ready(function() {
    google.load('visualization', '1', {packages: ['corechart']});
});

但这确实:

google.load('visualization', '1', {packages: ['corechart']});
$(document).ready(function() {
    // …
});