Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.08.2021, 19:44
Интересующийся
Отправить личное сообщение для Oleg0 Посмотреть профиль Найти все сообщения от Oleg0
 
Регистрация: 07.04.2016
Сообщений: 28

Как добавить класс к блоку по клику на кнопку, которая загружена в iframe?
Всем привет!
Нужно помощь плохо разбирающемуся в скриптах.
Надеюсь, получится объяснить понятно.
Пытаюсь встроить вот эту штуку в корзину сайта https://docs.ozon.ru/logistics/delivery/widget/

Клиент выбирает пункт выдачи заказа и нажимает на кнопку "Забрать здесь". В этот момент генерируется такой код:
{"id":19068791345000,"type":"Пункт выдачи","address":"Россия, г. Москва, ш. Сколковское, д. 32","fittingClothesAvailable":true,"fittingShoesAv ailable":false}
Из которого мой скрипт берёт адрес пункта и вставляет его в поле с id=edit-panes-webform-nid3005-0--ozon - с этим мой скрипт справляется отлично (строка $('#edit-panes-webform-nid3005-0--ozon').val([person.address, person.id])
Одновременно с этим я хочу, чтобы в блок <div id="div_ozon" class="div_ozone"> добавился класс close_ozon (строка $('#div_ozon').toggleClass('close_ozon') - и вот этот код почему-то не срабатывает.

Подскажите, пожалуйста, что нужно исправить? Сначала я думал, что это из-за того, что загрузка виджета идёт в iframe, но ведь первая часть моего кода срабатывает отлично.

Вот весь код.

<div id="div_ozon" class="div_ozone">
<div class="close"></div>
<iframe title="Ozon widget" style="width: 100%; height: 100%; min-height: 450px; min-width: 320px; border: none; overflow: hidden" src="https://rocket.ozon.ru/lk/widget?token=.......%3D%3D&hidepostamat=true">Браузер не поддерживает iframe</iframe>
</div>

<script>
window.addEventListener("message", receiveMessage, false);
function receiveMessage(event)
{
    // Важно не слушать чужие события
    if (event.origin !== "https://rocket.ozon.ru")
     return;
    console.log(event.data);
	var person = JSON.parse(event.data);
	$('#edit-panes-webform-nid3005-0--ozon').val([person.address, person.id]);
$('#div_ozon').toggleClass('close_ozon');
};

</script>
Ответить с цитированием
  #2 (permalink)  
Старый 07.08.2021, 23:28
Кандидат Javascript-наук
Отправить личное сообщение для od0201 Посмотреть профиль Найти все сообщения от od0201
 
Регистрация: 07.05.2020
Сообщений: 108

toggleClass это jquery, а в "весь код" я не вижу его подключение
а если без jquery, попробуйте на чистом js
document.querySelector('#div_ozon').classList.add( 'close_ozon')

<body>
  <div id="div_ozon" class="div_ozone">
    <div class="close"></div>
    <iframe title="Ozon widget" style="width: 100%; height: 100%; min-height: 450px; min-width: 320px; border: none; overflow: hidden" src="https://rocket.ozon.ru/lk/widget?token=.......%3D%3D&hidepostamat=true">Браузер не поддерживает iframe</iframe>
    </div>
</body>
<script>
  setTimeout(()=> {document.querySelector('#div_ozon').classList.add('close_ozon')}, 2000)
</script>


в по поводу кнопки в фреме, то это зависит тот же домен и протокол у фрема, если да, то пробуйте нажимать через iframe.contentWindow.document
иначе работать доступ закрыт

Последний раз редактировалось od0201, 08.08.2021 в 10:32.
Ответить с цитированием
  #3 (permalink)  
Старый 08.08.2021, 07:53
Интересующийся
Отправить личное сообщение для Oleg0 Посмотреть профиль Найти все сообщения от Oleg0
 
Регистрация: 07.04.2016
Сообщений: 28

Сообщение от od0201 Посмотреть сообщение
в по поводу кнопки в фреме, то это зависит тот же домен и протокол у фрема, если да, то пробуйте iframe.contentWindow.document.querySelector('#div_ ozon').classList.add('close_ozon')
иначе работать доступ закрыт
На моём сайте iframe грузится с https://rocket.ozon.ru/lk/widget. Значит, нажатие кнопки я никак не смогу использовать?

Я просто думал, что раз при нажатии кнопки у меня заполняется поле "#edit-panes-webform-nid3005-0--ozon", то и класс при нажатии тоже сможет подставиться.

А можно тогда как-то сделать, чтобы если заполнилось поле "#edit-panes-webform-nid3005-0--ozon", то добавляем в #div_ozon класс close_ozon?
Ответить с цитированием
  #4 (permalink)  
Старый 08.08.2021, 10:32
Кандидат Javascript-наук
Отправить личное сообщение для od0201 Посмотреть профиль Найти все сообщения от od0201
 
Регистрация: 07.05.2020
Сообщений: 108

Если верить документации, то при разных источниках доступ закрыт. У меня тоже не получилось.

Проблема в том что в представленом вами коде нет ни кнопки ни поля "#edit-panes-webform-nid3005-0--ozon". Можно только догадываться. Кнопка и поле находится в фреме и там обрабатывается данное событие, а так как #div_ozon находится вне фрема, а это значит что разные источники, значит никак
Ответить с цитированием
  #5 (permalink)  
Старый 08.08.2021, 11:50
Интересующийся
Отправить личное сообщение для Oleg0 Посмотреть профиль Найти все сообщения от Oleg0
 
Регистрация: 07.04.2016
Сообщений: 28

Вот у меня и появилась идея. Моё поле же заполняется при нажатии кнопки. Можно как то к этому событию прикрутить добавление класса? Мол если поле заполнилось, значит добавить класс.
У меня поле вот такое заполняется:
<input type="text" maxlength="128" name="panes[webform_nid3005][0][_ozon]" id="edit-panes-webform-nid3005-0--ozon" size="60" value="" readonly="readonly" class="form-text">

Оно на моём сайте.
Кнопка загружается в ifame, вот пример https://docs.ozon.ru/logistics/delivery/widget/

Последний раз редактировалось Oleg0, 08.08.2021 в 12:33.
Ответить с цитированием
  #6 (permalink)  
Старый 08.08.2021, 13:15
Интересующийся
Отправить личное сообщение для Oleg0 Посмотреть профиль Найти все сообщения от Oleg0
 
Регистрация: 07.04.2016
Сообщений: 28

Вроде получилось что-то похожее на нужное.

<script>
window.addEventListener("message", receiveMessage, false);
function receiveMessage(event)
{
    // Важно не слушать чужие события
    if (event.origin !== "https://rocket.ozon.ru")
     return;
    console.log(event.data);
	var person = JSON.parse(event.data);
	$('#edit-panes-webform-nid3005-0--ozon').val([person.address, person.id]);

if (person.type == "Пункт выдачи")

document.querySelector('#div_ozon').classList.add('close_ozon');

};


</script>


Теперь и поле заполняется и класс вставляется (класс, кстати, закрывает окошко, в котором открывалась карта).
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как добавить кнопку с характеристиками? gghoome Элементы интерфейса 1 18.04.2015 15:44
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Динамическое создание iframe в Firefox mrbean11 Firefox/Mozilla 8 02.11.2012 21:23
как добавить кнопку к [js] KOLANICH Сайт Javascript.ru 2 10.04.2010 20:34
как можно создать iframe со скриптами GOll Общие вопросы Javascript 2 05.05.2009 11:32