2013-08-06 30 views
6

Aus vielen Quellen habe ich festgestellt, dass die lokalen Speicherereignisse nur in Fenstern/Tabs ausgelöst werden, die die Änderung nicht ausgelöst haben.Erzwingen lokaler Speicherereignisse zum Auslösen im selben Fenster

Meine Frage ist, gibt es eine Möglichkeit, die ich aus dem gleichen Fenster ändern könnte? Oder überschreiben Sie vielleicht die Funktionalität, um zu erzwingen, dass das Ereignis im selben Fenster/Tab ausgelöst wird?

Es scheint einfach unpraktisch, die Option nicht zu enthalten, aber ich kann keinen Weg finden, es zu tun.

Dank

+0

[Einige bereits taten] (http://stackoverflow.com/a/4689033). Für die anderen sollte '$ (window) .trigger (" storage ")' (oder das native Gegenstück) es tun. – Bergi

+0

hmm Ich dachte ich habe es zuerst versucht und es hat nicht funktioniert. Ich werde es wieder versuchen shorty, danke –

+0

@Bergi das funktioniert gut, danke. Wie würde ich das korrekt formatierte Ereignisobjekt einschließen? –

Antwort

-2

FYI, hier ist, was ich mit endete.

localStorage.setItem('selectedOrgs', JSON.stringify(this.selectedOrgs)); 

// trigger the event manually so that it triggers in the same window 
// first create the event 
var e = $.Event("storage"); 

// simulate it being an actual storage event 
e.originalEvent = { 
    key: 'selectedOrgs', 
    oldValue: prev, 
    newValue: JSON.stringify(this.selectedOrgs) 
}; 

// Now actually trigger it 
$(window).trigger(e); 

Hinweis: Ich verwende nur oldValue und newValue .. wenn Sie andere Attribute verwenden, stellen Sie sicher, und sie in geeigneter Weise eingestellt.

Sie können localStorage.setItem auch überschreiben, damit es im aktuellen Fenster auf ähnliche Weise ausgelöst wird.

+0

Hey, vielen Dank für das Posten deines Codes. Aber ich verstehe nicht, warum meine Veranstaltung immer noch nicht feuert. tut $ (window) .trigger (e); nur in anderen Fenstern auslösen? Im Grunde versuche ich nur, das Speicheränderungsereignis in demselben Fenster auszulösen, das die Änderung vorgenommen hat. Hier ist, was ich geschrieben habe, basierend auf Ihrem Code: pastebin.com/7EthAJ0f – user3281466

+1

http://jsfiddle.net/h7dLakLr/ –

+0

Das jsfiddle ist nicht die gleiche Sache überhaupt. Es erstellt ein benutzerdefiniertes Ereignis, das zufälligerweise "Speicher" genannt wird und es dann auslöst. Wenn Sie den Schlüssel im Ereignisobjekt ändern würden, würden Sie sehen, dass er nicht in localStorage gespeichert wird, und der Schlüssel "1" würde gesetzt, aber nicht ausgelöst. –

0

Ja, Sie können für jede Registerkarte eindeutige ID erzeugen und sie vergleichen, schauen, wie dieser Kerl here Eine andere Lösung habe ich basierend auf der gleichen Idee gefunden, erzeugen und einzigartige IDs vergleichen .. here

0

Dies ist leicht mit localDataStorage gehandhabt, wo Sie transparent einen der folgenden "Typen" setzen/erhalten können: Array, Boolean, Datum, Float, Integer, Null, Object oder String. Natürlich werden auch Ereignisse im gleichen Fenster/Register für Schlüsselwertänderungen ausgelöst, wie sie von den Methoden set oder remove vorgenommen werden.

[HAFTUNGSAUSSCHLUSS] ich der Autor des Dienstprogramm bin [/ HAFTUNGSAUSSCHLUSS]

Nachdem Sie das Dienstprogramm instanziiert, wird es der folgende Code-Schnipsel Sie die Ereignisse überwachen:

function nowICanSeeLocalStorageChangeEvents(e) { 
    console.log(
     "subscriber: " + e.currentTarget.nodeName + "\n" + 
     "timestamp: "  + e.detail.timestamp + " (" + new Date(e.detail.timestamp) + ")" + "\n" + 
     "prefix: "  + e.detail.prefix + "\n" + 
     "message: "  + e.detail.message + "\n" + 
     "method: "  + e.detail.method + "\n" + 
     "key: "   + e.detail.key  + "\n" + 
     "old value: "  + e.detail.oldval + "\n" + 
     "new value: "  + e.detail.newval + "\n" + 
     "old data type: " + e.detail.oldtype + "\n" + 
     "new data type: " + e.detail.newtype 
    ); 
}; 
document.addEventListener(
    "localDataStorage" 
    , nowICanSeeLocalStorageChangeEvents 
    , false 
); 
Verwandte Themen