Создайте элемент скрипта с помощью VanillaJS из строки, которая выполняется - PullRequest
0 голосов
/ 18 октября 2019

Я получаю строку:

'<script class="heyo">document.write("hello")<\/script>' 

Я должен создать с помощью VanillaJS встроенный элемент сценария.

Есть ли способ запустить выполнение скрипта?

Работает, но слишком сложно:

const scriptString = '<script class="heyo">document.write("hello")<\/script>';

document.body.insertAdjacentHTML('beforeend', scriptString);

const pseudoScript = document.body.querySelector('.heyo');

const newScriptEl = document.createElement('script');
[...pseudoScript.attributes].forEach(attr => {
    newScriptEl.setAttribute(attr.nodeName, attr.nodeValue);
});
newScriptEl.innerHTML = pseudoScript.text;
document.body.append(newScriptEl);

pseudoScript.remove();

Любые лучшие идеи приветствуются.

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Я бы сказал, что это более или менее лучший способ сделать это. Какое это имеет значение, что он «сложный»?

Единственное, что я не изменяю, это не вставляет оригинальный скрипт в «живую» страницу, а в отдельный элемент, который также имеет преимущество, заключающееся в том, чтожесткое кодирование имени класса:

const scriptString = '<script class="heyo">document.write("hello")<\/script>';

const tempDiv = document.createElement("div");
tempDiv.innerHtml = scriptString;
const pseudoScript = tempDiv.firstChild;

const newScriptEl = document.createElement('script');
// ...
0 голосов
/ 18 октября 2019

Небольшое решение с appendChild вместо insertAdjacentHTML:

var scriptElement = document.createElement("script");
var scriptCode = document.createTextNode("document.write('hello')");
scriptElement.appendChild(scriptCode); 

document.body.appendChild(scriptElement);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...