JavaScript объекты и постоянство через диалоги - PullRequest
1 голос
/ 09 февраля 2010

Довольно простой вопрос здесь. Я хочу создать объект JS, который имеет свойство, скажем, имя. Я хочу создать этот объект и иметь возможность использовать его на своей странице. Например, то, что у меня сейчас, не работает:

var item = new Object();
function makeItem(title) { 
   item.name = title;
}

Внутри модального диалога:

makeItem("test");
alert(item.name); // returns "test"

Однако после закрытия диалога вся информация, связанная с item, исчезла. Например, я не могу пойти дальше и посмотреть, содержит ли item.name что-нибудь в следующий раз, когда я пытаюсь создать тот же диалог.

В настоящее время внутри документа ничего не найдено.) (1011 *)

Ясно, что я не до конца понимаю идею DOM. О, ты не мог бы просветить мой бедный мозг?

Спасибо!

1 Ответ

2 голосов
/ 09 февраля 2010

Как правильно сказал Джон, более подробная информация и код помогут понять вашу ситуацию.

Из ваших симптомов, хотя я предполагаю, что у вас есть страница dialog.html со сценарием, который пытается "makeItem", и этот dialog.html загружается во фрейм или даже в отдельное окно / вкладку браузера каждый раз, когда вы "открываете диалог».

Немного теории

В браузерах все объекты JavaScript и код «принадлежат» одной из открытых «страниц». Страница может быть открыта как страница верхнего уровня на вкладке браузера или в отдельном окне, или во фрейме (в этом случае она кажется частью своей родительской страницы, но ее JS по-прежнему отделен от родительской).

Каждая открытая страница имеет свой собственный «глобальный объект», который обычно называют window. Глобальные функции и переменные, которые вы определяете на верхнем уровне в , присоединяются как свойства к этому глобальному объекту.

Когда вы открываете одну и ту же страницу дважды (одновременно - в двух вкладках рядом - или закрываете первую перед открытием второй копии), каждая копия получает собственный глобальный объект, полностью разделяющий код и объекты.

Обычно, когда страница закрыта, глобальный объект этой страницы и все его свойства (включая любые объекты и функции) уничтожаются.

Вот почему item в вашем примере теряет свои свойства при закрытии и повторном открытии диалога (при условии, что мое первоначальное предположение было верным).

Ссылки на другое окно

Правильное решение вашей проблемы зависит от того, чего вы пытаетесь достичь.

Если вам нужно связаться со страницей открывателя и открыть диалог и обратно, вы можете сохранить ссылку из window.open() вызова:

var w = window.open(...dialog URL...);

После того, как диалог загружен, w будет указывать на глобальный объект диалога, и вы сможете его ткнуть. Аналогично, из диалогового окна вы можете получить доступ к глобальному объекту страницы, открывшей диалоговое окно, с помощью window.opener.

Таким образом, вы можете создать item в контексте открывателя, поместив в диалоговом окне следующее:

opener.item = {title: "test"};

... и он будет жить столько же, сколько открывающая страница.

Настоящая настойчивость

Если вам нужно реальное постоянство (например, при перезапуске браузера), вашими единственными вариантами до недавнего времени были файлы cookie или серверное хранилище. В современных браузерах вы можете использовать для этого веб-хранилище (localStorage, sessionStorage объекты).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...