Как мне сохранить и получить доступ к значению родительского элемента iFrame с помощью jQuery? - PullRequest
1 голос
/ 18 ноября 2010

У меня есть сайт, который состоит из одной родительской страницы.Используя палитру jQuery в стиле лайтбокса, я открываю другие страницы в iFrames, которые плавают поверх родительской страницы, стиль наложения.

В коде javascript на страницах iFrame я загружаю данные JSON из Facebook.Поскольку загрузка данных из Facebook занимает много времени, я хочу сохранить загруженные данные в переменной, которая находится на родительской странице.

Затем каждый раз, когда я открываю новый iFrame в оверлее, я хочу иметь возможность проверить, является ли переменная родительской страницы пустой или нет.Если он пуст, я загружаю данные из Facebook.Если он не пустой, я получаю данные из переменной на родительской странице.

Единственная причина, по которой я хочу это сделать, - повышение производительности и избежание ненужных вызовов API Facebook.

Как создать решение, в котором javascript в iFrame может хранить и получать доступ к данным из переменной, которая находится на его родительской странице?

У меня нет реального кода, но в псевдокодеЯ хотел бы что-то вроде этого:

function loadFacebookFriends() {
   if(parentFriendsVariable is empty) {
      Load friends from Facebook
   }
   else {
      localFriendsVariable = parentFriendsVariable
   }
}

Вызов API Facebook выглядит следующим образом:

FB.api("/me/friends?fields=name,first_name,picture", function(friendsData) {
    // When this callback is executed, the data I want is
    // now in the object:
    friendsData.data
});

На родительской странице мой код JavaScript находится в теге готового документа jQuery.

Заранее спасибо!

/ Томас Кан

1 Ответ

3 голосов
/ 22 ноября 2010

Я решил проблему. Истинным источником этого был не доступ к переменной, а ошибка в том, как и когда я получил доступ к переменным в моем JavaScript. Когда я объявил переменные вне jQuery на родительской странице, вот так:

   var friendsCache = new Object;

... это сработало! На моей странице IFrame я могу получить доступ к такому значению:

   var friends = window.parent.friendsCache;

Так что теперь у меня есть решение, которое выглядит примерно так. Когда пользователь успешно вошел в систему через Facebook Connect, я вызываю функцию loadFriends:

function loadFriends() {
   if (jQuery.isEmptyObject(friends)) {
      FB.api("/me/friends?fields=name,first_name,picture", renderFriends);
   }
   else {
      renderFriends();
   }
}

function renderFriends(friendsData) {
   if (friendsData != undefined) {
      if (!(jQuery.isEmptyObject(friendsData))) {
         friends = friendsData.data;
         window.parent.friendsCache = friends;
      }
   }
   // Do the stuff you want to do when the friends are loaded
}

Пока родительская страница не перезагружена, мне не нужно загружать список друзей Facebook из Graph API. Вместо этого я загружаю их из своей переменной кэша, что дает мне заметное увеличение производительности.

Несмотря на то, что это описание было немного шире, чем мой первоначальный вопрос, я надеюсь, что кто-то найдет его полезным.

/ Томас Кан

...