Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   событие storage (https://javascript.ru/forum/misc/32691-sobytie-storage.html)

bot87 25.10.2012 18:14

событие storage
 
Привет.
Почему не срабатывает код
window.addEventListener('storage', storageEventHandler(e), false);

function storageEventHandler(e){
    alert("storage event called key: " + e.key );
  
}

//sessionStorage.setItem("someKey", "someValue");
sessionStorage['name1']='holi';

melky 25.10.2012 18:17

потому что скобки вызвают функцию, и в addEventListener передаётся результат её выполнения - undefined.
window.addEventListener('storage', *!*storageEventHandler(e)*/!*, false);

function storageEventHandler(e){
    alert("storage event called key: " + e.key );
  
}

//sessionStorage.setItem("someKey", "someValue");
sessionStorage['name1']='holi';

bot87 25.10.2012 18:39

window.addEventListener('storage', storageEventHandler, false);

function storageEventHandler(){
	alert("storage event called key: " );
  
}

sessionStorage.setItem("someKey", "someValue");
sessionStorage['name1']='holi';


Не срабатывает

melky 25.10.2012 19:54

странно ...

в демках срабатывает
http://html5demos.com/storage-events

vadim5june 25.10.2012 19:58

По моему onstorage работает только при изменении дочернего окна./фрейма а на изменение на своей странице не реагирует
http://all-html5.narod.ru/2/vrem1.htm

bot87 25.10.2012 20:05

ах*****ьная новость.И что теперь делать?Мне нужно сообщение с выводом что такае-то значение сменилось на ...

vadim5june 25.10.2012 20:07

Я точно не знаю-проверь ее во первых-но по примеру моему так получается

bot87 25.10.2012 20:36

пожалуйста пример.:) iMaxmaxmaximus
Дай урок :)

vadim5june 25.10.2012 20:43

Чтото наподобии вот такого
function setStorage(a,v)

{sessionStorage[a]=v;storageEventHandler(a)};
function storageEventHandler(a){
	alert("storage event called key: " )+a;}
setStorage("someKey", "someValue");

devote 25.10.2012 21:02

Цитата:

Сообщение от vadim5june
Я точно не знаю-проверь ее во первых-но по примеру моему так получается

все верно, оно не будет срабатывать в собственном окне, исключение только IE в котором срабатывает в любом случае.

bot87,
в чем сложность сделать обертку?
function sessStorage( key, value ) {
    var currentValue = sessionStorage.getItem( key );
    if ( typeof value !== "undefined" && currentValue !== value ) {
        sessionStorage.setItem( key, value );
        if ( !( window.eval && eval("/*@cc_on 1;@*/") ) ) {
            var e = document.createEvent( 'StorageEvent' );
            e.initStorageEvent( 'storage', false, false, key,
                currentValue, value, location.href, window.sessionStorage );
            window.dispatchEvent( e );
        }
        currentValue = value;
    }
    return currentValue;
}

if ( "addEventListener" in window ) {
    window.addEventListener('storage', storageEventHandler, false);
} else {
    document.attachEvent('onstorage', storageEventHandler );
}
 
function storageEventHandler(e){
    alert("storage event called key: " + e.key );
}

sessStorage("name1", "holi122");


Цитата:

Сообщение от iMaxmaxmaximus
переопредели функции .setItem и .getItem так чтобы они генерировали это событие, всему учить вас

не учи людей плохим манерам.

bot87 25.10.2012 22:01

спасибо Вам!:)
Особенно devote :)

devote 26.10.2012 00:05

Цитата:

Сообщение от iMaxmaxmaximus
то учим методы сторча генерировать со бытие.

зачем их учить? если ты что-то переопределяешь, то это должно быть весомо. Переопределять можно и нужно тока если ты расширяешь функционал браузера до того уровня что описан в спецификации. А ломать и идти на перекор документации, это плохой тон.

bot87 26.10.2012 01:12

iMaxmaxmaximus выложи пожалуйста.
Рано или поздно может пригодится.

vadim5june 26.10.2012 08:51

Цитата:

Сообщение от devote
если ты что-то переопределяешь, то это должно быть весомо

Я что то вообще не представляю как можно переопределить нативные методы sesionStorage.setItem и ..getItem чтобы они после переопределения выполняли функции storage

devote 26.10.2012 09:34

Цитата:

Сообщение от vadim5june
Я что то вообще не представляю как можно переопределить нативные методы sesionStorage.setItem и ..getItem чтобы они после переопределения выполняли функции storage

все как обычно, ничего заумного нет:
(function(){
    var
        StorageProto = Storage.prototype,
        setItem = StorageProto.setItem,
        getItem = StorageProto.getItem;

    StorageProto.setItem = function() {
        // тут что-то делаем
        // ...
        alert( "хехе" );
        // ...
        // и вызываем нативный метод
        return setItem.apply( this, arguments );
    }
    StorageProto.getItem = function() {
        // тут что-то делаем
        // ...
        alert( "хаха" );
        // ...
        // и вызываем нативный метод
        return getItem.apply( this, arguments );
    }
})();

sessionStorage.setItem( 'test', 'myVal' );
alert( sessionStorage.getItem( 'test' ) );

