Функции обратного вызова JavaScript и Google Feed API
Я пытаюсь внедрить несколько каналов в мой сайт, используя функцию заполнения. Раньше у меня были идентичные блоки кода JavaScript на моей странице (по одному для каждого канала), но в интересах хорошего (или лучшего) кодера я решил вставить повторяющийся код во внешний файл сценария и запустить его с различными параметрами вместо.
К сожалению, каналы отказываются загружаться с моей новой реализацией, и у меня заканчиваются идеи. Я структурировал свою функцию обратного вызова на основе интересных предложений пользователя ndp в вопросе 9662168.
Итак, у меня есть следующие две функции в моем внешнем файле сценария (незначительное редактирование кода для простоты):
function populateRSSFeed(divID) {
var targetDiv = document.getElementById(divID);
return function callback(result) {
if (!result.error) {
var container = document.getElementById(targetDiv);
var list = document.createElement('ul');
<snip: div-population code here>
container.appendChild(list);
}
else
alert('Error fetching feeds!');
}
}
function initializeRSSFeed(callback, targetFeed) {
google.load('feeds','1');
var feed = new google.feeds.Feed(targetFeed);
var numEntries = 3;
feed.setNumEntries(numEntries);
feed.load(callback);
}
Эти функции называются в моем HTML следующим образом:
<script>
var callback = populateRSSFeed('feed-list-wrapper-1');
initializeRSSFeed(callback, 'http://rss.cnn.com/rss/cnn_topstories.rss');
</script>
Сообщение об ошибке, которое я получаю, заставляет меня думать, что что-то идет не так на этапе загрузки канала, но я не могу определить причину.
Uncaught TypeError: Cannot read property 'Feed' of undefined
Что, вы парни, думаете?
1 ответ
Похоже, вы не используете setOnLoadCallback
ждать загрузки скриптов Google. Это объясняет, почему google.feeds
не определено (что приводит непосредственно к ошибке, которую вы видите).
Попробуйте вместо этого использовать этот скрипт (я просто следовал примеру "Hello World" в Руководстве для разработчиков).
google.load('feeds','1');
function onGoogleReady() {
var callback = populateRSSFeed('feed-list-wrapper-1');
initializeRSSFeed(callback, 'http://rss.cnn.com/rss/cnn_topstories.rss');
}
google.setOnLoadCallback(onGoogleReady);