2012-12-13 20 views
6

मैं कार्ड गेम के लिए deck building application पर काम कर रहा हूं। मैं डेक को बचाने और पुनर्प्राप्त करने के लिए स्थानीय स्टोरेज का उपयोग कर रहा हूं। ऐसा लगता है कि क्रोम में बेकार ढंग से काम कर रहा है, लेकिन फ़ायरफ़ॉक्स में यह अविश्वसनीय रूप से काम कर रहा है।फ़ायरफ़ॉक्स में अविश्वसनीय स्थानीय स्टोरेज

एफएफ में, सबकुछ पहले ठीक काम करता प्रतीत होता है, डेक भी एक रीलोड के माध्यम से बनी रहती है। हालांकि, अगर मैं एक दूसरा डेक जोड़ता हूं और पुनः लोड करता हूं, तो यह केवल पहला डेक पाता है। अगर मैं पहली डेक हटा देता हूं, तो यह अब कुछ भी नहीं पाता है।

सभी स्थानीय स्टोरेज इंटरैक्शन स्क्रिप्ट/vault.js में है, जिसे मैं नीचे पुन: उत्पन्न करूंगा। क्या मुझसे कुछ गलत हो रही है?

vault = {}; 
vault.makeKey = function (s) { 
    return "deck:" + s; 
}; 
vault.friendlyName = function(s) { 
    if (s.indexOf("deck:") === 0) { 
     return s.substring(5); 
    } else { 
     return s; 
    } 
}; 
vault.store = function (deck, name) { 
    if (!window.localStorage) { 
     alert("This browser doesn't support local storage. You will be unable to save decks."); 
     return; 
    } 
    var key = vault.makeKey(name); 
    localStorage.setItem(key, deck.export()); 
}; 
vault.retrieve = function (key) { 
    deck.import(localStorage[key]); 
}; 
vault.getDecks = function() { 
    var keys = Object.keys(localStorage), 
     out = [], 
     i, 
     k, 
     name = ""; 
    for (i = 0; i < keys.length; i++) { 
     k = keys[i]; 
     name = vault.friendlyName(k); 
     if (name !== k && localStorage[k]) { 
      out.push({name: name, key: k}); 
     } 
    } 
    out.sort(function (a, b) { 
     return a.name > b.name ? 1 : -1; 
    }); 
    return out; 
}; 
vault.deleteDeck = function (key) { 
    localStorage.removeItem(key); 
}; 

असल में, ऐसा लगता है कि स्थानीय स्तर पर चाबियां बेहतर अवधि की कमी के लिए 'जमे हुए' हो जाती हैं; जब मैं इसे छेड़छाड़ करता हूं तो स्थानीय स्टोरेज सही तरीके से व्यवहार करेगा, लेकिन जैसे ही मैं पृष्ठ को रीफ्रेश करता हूं, यह उस स्थिति में वापस लौटता है जो इसे जमे हुए हो जाता है।

+0

क्या आप http://jsfiddle.net डेमो बना सकते हैं? –

+1

मैंने अपनी पहली पोस्ट में एप्लिकेशन के लिए एक लिंक पोस्ट किया। यहां यह फिर से है: http://asmor.com/anr/ – Asmor

+0

अच्छा, अगर यह एक पहेली में है, तो मैं कोड के साथ काम कर सकता हूं और विभिन्न चीजों की जांच कर सकता हूं। यह जरूरी नहीं है, लेकिन इससे मुझे और अधिक संभावनाएं मिलती हैं और कुछ अन्य यह देखने के लिए झुकाएंगे कि क्या हम इसे समझ सकते हैं। –

उत्तर

3

मैंने इस समस्या को कुछ बार चलाया है और पहले मैंने नहीं किया कारण बताएं कि यह स्थानीय स्टोरेज क्यों नहीं पढ़ सका, लेकिन मुझे लगता है कि मुझे इसके लिए एक समाधान मिला।

स्थानीय स्टोरेज ऑपरेशंस सभी तुल्यकालिक हैं और विभिन्न ब्राउज़रों के पास कुछ संभाल है कि वे उन्हें कैसे संभालेंगे।

आपके मामले में, समस्या यह प्रतीत होती है कि आप डोम तैयार होने से पहले स्थानीय स्टोरेज को पढ़ने की कोशिश कर रहे हैं। मैंने फ़ायरबग के साथ कोशिश की और मैंने vault.js फ़ाइल की शुरुआत में ब्रेकपॉइंट जोड़ा और पृष्ठ को फिर से लोड किया और जब कोड टूट जाता है, तो मैं डोम-टैब की जांच करता हूं और स्थानीय स्टोरेज प्रॉपर्टी ढूंढता हूं, और वहां यह है - संग्रहीत की पूरी सूची मान। जब मैंने ब्रेकपॉइंट हटा दिया और पृष्ठ को फिर से लोड किया, तो पेज लोड होने के बाद वे सभी चले गए।

