Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.04.2012, 18:15
Интересующийся
Отправить личное сообщение для kdn1990 Посмотреть профиль Найти все сообщения от kdn1990
 
Регистрация: 22.04.2012
Сообщений: 11

Одно событие во всех окнах одного домена
Каким образом можно создать взаимодействие между окон/вкладок одного браузера и одного сайта/домена

Например, создал DOM элемент в одном окне, и чтобы в других окнах тоже создался этот DOM элемент
это к примеру

я вот использую LocalStorage и есть event onstorage, но его не все браузеры поддерживают, а те кто не поддерживают я использую checker каждые 250 мс, но это нагружает браузер очень сильно

как же можно сделать фейковое событие onstorage?

спасибо, интересно выслушать ваши идеи
Ответить с цитированием
  #2 (permalink)  
Старый 23.04.2012, 00:44
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Идеи говориш , ну допустим если ты другие окна создаёшь скриптом, то ты можешь получить ссылки на эти окна, и оперировать ими централизовано, без всякой системы событий.
crazycode={
    _win:[],
    makewin:function(){
         var myWin= open("test.html");
         myWin.document.open();
         this._win.push(myWin);
    },
    appendText:function(text){
        for (i=0;i<this._win.length;i++){
           this._win[i].document.write("hello world");
        }
    }  
}
//1е окно
crazycode.makewin();
//2е окно
crazycode.makewin();
//3е окно
crazycode.makewin();
crazycode.appendText("hello world"); //добавим текст сразу в три окна
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 23.04.2012 в 00:55.
Ответить с цитированием
  #3 (permalink)  
Старый 23.04.2012, 00:46
Интересующийся
Отправить личное сообщение для kdn1990 Посмотреть профиль Найти все сообщения от kdn1990
 
Регистрация: 22.04.2012
Сообщений: 11

неее, другое окно либо уже открыто либо открыл пользователь, а не скрипт )
Ответить с цитированием
  #4 (permalink)  
Старый 23.04.2012, 01:07
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

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

Ну допустим система событий, на базе куки ))
Всё что будет написано ниже, написано исключительно стёба ради ))
ради этих гипотез придётся представить что мы можем создавать неограниченное количество куки на домен.
Если вам жалко своё время, ниже нечитайте ))

Нузначится так, можно попробывать обмениватся инфой через куки, раз домен один то для всех окон куки будут общими.
Вопрос в том как организовать взаимодействие в такой ненадёжной системе.

К примеру по чётным секундам можно записывать данные в куки по нечётным считывать.

или вот вот поприкольнее )).
если вдруг сработает то в ie максимум будет 19 окон.

В куки map список всех куки для обмена. по принципу одно окно одно куки.
Каждое окно пишет только в своё отведённое ему КУКУ )))))
а читает из всех куки что зарагены в куки MAP.
Если каждому добавленному действию давать порядковый идентификатор то по нему окно сможет определить выполняло ли оно уже эту операцию, если вдруг случайно обнаружит её повторно. При этом окну достаточно помнить последний порядковый номер выполненной операции для каждой куки.

Синхронизироваться к примеру раз в секунду, так как за секунду может накопится несколько операций, предлагаю их собрать в массив в порядке обратном поступлению, затем преобразовать его в json и сохранить это как текстовую строку в куки.

Соответственно окно считавшее куки преобразует json обратно в массив и будет его исполнять по очереди.

Хотя можно и так ))
очередное говно, в ie максимум 6 триад, тобиш не более 6 операций за секунду )).

есть несколько триад для операций .
триада состоит из трёх куки
1я для времени, 2я код операции, 3я полезная инфа

когда нужно записать операции, мы ищем либо пустую триаду, либо ту что имеет самое старое время, и записываем данные на её место с новым временем.

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

Для подстаховки запись можно проводить по чётным секундам, чтение по нечётным.
Или создать триггер который будет играть роль запрета чтения данных из куки на время записи, это пригодится чтобы полностью исключить вероятность одновременной записи и чтения из одной триады. Хотя чёта и нечета по секундам может оказатся достаточно.

