Почему google.load приводит к тому, что моя страница пуста?
Ну, это выглядит странно, но я не могу найти решение.
Почему в мире этот скрипт 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>
Ответы
Ответ 1
Похоже, что google.load добавляет script на страницу с помощью 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-секундное ожидание с окном с задержкой предупреждения
Ответ 2
Вам просто нужно определить обратный вызов, и он не очистит страницу (возможно, старые версии google.load(), но, по-видимому, новые не используются при обратном вызове). Вот упрощенный пример, когда я загружаю libg файлы 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!
}
} )
}
Когда вы делаете это без callback(), я все равно получаю и пустую страницу, но с обратным вызовом, это исправлено для меня.
Ответ 3
Примечание. Для предотвращения временной задержки полезно следующее: оно как раз вовремя. Этот пример можно использовать в основном для всех сценариев (нуждающихся в нем), но особенно использовался с Greasemonkey. Он также использует API диаграммы Google в качестве примера, но это решение выходит за рамки других API Google и может использоваться везде, где вам нужно ждать загрузки script.
Использование google.load с обратным вызовом не помогло решить проблему при использовании Greasemonkey для добавления диаграммы Google. В процессе (Greasemonkey вводится на страницу) добавляется www.google.com/jsapi script node. После добавления этого элемента в jsapi javascript Google введенная (или страница) script готова к использованию команды google.load(которая должна быть загружена в добавленный node), но этот jsapi script не сделал загрузите еще. Установка тайм-аута работала, но таймаут был всего лишь обходным решением для гонки jsapi script для загрузки Google при вводе/странице script. Перемещение туда, где script выполняет google.load(и, возможно, google.setOnLoadCallback), может повлиять на ситуацию с расчетом времени. Следующее предложение - это решение, ожидающее загрузки элемента google script перед вызовом google.load. Вот пример:
// ********* 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";
Ответ 4
Вам не нужно устанавливать тайм-аут. Есть и другой способ:
$.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 script, тогда alert() будет выполнен после успешного google.load()
Ответ 5
Я столкнулся с этой проблемой при попытке переместить google.load(…)
внутри оболочки jQuery $(document).ready(…)
. Перемещение google.load(…)
назад за пределы готовой функции, чтобы она выполнялась, сразу же решила проблему.
Например, это не работает:
$(document).ready(function() {
google.load('visualization', '1', {packages: ['corechart']});
});
Но это делает:
google.load('visualization', '1', {packages: ['corechart']});
$(document).ready(function() {
// …
});