Napotkałem następujący problem w Safari 5.0 (nie we wszystkich przeglądarkach opartych na silniku WebKit), ten kod:Pozornie sprzeczne onstorage wyzwalanie w Safari
<html>
<script>
var onstorage = function(evt) {
alert([evt.key, evt.oldValue, evt.newValue].join('\n'));
}
var onclick = function(evt) {
localStorage.setItem('test', Math.random());
}
var oninit = function() {
//actually, it works the same way with old "plain event" onclick
document.querySelector('#test').addEventListener('click', onclick, false);
window.addEventListener('storage', onstorage, false);
}
</script>
<body onload="oninit()">
<input id="test" type="button" value="setting a random value"/>
</body>
wyzwoli w pogotowiu, w przypadku klikamy przycisk. Chociaż ten kod -
<html>
<script>
var onstorage = function(evt) {
alert([evt.key, evt.oldValue, evt.newValue].join('\n'));
}
var onclick = function(evt) {
localStorage.setItem('test', Math.random());
}
var oninit = function() {
window.addEventListener('storage', onstorage, false);
//actually, it works the same way with old "plain event" onclick
document.querySelector('#test').addEventListener('click', onclick, false);
}
</script>
<body onload="oninit()">
<input id="test" type="button" value="setting a random value"/>
</body>
wyzwala kilka powiadomień, a nie oczekiwać. Myślę, że to błąd, ale czy ktoś nie może mi wyjaśnić - dlaczego zamiana dwóch linii kodu powoduje tak dziwne zachowanie?
Dunno, 'onstorage' nie działa dla mnie. Ale generalnie powinieneś unikać wywoływania globalnych zmiennych/funkcji 'onstorage' lub' onclick'. Ponieważ 'onclick' jest dostępny jako' window.onclick', będzie odbierać zdarzenia kliknięcia dla 'okna' nawet bez' addEventHandler'! – bobince
Bobrowo, głupku))) masz całkowitą rację - są pewne problemy ze zmienną onclick w zasięgu globalnym. Niemniej jest to błąd, ale mniej enigmatyczny). – shabunc
Jak to jest błąd, gdy próbujesz użyć nazw zastrzeżonych globalnych metod? – rxgx