#javascript #variables #addeventlistener #postmessage
Вопрос:
В принципе, я хочу сделать что-то вроде этого:
var a = 3; var b = 4; postMessage(a, '*'); postMessage(b, '*');
Затем попросите слушателя сделать что-то вроде этого:
addEventListener('message', event =gt; { sessionStorage.setItem("variable a",event.data=a); sessionStorage.setItem("variable b",event.data=b);
});
Очевидно, что «event.data=a» и «event.data=b» не являются реальным кодом, но я надеюсь, что смысл дойдет…
Спасибо!
Комментарии:
1. Передайте имя переменной явно, если вас это волнует.
2. @Bergi это ИМЕННО то, что я действительно хочу сделать… так как же мне явно передать имя переменной через postMessage и записать его в addEventListener? Программирующий простак здесь… извините…
3.
postMessage({name: "a", value: a})
. Тогда вы можетеconsole.log(`variable ${event.data.name} = ${event.data.value}`)
4. Круто… Теперь я понимаю, как это работает. Я действительно видел нечто подобное раньше, но не смог уловить его значения. Я признателен за разъяснение.
Ответ №1:
Если типы совпадают, не совсем, с двумя addEventListeners
— вместо этого рассмотрите возможность размещения объекта, состоящего из обоих a
и b
, и вместо этого сохраните строковый объект в хранилище. Это не только решает вашу проблему, но и является гораздо более управляемым и элегантным подходом.
postMessage({ a, b }, '*');
и
addEventListener('message', event =gt; { sessionStorage.setItem('datas', JSON.stringify(event.data)); });
Комментарии:
1. Это чертовски круто… спасибо! Ваше простое решение также заставило меня понять, что я мог бы просто отправить массив, который, я полагаю, тоже был бы способом выполнить то, что я пытался сделать. Сначала мне это было не очевидно…
2. Когда ответ решит вашу проблему, вы можете проголосовать и/или отметить его как принятый (установите флажок слева), чтобы указать, что проблема решена 🙂
3. Я проголосовал, но у меня недостаточно очков репутации, чтобы это показать (извините). Я еще не «принял этот ответ», потому что он явно не отвечает на мой вопрос, даже если он был чрезвычайно полезен. Я думаю, что @Bergi в комментариях выше более точно уловил суть моего вопроса. В конечном счете, однако, я хотел бы определить var a = 3; в iframe и передать ВСЮ эту информацию в родительское окно (т. Е. «a = 3»), предпочтительно без необходимости устанавливать новую переменную в родительском окне. Не уверен, возможно ли это или нет. Я полагаю, что это не то, что я говорю с помощью бита sessionStorage….
4. Я также хочу перенести «a = 3» на веб-страницы на вкладке браузера. например, установите var a = 3; в iframe отправьте эту информацию в родительское окно, а затем сохраните эту информацию, когда я перейду на другую страницу на той же вкладке браузера, чтобы затем я мог использовать «a = 3» на этой новой странице. Вероятно, в моей голове это имеет больше смысла, чем на бумаге… извините
5. Я должен также добавить, что мне нужно сделать это для нескольких переменных в одном и том же фрейме iframe и обновить значения этих переменных в родительском окне по мере их изменения в фрейме iframe перед переходом на новую страницу.