Плагин FireBreath через несколько страниц

Я разрабатываю веб-плагин с FireBreath, и я довольно новичок в этой области. До сих пор я разработал довольно сложный класс API плагина (с зарегистрированными методами, свойствами и некоторыми другими переменными и структурами). Я загружаю его на страницу, используя javascript и тег по умолчанию
object id="plugin0" type="application/x-myapp>.
Но теперь мне нужно перенаправить на другую HTML-страницу, и мне нужно сохранить все мои ранее заполненные переменные с предыдущей страницы. С той же моделью с тегом OBJECT я думаю, что создал еще один экземпляр моего плагина, потому что все переменные были неопределенными. Поэтому мой вопрос заключается в том, как сохранить один экземпляр плагина и сделать его доступным на нескольких html-страницах. ?
В частности, у меня есть одна страница, где я храню переменные и указатели внутри класса API плагина с экраном входа в систему, и после входа мне нужно перенаправить на другую страницу и получить доступ к ранее заполненным переменным и указателям.


person Raadush    schedule 09.08.2012    source источник


Ответы (1)


Простой ответ? Вы не можете. Плагины специфичны для одной страницы. Любой конкретный экземпляр плагина будет уничтожен с тегом объекта, который содержит его уничтожение -- точка. Из этого правила нет исключений.

Тем не менее, есть несколько вариантов, которые вы можете попробовать для того, что вы делаете:

1) Перепишите свой веб-сайт так, чтобы он управлялся AJAX и javascript, чтобы все страницы были фактически одной и той же страницей с разными хэштегами и т. д. См. http://backbonejs.org/ для одного фреймворка, который помогает в этом. С точки зрения плагина это, безусловно, самое простое решение, но может потребоваться переписать весь ваш сайт, что может быть проблематично.

2) Сохраняйте состояние с помощью вашего веб-приложения и передавайте данные обратно в плагин на каждой странице. Вы можете сделать это с помощью тегов параметров или вызовов функций после создания экземпляра плагина.

3) Создайте своего рода «сессию» с вашим плагином с данными, хранящимися в глобальной памяти; затем вы можете возобновить «сеанс» на другой странице. Например:

if (!plugin.restoreSession("userid")) {
    plugin.createSession("userid");
}

В этом примере createSession и restoreSession будут использоваться для инициализации или возобновления данного сеанса. Проблема в том, что вы понятия не имеете, сколько вкладок или страниц открыто с помощью вашего плагина, поэтому вы можете легко столкнуться между страницами, обращающимися к одним и тем же глобальным данным. Кроме того, кто-то может создать другую веб-страницу, которая использует ваш плагин и восстанавливает сеанс, а также изменяет или получает доступ к данным, поэтому это угроза безопасности. Вы можете смягчить это, сохранив доменное имя с сеансами и разрешив доступ к сеансу только из того же домена, но... ну, теперь вы просто воссоздали файлы cookie.

Кроме того, браузер на самом деле не гарантирует, как долго будет загружаться ваш подключаемый модуль; он может выгрузить его на вас в любой момент, когда нет активных экземпляров (между запросами страниц). На практике гораздо более вероятно, что модуль плагина не будет выгружен до закрытия браузера, а это означает, что любые данные, которые вы храните в глобальной памяти вашего плагина, не будут освобождены и будут продолжать занимать память, пока вы не закроете браузер.

4) Создайте расширение для браузера, которое использует ваш плагин и работает с несколькими запросами страниц. Я понятия не имею, как это сделать, но то, что я слышал от других, заставляет меня поверить, что это возможно. Имейте в виду, что вам придется сделать по одному для каждого поддерживаемого браузера, и, вероятно, это невозможно в IE; возможно только в Firefox/Chrome.

Поскольку вы новичок в StackOverflow, позвольте мне приветствовать вас на сайте и напоминать вам всякий раз, когда вы публикуете вопрос (не только этот!), голосовать за полезные ответы и стараться всегда отмечать один из них как правильный.

person taxilian    schedule 09.08.2012
comment
Привет и спасибо за ваш полезный и сложный ответ. Где-то в глубине души я думал, что есть вероятность, что я не смогу этого сделать. Я думаю, что пойду 1) путем, так как мой сайт пока состоит всего из 2 страниц. - person Raadush; 10.08.2012
comment
Имейте в виду, что если вы используете CSS, чтобы сделать плагин display:none или visible:hidden, вы заставите его выгрузиться; самое простое решение, как правило, позиционировать его абсолютно и сделать его 1 пиксель на 1 пиксель, когда он должен быть скрыт - person taxilian; 10.08.2012