З.Ы. Щас читаю, и думаю, ЧТО ЖЕ Я НА САМОМ ДЕЛЕ КУРЮ ? )))
Тот факт что в IE всего 20 куки на домен, означает что эти маразматические идеи ещё и малопродуктивны в придачу)) А жаль, придётся занять чем то другим свою извращённую фантазию.)))))))
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 23.04.2012 в 03:16.
Ответить с цитированием
  #5 (permalink)  
Старый 23.04.2012, 01:10
Интересующийся
Отправить личное сообщение для kdn1990 Посмотреть профиль Найти все сообщения от kdn1990
 
Регистрация: 22.04.2012
Сообщений: 11

запускать таймер? ))
Ответить с цитированием
  #6 (permalink)  
Старый 23.04.2012, 01:18
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

kdn1990, использовать сервер-сайд?
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #7 (permalink)  
Старый 23.04.2012, 02:08
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

прошу прощение что значит
использую checker каждые 250 мс ?
Я приавильно понимаю что ты каждые 250 мс проверяешь появились ли новые данные в localStorage ? И при этом эта проверка грузит систему.

Я не в теме чо то )).

И вот ещё что, я стибался над куки предполагая что любое окно может быть источником сообщения и сообщений будет уйма. А ведь скорее всего сообщения будет генерировать только активное окно. А это меняет картину.
В этом случае на полном серьёзе можно померить что быстрее проверить состояние в куки или в localStorage, если куки победят то там можно разместить флаг который можно будет проверять в таймере, и если флаг указывает на то что записаны новые данные, то только тогда обращатся к более медленному localstorage. Там где нет localstorage можно использывать сервер, и опять же опрашивать не сервер 4 раза в секунду, а куки (я думаю тут и так ясно что будет быстрее).

Тоесть при помощи куки мы кешируем не саму информацию, а определяем по ним готовности этой информации, а потом забираем её из медленного хранилища. Согласитесь это лучше постоянной проверки медленных хранилищ.

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

Что касается новых там есть прямой обмен сообщениями между окнами, жаль не могу вспомнить название методов для работы с этими событиями. Надо гуглить.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 23.04.2012 в 02:57.
Ответить с цитированием
  #8 (permalink)  
Старый 23.04.2012, 02:30
Интересующийся
Отправить личное сообщение для kdn1990 Посмотреть профиль Найти все сообщения от kdn1990
 
Регистрация: 22.04.2012
Сообщений: 11

Сообщение от trikadin
kdn1990, использовать сервер-сайд?
можно поподробнее?

DjDiablo, setInterval(checker, 250);
Ответить с цитированием
  #9 (permalink)  
Старый 23.04.2012, 03:22
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

сервер-сайд- всмысле задействовать сервак для хранения данных. В этом случае тебе придётся опрашивать сервак, вместо localstorage, что окажется ещё медленнее, не говоря о дополнительной нагрузки на сервак.
Нет конечно если ты сможешь использывать сокеты которые избавят клиент от необходимости делать регулярные опросы сервера то всё нормально )).

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

Последний раз редактировалось DjDiablo, 23.04.2012 в 03:49.
Ответить с цитированием
  #10 (permalink)  
Старый 23.04.2012, 14:32
Аватар для razerxxx
Аспирант
Отправить личное сообщение для razerxxx Посмотреть профиль Найти все сообщения от razerxxx
 
Регистрация: 05.10.2011
Сообщений: 85

Хм. не знаю можно ли проверить - активное сейчас окно или нет (вроде бы должно быть можно), но если можно - то только при активации окна делать запрос в local storage.
Есть еще такая штука как postMessage - ie8+... Каким то образом передать ссылку на объект window через local storage - а дальше уже общаться через postMessage.
Все это только в теории, сам я не пробовал. (точнее пробовал postMessage для кроссдоменного общения скриптов)
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Событие при клике на любой элемент кроме одного shaltay jQuery 1 29.11.2011 19:27
Один для всех и все от одного Gamestop Серверные языки и технологии 5 05.09.2011 09:06
Как изменить свойство css у всех элементов одного класса AlexJ Events/DOM/Window 7 19.03.2011 06:25
Несколько функций на одно событие. abstract Events/DOM/Window 13 26.10.2010 10:46
Событие change для всех элементов exvion jQuery 2 25.01.2010 18:18