Как выполнить JavaScript, который является строкой?
function ExecuteJavascriptString()
{
var s = "alert('hello')";
// how do I get a browser to alert('hello')?
}
Как выполнить JavaScript, который является строкой?
function ExecuteJavascriptString()
{
var s = "alert('hello')";
// how do I get a browser to alert('hello')?
}
С функцией eval("my script here")
.
Вы можете выполнить его с помощью функции. Пример:
var theInstructions = "alert('Hello World'); var x = 100";
var F=new Function (theInstructions);
return(F());
Функция eval
будет оценивать переданную ей строку.
Но использование eval
может быть опасным, поэтому используйте с осторожностью.
Изменить: у annakata есть хорошая точка. медленный. Это связано с тем, что код, который нужно оценить, должен анализироваться на месте, так что это потребует некоторых вычислительных ресурсов.
Используйте eval().
W3 Schools tour eval. На сайте есть примеры использования eval. Документация Mozilla подробно описывает это.
Вы, вероятно, получите много предупреждений об этом безопасно. НЕ разрешают пользователям вводить НИЧЕГО в eval(), поскольку это огромная проблема безопасности.
Вы также захотите узнать, что eval() имеет другой scope.
Попробуйте следующее:
var script = "<script type=\"text/javascript\"> content </script>";
//using jquery next
$('body').append(script);//incorporates and executes inmediatelly
Лично я не тестировал его, но, похоже, работает.
Немного похоже на то, что сказал @Hossein Hajizadeh alerady, хотя более подробно:
Существует альтернатива eval()
.
Функция setTimeout()
предназначена для выполнения чего-то после интервала в миллисекундах, а код, который должен быть выполнен, происходит так, что форматируется как строка.
Он будет работать следующим образом:
ExecuteJavascriptString(); //Just for running it
function ExecuteJavascriptString()
{
var s = "alert('hello')";
setTimeout(s, 1);
}
Используйте eval, как показано ниже. Eval следует использовать с осторожностью, простой поиск " eval is evil " должен бросать некоторые указатели.
function ExecuteJavascriptString()
{
var s = "alert('hello')";
eval(s);
}
Если вы хотите выполнить определенную команду (строку) после конкретное время - cmd = ваш код - InterVal = задержка для запуска
function ExecStr(cmd, InterVal) {
try {
setTimeout(function () {
var F = new Function(cmd);
return (F());
}, InterVal);
} catch (e) { }
}
//sample
ExecStr("alert(20)",500);
Проверено это на многих сложных и запутанных сценариях:
var js = "alert('Hello, World!');" // put your JS code here
var oScript = document.createElement("script");
var oScriptText = document.createTextNode(js);
oScript.appendChild(oScriptText);
document.body.appendChild(oScript);
eval(s);
Но это может быть опасно, если вы принимаете данные от пользователей, хотя я полагаю, что если они нарушают свой собственный браузер, это их проблема.
Не уверен, что это обман или нет:
window.say = function(a) { alert(a); };
var a = "say('hello')";
var p = /^([^(]*)\('([^']*)'\).*$/; // ["say('hello')","say","hello"]
var fn = window[p.exec(a)[1]]; // get function reference by name
if( typeof(fn) === "function")
fn.apply(null, [p.exec(a)[2]]); // call it with params
eval должен это сделать.
eval(s);
eval(s);
Помните, что этот eval очень мощный и довольно небезопасный. Лучше быть уверенным, что выполняемый script безопасен и не поддается обсуждению пользователями.
Новая функция и apply() вместе работают также
var a=new Function('alert(1);')
a.apply(null)
Я отвечал на аналогичный вопрос и получил еще одну идею, как этого добиться без использования eval()
:
const source = "alert('test')";
const el = document.createElement("script");
el.src = URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));
document.head.appendChild(el);
В приведенном выше коде вы в основном создаете Blob, содержащий ваш скрипт, чтобы создать URL объекта (представление объекта File или Blob в памяти браузера). Поскольку у вас есть свойство src
для <script>
, скрипт будет выполняться так же, как если бы он был загружен с любого другого URL.
function executeScript(source) {
var script = document.createElement("script");
script.onload = script.onerror = function(){ this.remove(); };
script.src = "data:text/plain;base64," + btoa(source);
document.body.appendChild(script);
}
executeScript("alert('Hello, World!');");
new Function('alert("Hello")')();
Я думаю, что это лучший способ.