Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Отловить событие storage (https://javascript.ru/forum/events/45587-otlovit-sobytie-storage.html)

cevut 07.03.2014 02:00

Отловить событие storage
 
Добрый вечер всем любителям DOM'а :)
Я тут пытаюсь словить событие storage хранилища html5 используя такой код:
window.addEventListener('storage', onStorageEvent, false);

и такую функцию onStorageEvent:
function onStorageEvent(storageEvent){
    alert("storage event");
}

но у меня нет никаких алертов когда я наверняка знаю, что значение ключа в хранилище изменяется. Это потому что я немного черный или я что-то делаю не так?

danik.js 07.03.2014 04:18

Событие возникает только при изменении хранилища в других вкладках (окнах).
Пример: открой консоль тут, на форуме, запусти код:
window.onstorage = console.log.bind(console)


Открой дубликат вкладки. Увидишь вывод событий в консоль.

kotamirov 08.03.2014 01:01

var supports_html5_storage = function(){//checked on support properties storage in browsers
	try{
		return 'Storage' in window  &&  window['Storage'] !== null;
	}catch(e){
		return false;
	}
};
window.onload = function(){ 
if(supports_html5_storage){
window.addEventListener('storage',function(e){get_event_of_storage(e);},false);
var get_event_of_storage = function(e){
var state;
	if(e.state != null){//checked exist parameter "state" of storage data
		state = e.state;
alert(state);
}
}
}
}

cevut 08.03.2014 02:05

Спасибо, ребят, я все осознал)

danik.js 08.03.2014 06:15

kotamirov, а в каких случаях код на третьей строчке может бросить исключение?
И твой код абсолютно ничего не поясняет.

kotamirov 08.03.2014 09:57

Цитата:

Сообщение от danik.js (Сообщение 301675)
kotamirov, а в каких случаях код на третьей строчке может бросить исключение?
И твой код абсолютно ничего не поясняет.

если браузер не поддерживает storage.

danik.js 08.03.2014 14:08

Цитата:

Сообщение от kotamirov
если браузер не поддерживает storage

И с чего бы бросалось исключение? Ведь 'Storage' in window вернет false - не более.

Смотри, ни один браузер не поддерживает сверховую технологию ZdelatyZayebis. Используем твой прием для теста:

function test() {
    try{
        return 'ZdelatyZayebis' in window  &&  window['ZdelatyZayebis'] !== null;
    }catch(e){
        alert('Исключение!!!');
        return false;
    }
}

test();


Как видишь - никакого исключения!!!

kotamirov 08.03.2014 15:30

Цитата:

Сообщение от danik.js (Сообщение 301737)
И с чего бы бросалось исключение? Ведь 'Storage' in window вернет false - не более.

Смотри, ни один браузер не поддерживает сверховую технологию ZdelatyZayebis. Используем твой прием для теста:

function test() {
    try{
        return 'ZdelatyZayebis' in window  &&  window['ZdelatyZayebis'] !== null;
    }catch(e){
        alert('Исключение!!!');
        return false;
    }
}



test();


Как видишь - никакого исключения!!!

ZdelatyZayebis - не существует в объектах window, а вот localStorage существует!
Вот так, ибо наблюдай прекрасное, должно работать!
try {
return 'localStorage' in window && window['localStorage'] !== null;
} catch (e) {
return false;
}
}

danik.js 08.03.2014 16:04

Цитата:

Сообщение от kotamirov
ZdelatyZayebis - не существует в объектах window, а вот localStorage существует!

В IE7 ведь не существует! Ведь для этого и задумана проверка, не?
Да и какая разница - существует или не существует. Суть в том что исключение не будет никогда брошено. То есть этот абсолютно бессмысленная обертка в try..catch

Народ, ну кивните чтоли, а то он мне не верит))

danik.js 08.03.2014 16:06

Цитата:

Сообщение от kotamirov
а вот localStorage существует!

А почему тогда проверка не на localStorage, а на конструктор Storage?
Кстати, где сказано что в браузерах с поддержкой localStorage/sessionStorage должен быть определен конструктор Storage?
(а то я чутка не уверен что проверка верная)


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