vadim5june 26.10.2012 12:31

Благодарю Devote
Я думал что если переопределим то нативный способ уже не сможем вызвать

devote 26.10.2012 16:43

Цитата:

Сообщение от iMaxmaxmaximus
то ест генерирование события сторчем этого нет в спецификации?

в активном окне (то-есть локальном) нет. В другие окна конечно же событие работает и ничего переделывать не нужно.

vadim5june 26.10.2012 18:10

Цитата:

Сообщение от iMaxmaxmaximus
хранятся именно ссылки на нативные методы. мы сохраняем их в переменные а потом их используем

Cпасибо!

DiDae 01.02.2013 23:22

Подскажите, пожалуйста, почему в одном и том же месте код:
onclick="localStorage.clear()"
отрабатывает нормально, а
onclick="localStorage.setItem('test88','name88');"
прерывает вывод в браузер, с ошибкой на консоль SyntaxError: missing } after property list

А вот так
onclick="localStorage.setItem("test88","name88");"
не вызывает остановку вывода в браузер, но ошибка также. Честно, очень уже намучался.

danik.js 02.02.2013 01:02

Цитата:

Сообщение от DiDae
А вот так
onclick="localStorage.setItem("test88","name88");"

А вот так даже подсветка сломалась :)

DiDae 02.02.2013 11:42

Цитата:

Сообщение от danik.js (Сообщение 231017)
А вот так даже подсветка сломалась :)

Ну да, тут интуитивно понятно, что не верный вариант. А в предыдущих двух разница только в том что переменные передаются..Или я что-то упустил?

Более полно код выглядит так:
<?php if (intval(@$gallery['interval'])) echo "slideshow: ".intval(@$gallery['interval']).", "; ?>
          default_width: 750,
          default_height: 600,
          allow_resize: true,
          social_tools: false,
          overlay_gallery: false,
          modal: true,
          markup: _markup,
		  deeplinking: false,
		  number_url: '<a href="http://quadrosol.ru/fotooboi/" onclick="localStorage.setItem('test844')" target="_self" title="Заказать изображение">%name%</a>',
		  }

devote 02.02.2013 15:09

number_url: '<a href="http://quadrosol.ru/fotooboi/" onclick="localStorage.setItem(\'test844\', \'ololo\')" target="_self" title="Заказать изображение">%name%</a>',

DiDae 02.02.2013 21:14

devote,
Огромное спасибо! Про экранирование сам бы еще не скоро догадался. Очень помог!

gomer999999999 04.02.2013 18:46

Добрый день.
Предлагаем к рассмотрению и тестированию наш проект - Маркетер Плагин.
Продвигаем его успешно во всем мире. Но только 27 января 2013 предоставили в Рунете к тестированию русифицированный плагин с русифицированным интерфейсом. Вся подробная информация наhttp://www.marketerplugin.ru/
Предлагаем протестировать наш плагин на только что русифицированном интерфейсеhttp://www.marketerplugin.ru/test_plagina.
В двух словах: плагин предназначен для создания сайтов-визиток и страниц продаж.
Ждем ваших комментариев, отзывов и критики.
Так же будем рады видеть вас на наших страницах в соц сетях
http://www.facebook.com/pages/Marketer-plugin/5288148..
http://vk.com/club46912629
Успехов и новых впечатлений.
С уважением, Богдан

lamer 05.02.2013 16:02

Цитата:

Сообщение от devote (Сообщение 212311)
все верно, оно не будет срабатывать в собственном окне, исключение только IE в котором срабатывает в любом случае.

bot87,
в чем сложность сделать обертку?
function sessStorage( key, value ) {
    var currentValue = sessionStorage.getItem( key );
    if ( typeof value !== "undefined" && currentValue !== value ) {
        sessionStorage.setItem( key, value );
        if ( !( window.eval && eval("/*@cc_on 1;@*/") ) ) {
            var e = document.createEvent( 'StorageEvent' );
            e.initStorageEvent( 'storage', false, false, key,
                currentValue, value, location.href, window.sessionStorage );
            window.dispatchEvent( e );
        }
        currentValue = value;
    }
    return currentValue;
}

if ( "addEventListener" in window ) {
    window.addEventListener('storage', storageEventHandler, false);
} else {
    document.attachEvent('onstorage', storageEventHandler );
}
 
function storageEventHandler(e){
    alert("storage event called key: " + e.key );
}

sessStorage("name1", "holi122");



не учи людей плохим манерам.

Читал про storage понял что можно использовать вместо куков, нашел только отдельные примеры для FF и IE, вашь пример работает и там и там =)
Сразу возникли несколько вопросов.

Установили мы значение sessStorage("name1", "holi122"); как теперь отчистить его ?

Как задать конкретный домен для установки значения sessStorage("name1", "holi122"); ? Я смотрю что для IE устанавливается полностью на весь компьютер, а не на конкретное место. А для FF устанавливается значение на конкретный путь.

Как сделать так чтобы значение устанавливалось не конкретно на путь в сайте, а на весь компьютер ?

P.S. Сорри за туфтографию, просто ещё не вник во все нюансы этого метода.


Часовой пояс GMT +3, время: 21:52.