यह फ़ायरफ़ॉक्स या अन्य ब्राउज़रों में एक बग हो सकता है बस स्थानीय स्टोरेज को तेज़ी से प्रारंभ करें।

तो, आपकी समस्या के समाधान के रूप में: डोम तैयार होने के बाद स्थानीय स्टोरेज से चाबियाँ लाने का प्रयास करें।

+0

धन्यवाद। जबकि आपका सुझाव इसका कारण प्रतीत नहीं होता है, लेकिन यह मुझे नीचे एक हैकी समाधान खोजने के लिए एक ट्रैक पर जा रहा था। मैं अभी भी वास्तविक कारण ढूंढना चाहता हूं जो यह काम नहीं करता है और इसे सही तरीके से काम कर रहा है। – Asmor

+0

यह वास्तव में एक बहुत ही अजीब बग है। ऐसा लगता है कि यदि आप लोड होने से पहले पृष्ठ की लोडिंग को रोकते हैं, और फिर फिर से शुरू करें, तो मान हैं, लेकिन यदि आप पृष्ठ को पहले लोड करते हैं, तो वे चले गए हैं। ऐसा लगता है कि कुछ तैयार होने से पहले इसे एक्सेस करने का प्रयास करता है और ब्राउज़र स्थानीय स्टोरेज को प्रारंभ करने में विफल रहता है। मोज़िला के लिए एक बग दर्ज करने लायक हो सकता है, लेकिन पुन: उत्पन्न करना मुश्किल है। – jylauril

+0

यह कुछ दिन हो गया है और मुझे इस पर कोई गतिविधि नहीं दिखाई दे रही है, इसलिए मैं आगे बढ़ने वाला हूं और आपको स्वीकार्य उत्तर के रूप में चिह्नित कर रहा हूं। मुझे सही रास्ते पर जाने में मदद करने के लिए धन्यवाद! – Asmor

0

जिलौरील सही रास्ते पर है, मुझे लगता है।

मैं देरी से खेल रहा हूं, और कुछ अजीब व्यवहार को देख रहा हूं।

जहां तक ​​मैं कह सकता हूं, ऐसा लगता है कि यदि आप जावास्क्रिप्ट को निष्पादन पूरा करने से पहले स्थानीय स्टोरेज को स्पर्श करते हैं, जिसमें JS जेएस सेटटाइमआउट कर रहा है, तो स्थानीय स्टोरेज उस पृष्ठदृश्य के लिए खाली दिखाई देगा। उदाहरण के लिए:

$(window).load(function() { 
    console.log("Waiting 10000ms", new Date()); 
    setTimeout(setDeckSelect, 10000); 
}); 

Firebug के कंसोल:

Waiting 10000ms Date {Thu Dec 13 2012 10:35:48 GMT-0500 (Eastern Standard Time)} 
exec.js (line 191) 
getDecks Date {Thu Dec 13 2012 10:35:58 GMT-0500 (Eastern Standard Time)} 
vault.js (line 23) 
>>> localStorage 
0 items in Storage 

मैंने सोचा कि मैं कुछ करने के बारे में हो सकता है, लेकिन मेरे सिद्धांतों अब तक गलत साबित किया है। हालांकि, मैंने देखा एक अजीब चीज। की कितनी देर तक मैं इंतज़ार, अगर मैं पहले डेक को देखने के लिए कोशिश भले ही, यह असफल हो जायेगी और स्थानीय संग्रहण खाली हो जाएगा:

>>> vault.getDecks() 
[] 
>>> localStorage 
0 items in Storage 

लेकिन अगर मैं विपरीत क्रम में उन करना ...

>>> localStorage 
8 items in Storage deck:dfs= 
"{"identity":"MakingNews","cards":{}}", deck:ngrngfrn= "{"identity":"BuildingaBetterWorld","cards":{}}", deck:sdfgshsh= "{"identity":"MakingNews","cards":{}}", deck:sdfgdgdfg= "{"identity":"MakingNews","cards":{}}", deck:dfgdfgas= "{"identity":"EngineeringtheFuture","cards":{}}", deck:sdfsga= "{"identity":"MakingNews","cards":{}}", deck:gdgd= "{"identity":"MakingNews","cards":{}}", deck:gfsdfgsdfg= "{"identity":"BuildingaBetterWorld","cards":{}}" 
>>> vault.getDecks() 
[Object { name= "dfgdfgas", key= "deck:dfgdfgas"}, Object { name= "dfs", key= "deck:dfs"}, Object { name= "gdgd", key= "deck:gdgd"}, Object { name= "gfsdfgsdfg", key= "deck:gfsdfgsdfg"}, Object { name= "ngrngfrn", key= "deck:ngrngfrn"}, Object { name= "sdfgdgdfg", key= "deck:sdfgdgdfg"}, Object { name= "sdfgshsh", key= "deck:sdfgshsh"}, Object { name= "sdfsga", key= "deck:sdfsga"}] 

