Открыть всплывающее окно вместо новой вкладки / окна в размещенном в долларах США элементе управления

#javascript #jquery #window.open #dynamics-365 #unified-service-desk

#javascript #jquery #window.open #динамика-365 #unified-service-desk

Вопрос:

Как открыть всплывающее окно в размещенном в долларах США элементе управления?

Код Javascript:

 <script>
    function basicPopup(url) {
popupWindow = window.open(url,'popUpWindow','height=300,width=700,left=50,top=50,resizable=yes,scrollbars=yes,toolbar=yes,menubar=no,location=no,directories=no, status=yes')
    }

</script>
<a href="https://www.google.com" onclick="basicPopup(this.href);return false">Open a popup window</a>

 

Правила навигации по окну в долларах США

Тип маршрута — всплывающее окно, действие — показать снаружи, пункт назначения — Вкладка

Тип хостинга: пограничный процесс / процесс Chrome.

Проблема: при запуске приведенного выше фрагмента JS в браузере он работал так, как ожидалось (всплывающее окно открывается с заданными размерами, а дочернее окно может связываться с родительским окном с сообщением Post), тогда как тот же код интегрирован с USD, всплывающее окно запускается на новой вкладке, а вновь открытое окно не может связываться с родительским окном (window.open() возвращает значение null)

Есть идеи относительно того, чего мне не хватает?

Ответ №1:

Если вы разрешите размещать в USD все процессы вашего браузера и унифицируете типы ваших браузеров, вы сможете получить доступ к своим родительским окнам по желанию.

Создайте «целевой» / «дочерний» размещенный элемент управления, который может получать вашу целевую навигацию. Сделайте все браузеры Chrome, и если вы не можете этого сделать по какой-либо причине, надеюсь, вы сможете сделать их все Edge вместо этого. В вашем правиле навигации по окну вместо отображения снаружи используйте окно маршрута действия и установите целевую вкладку для нового дочернего элемента управления, размещенного в браузере. Поместите дочерний браузер на FloatingPanel, если вы предпочитаете не размещать его в качестве вкладки главной панели.

Кроме того, чтобы не быть излишним, но, заметив ваше резюме гибридного хостинга «Chrome / Edge» выше, я бы посоветовал сделать как можно больше, чтобы исключить размещение нескольких типов браузеров во всех ваших конфигурациях. Я бы предположил, что браузер, размещенный в долларах США, передаваемый в браузер, размещенный в Windows, может усложнить (предотвратить?) ваша способность находить родительское окно, даже если тип браузера внутри и за пределами USD одинаковый. Насколько мне известно, USD и Windows используют разные версии Edge (USD еще не интегрировала новый Edge, и, возможно, никогда), а USD управляет своими собственными экземплярами Chromium. Я предполагаю, что «Показать снаружи» в Chrome не запускает новый процесс CEF из вашей папки приложений в долларах США, а просто передает Windows, которая затем вызывает автономное приложение Chrome (если это браузер вашей ОС по умолчанию). Здесь может (?) Быть полезно протестировать различные комбинации типов браузеров, если вы по какой-либо причине придерживаетесь парадигмы «Показывать снаружи».

Комментарии:

1. Можем ли мы использовать Xrm.Navigation.openWebResource вместо создания размещенного элемента управления для дочерних окон?

2. Нет, я не верю, что это что-то решит для вас. Управление браузером с уровня кода — это одно, но здесь USD контролирует процессы браузера (пока вы не «покажете снаружи»), так что, похоже, в этом суть вашей проблемы. Добавление «дочернего» размещенного элемента управления и выравнивание типов браузеров может быть лучшим решением, позволяющим выполнить нулевые изменения кода. Как только все браузеры будут размещены в долларах США, если они по-прежнему не могут видеть друг друга, USD может перемещать данные для вас: окно проверки. IsUSD, реализовать шаблон отслеживания событий, RunScript / RunXrmCommand, [[replace.parameters]] и т.д.

3. Работает ли описанный выше подход для нескольких дочерних окон в одном и том же размещенном элементе управления?

4. Если я правильно понимаю, да, я так считаю. Похоже, у вас будет родительский элемент управления (или несколько «родительских» элементов управления), которые будут отображаться в дочернем элементе управления, размещенном в браузере. Просто включите «Разрешить несколько страниц» для дочернего размещенного элемента управления. Как только он получит вторую навигацию, он покажет выпадающий список, позволяющий переключаться между страницами.

Ответ №2:

Возможно, они вообще не разрешают всплывающее окно, как здесь, в SO во фрагментах.

Вы можете посмотреть в консоли.

Вот версия с дополнительной информацией — ОБРАТИТЕ внимание, что эта версия ничего не отображает в SO из-за песочницы

Обратите внимание, что вы не можете получить доступ к содержимому во всплывающем окне или родительскому элементу из всплывающего окна, если содержимое имеет разные источники

 document.getElementById("popupDiv").addEventListener("click", function(e) {
  const tgt = e.target.closest("a");
  if (tgt amp;amp; tgt.classList.contains("popup")) {
    const popupWindow = window.open(tgt.href, tgt.target, 'height=300,width=700,left=50,top=50,resizable,scrollbars,toolbar,status');
    if (popupWindow) {
      console.log("Popup allowed");
      e.preventDefault(); // cancel the actual link
    } else console.log("Not allowed to pop, target used instead")
  }
}) 
 <div id="popupDiv">
  <a href="https://www.google.com" target="popopWindow" class="popup">Open a popup window</a>
</div> 

Комментарии:

1. Кажется, всплывающее окно не работает, но в любом случае для связи новой вкладки с родительским окном (находится в долларах США)?

2. Нет. Вы не можете взаимодействовать с содержимым из другого источника

3. Просто любопытно, почему USD ограничивает всплывающее окно в размещенном элементе управления?

4. Я понятия не имел, что такое USD и для чего он используется, пока не прочитал описание тега