#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 и для чего он используется, пока не прочитал описание тега