Как я могу назначить iframe для внутреннего HTML элемента div?

Я пытаюсь присвоить iframe внутреннему HTML элемента div, но не могу понять, как его отобразить. Вот некоторые соответствующие фрагменты

function showText(debugElement, message) {
    if (debugElement != null) {
        debugElement.innerHTML = message;
    }
}

function escapeHtml(html){
    var text = document.createTextNode(html);
    var p = document.createElement('p');
    p.appendChild(text);
    return p.innerHTML;
}

function getDebugText(request) {
    var responseText = "";
    try {
        var responseJSON = JSON.parse(request.response);
        for (const [key, val] of Object.entries(responseJSON)) {
            responseText += `  ${key}: ${val}\n`;
        }
    } catch(error) {
        if (request.responseText.startsWith('<!doctype html>')) {
            responseText = `<div>${request.statusText}</div><iframe scrolling = "yes" style = "width: 100%;" srcdoc = "${escapeHtml(request.responseText)}"></iframe>`
        } else {
            responseText = escapeHtml(`${request.statusText}\n${request.responseText}`);
        }
    }

    console.info(responseText)
    return responseText;
}

достаточно сказать, что где-то есть что-то вроде

showText(document.getElementByID('details'), getDebugText(response))

Я вижу визуализированный кадр, но в нем нет никакого содержимого. Я видел другие ответы, которые делают что-то вроде document.appendChild(iframe), но не могу понять, как это сделать с именованным div.

srcdoc = "${escapeHtml(request.responseText)}" создаст неверный HTML-код, если в request.responseText есть двойные кавычки. У вас должна быть функция escapeHtml(), заменяющая кавычки на &quot;.
Barmar 31.08.2024 00:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема, вероятно, заключается здесь:

<iframe scrolling = "yes" style = "width: 100%;" srcdoc = "${escapeHtml(request.responseText)}"></iframe>

Попробуйте создать этот элемент с помощью JavaScript, затем вы сможете присвоить атрибут srcdoc через объект элемента iframe (вам даже не понадобится экранировать request.responseText, поскольку JavaScript сделает это за вас...

Затем вы прикрепляете его к debugElement внутри вашей showText функции.

Обратите внимание, что не все браузеры поддерживают атрибут srcdoc...

const MyFrame = document.createElement('iframe');

MyFrame.srcdoc = "<b>TESTING ESCAPABLE CHARACTERS:" +
'"' + "'" + '\\' + '<' + '>' + '</b>';

// This will work... But will keep adding frames instead of replacing...
// MyFrameContext.appendChild(MyFrame);

// This will just replace anything that was there with your iFrame.
MyFrameContext.replaceChildren(MyFrame);
<div id='MyFrameContext'>
  <!-- Here goes your dynamic iFrame -->
</div>

Это отлично работает для меня.

Спасибо! Мне не хватало деталей .outerHTML. Теперь все работает так, как я ожидаю.

xaviersjs 31.08.2024 02:03

InnerHTML = externalHTML очень неэффективен и приводит к утечке памяти. Современный способ - сделать MyFrameContext.replaceChildren(MyFrame)

David Bradshaw 31.08.2024 10:07

Спасибо Дэвид. У вас очень хорошая точка зрения. Я отредактировал код, и теперь все в порядке. Думаю, я сделал это именно так, потому что вопрос включает в себя «innerHTML»... И немного старых привычек.. =/

user2804429 01.09.2024 00:42

Другие вопросы по теме