Чи виділено в HTML5 об’єкт localStorage на сторінку / домен?


172

Чи виділений об'єкт HTML5 localStorage на сторінку / домен? Мені цікаво через те, як я б назвав ключі localStorage. Чи потрібен мені окремий префікс? Або я можу назвати їх все, що хочу?


Я завжди використовую префікс, лише щоб уникнути можливих зіткнень із сценаріями користувачів - які також могли б використовувати localStorage.
Бенжол

IMO Сценарії користувачів повинні уникати зіткнень, а не сторінок. У своєму сценарії користувача я використовую префікс, названий за сценарієм.
Каміло Мартін

Відповіді:


195

Це на домен і порт (ті ж правила сегрегації, що і та ж політика походження ), щоб зробити його на сторінці вам потрібно використовувати ключ, заснований на locationпідході чи іншому підході.

Ви не потребуєте префікса, використовуйте його, якщо він вам потрібен. Крім того, так, ви можете назвати їх все, що завгодно.


77
Це унікально за protocol://host:portкомбінацією.
thasmo

1
www.mysite.it:8012/App1 та www.mysite.it:8012/App2 поділився локальним сховищем?
DarioN1

3
@ DarioN1 Так, www.mysite.it:8012/App1 та www.mysite.it:8012/App2 мають спільне локальне сховище. (Caveat: Якщо ви отримуєте доступ до них з різних протоколів, EG http та https, вони не поділяються. У межах одного протоколу, піддомену, домену та порту - вони спільні. Це спрощення поняття "Походження". )
Вільям

31

Магазини є за походженням , де "походження" те саме, що і для тієї ж політики оригіналу (комбінація схем [ httpпроти httpsтощо], порту та хоста). З специфікації :

Кожен контекст перегляду верхнього рівня має унікальний набір областей зберігання сеансів, по одному для кожного джерела.

Таким чином, сховище http://a.example.comта сховище для них http://b.example.comє окремими (і вони обидва відокремлені http://example.com), оскільки всі вони є різними хостами. Так само http://example.com:80і http://example.com:8080іhttps://example.com все різне походження.

Не існує вбудованого механізму веб-сховища, який би дозволяв одному джерелу отримати доступ до сховища іншого.

Зверніть увагу , що це початок , а НЕ URL, так http://example.com/page1і http://example.com/page2обидва мають доступ до сховища для http://example.com.


3
Це було чудово написано, найбільше сподобалась ця відповідь, оскільки її легко читати і повністю пояснювати, навіть для тих, хто тільки починає розробку.
baHI

1
+1 для згадки про те, що "Не існує вбудованого механізму веб-сховища, який би дозволяв одному джерелу отримати доступ до сховища іншого".
Fabien Quatravaux

7

Так, кожен домен / піддомен має різні локальні сховища і ви можете зателефонувати за клавішами все, що завгодно (префікс не потрібно).

Щоб отримати ключ, ви можете використовувати метод методу (індекс), наприклад

localStorage.key(0);

Раніше існував об’єкт під назвою globalStorage, де ви могли мати кілька локальних торговельних майданчиків , але його застаріли в специфікаціях


7

Як зазначають інші, localStorage є унікальним для кожного протоколу, хоста та порту. Якщо ви хочете зручно керувати вашим сховищем за допомогою префіксованих клавіш, я пропоную localDataStorage .

Він не лише допомагає застосувати сегментоване спільне зберігання в одному домені за допомогою префіксації клавіш, але також прозоро зберігає типи даних JavaScript (масив, булевий, дата, плаваючий, цілий, струнний та об’єктний), забезпечує легку обфузацію даних, автоматично стискає рядки та полегшує запит за ключем (ім'ям), а також запитом за значенням (ключ).

[DISCLAIMER] Я автор утиліти [/ DISCLAIMER]

Приклади:

// instantiate our first storage object
// internally, all keys will use the specified prefix, i.e. passphrase.life
var localData = localDataStorage( 'passphrase.life' );

localData.set( 'key1', 'Belgian' )
localData.set( 'key2', 1200.0047 )
localData.set( 'key3', true )
localData.set( 'key4', { 'RSK' : [1,'3',5,'7',9] } )
localData.set( 'key5', null )

localData.get( 'key1' )   -->   'Belgian'
localData.get( 'key2' )   -->   1200.0047
localData.get( 'key3' )   -->   true
localData.get( 'key4' )   -->   Object {RSK: Array(5)}
localData.get( 'key5' )   -->   null


// instantiate our second storage object
// internally, all keys will use the specified prefix, i.e. prismcipher.com
var localData2 = localDataStorage( 'prismcipher.com' );

localData2.set( 'key1', 123456789 )  // integer

localData2.get( 'key1' )   -->   123456789

Як бачите, примітивні значення дотримуються, і ви можете створити кілька примірників, щоб контролювати ваше сховище.


0

Він доступний в будь-якому місці цього домену, як запропонував Нік, як альтернатива існує sessionStorage працює трохи інакше, оскільки він відрізняється від самого вікна браузера. Тобто, інші вкладки чи вікна цього ж домену не мають доступу до тієї самої копії об’єкта зберігання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.