अगर मैं समारोह में localStorage प्रवेश करें, तो यह रूप में अच्छी तरह से काम करता है:

vault.getDecks = function() { 
    console.log(localStorage); 
    var keys = Object.keys(localStorage), 
     out = [], 
     i, 
     k, 
     name = ""; 
    for (i = 0; i < keys.length; i++) { 
     k = keys[i]; 
     name = vault.friendlyName(k); 
     if (name !== k && localStorage[k]) { 
      out.push({name: name, key: k}); 
     } 
    } 
    out.sort(function (a, b) { 
     return a.name > b.name ? 1 : -1; 
    }); 
    return out; 
}; 

यह काम करता है।अगर मैं इसे रद्द करता हूं, हालांकि ...

vault.getDecks = function() { 
    // console.log(localStorage); 
    void localStorage; 
    var keys = Object.keys(localStorage), 
     out = [], 
     i, 
     k, 
     name = ""; 
    for (i = 0; i < keys.length; i++) { 
     k = keys[i]; 
     name = vault.friendlyName(k); 
     if (name !== k && localStorage[k]) { 
      out.push({name: name, key: k}); 
     } 
    } 
    out.sort(function (a, b) { 
     return a.name > b.name ? 1 : -1; 
    }); 
    return out; 
}; 

यह काम नहीं करता है। यह काम नहीं करता है अगर मैं शून्य कीवर्ड को हटा देता हूं और सिर्फ स्टेटमेंट को अपने कथन के रूप में ही रखता हूं।

मुझे नहीं पता क्यों, लेकिन console.log (localstorage) इसे ठीक करने लगते हैं, और जब भी मैं चाहूं स्थानीय स्टोरेज को कॉल कर सकता हूं।

वास्तव में अजीब अजीब लग रहा है।

संपादित करें: मुझे थोड़ा बेहतर समाधान मिला। स्थानीय स्टोरेज के 'लंबाई' विशेषता को भी कॉल करना।

vault.getDecks = function() { 
    //Weird hack to make FF load localStorage correctly... 
    localStorage.length; 
    var keys = Object.keys(localStorage), 
     out = [], 
     i, 
     k, 
     name = ""; 
    for (i = 0; i < keys.length; i++) { 
     k = keys[i]; 
     name = vault.friendlyName(k); 
     if (name !== k && localStorage[k]) { 
      out.push({name: name, key: k}); 
     } 
    } 
    out.sort(function (a, b) { 
     return a.name > b.name ? 1 : -1; 
    }); 
    return out; 
}; 

इसमें कुछ समय में यह कुछ भी लॉग ऑन नहीं है कि बेहतर है ...

+0

हालांकि यह काम करता प्रतीत होता है, मैं इस सवाल को खुले में छोड़ रहा हूं उम्मीद है कि कोई समस्या की व्याख्या कर सकता है और/या एक समाधान प्रदान कर सकता है जो बदसूरत हैक नहीं है। – Asmor

-2

• कि localStorage डेटा सुनिश्चित करने के लिए सभी HTML पृष्ठों में लगातार उपलब्ध कराया गया है: ओ डोमेन (स्थानीय संदर्भ) चाहिए वही रहो o < < स्क्रिप्ट >> सभी एचटीएमएल फाइलों में समान टैग रखने के लिए सुनिश्चित करें, ओ (केवल फ़ायरफ़ॉक्स) सुनिश्चित करें कि ऑन पेज लोड को सभी जावास्क्रिप्ट फ़ाइलों (HTML फ़ाइलों के भीतर जोड़ा गया) में समान रखा गया है, यानी एक ही कार्य को जोड़ना सुनिश्चित करें PageLoadEvent पर।

1

हालांकि यह एक पुरानी पोस्ट है लेकिन सोचा कि मेरे निष्कर्ष मदद कर सकते हैं। मुझे भी एक ही समस्या का सामना करना पड़ रहा था, इसलिए मैंने इस पोस्ट के माध्यम से चले गए, मैंने कोशिश की और यह मैंने देखा है, अगर आप कुछ भी करने की कोशिश करते हैं (यहां तक ​​कि एक स्थानीय स्टोरेज.getItem) खिड़की से पहले स्थानीय स्टोरेज के साथ। यह सब कुछ हटा देगा यह और आपके पास कुछ भी नहीं होगा। तो जो भी आप सेट करना चाहते हैं या प्राप्त करना चाहते हैं, window.load के बाद इसे करें।

कुछ इस

$(window).load(function() { 
    //do whatever you want to do with localstorage 
}); 

तरह BTW मैं इस जो असफल रहा था इससे पहले कि document.ready पर localStorage के साथ कुछ आपरेशनों करने के लिए कोशिश कर रहा था।

संबंधित मुद्दे