0

我听说在 JavaScript 中使用 eval 函数是个坏主意,但我有这段代码:

// this string (function)  is generated dynamically...
var funVal = 'alert("a")' ;        
//.....

var Button1 = document.getElementById("BtnSave");
// onclick event of button
eval("Button1.onclick = function () { " + funVal + " };");  

我不想使用eval. 还有其他解决方案吗?

4

3 回答 3

5

只需在没有 的情况下编写非常接近的代码eval,就没有什么需要它了:

var funVal = function() {
    alert("a");
};

var Button1 = document.getElementById("BtnSave");
Button1.onclick = funVal;

在您所说的评论中,代码是在服务器端动态生成的。这根本不是问题,只需让服务器输出预期 JavaScript 代码的代码(在<script>...</script>标签内,或作为您将通过 加载的响应的完整内容<script src="..."></script>)。无论哪种情况,关键是确保您发送给浏览器的内容是有效代码。

示例 1:动态生成的内联script标签(您还没有说服务器端技术是什么,所以我选择了相当常见的 PHP):

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Inline Dynamically Generated Script</title>
</head>
<body>
<p>Each time you load this page, the script in the inline
<code>script</code> tag at the end is different.</p>
<button id="theButton">Click Me</button>
<script>
document.getElementById("theButton").onclick = function() {
    alert("<?php echo("Hi there, this page's magic number is " . rand(0, 10000)); ?>");
};
</script>
</body>
</html>

现场示例

示例 2:在单独文件中动态生成的脚本:

HTML:

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Dynamically Generated Script from File</title>
</head>
<body>
<p>Each time you load this page, the script in the file
loaded by the <code>script</code> tag at the end
is different.</p>
<button id="theButton">Click Me</button>
<script src="dynamic-script.php"></script>
</body>
</html>

JavaScript 文件 ( dynamic-script.php):

<?php header('Content-type: application/javascript'); ?>
document.getElementById("theButton").onclick = function() {
    alert("<?php echo("Hi there, this page's magic number is " . rand(0, 10000)); ?>");
};

现场示例

于 2012-12-21T23:17:21.060 回答
0

我不知道你为什么要这样做,但更好的方法是使用Function构造函数:

new Function("Button1.onclick = function () { " + funVal + " };")();

但你不必使用这个或eval解决方案。这样做在输出中是完全等价的:

Button1.onclick = function() { alert('a'); };
于 2012-12-21T23:16:59.467 回答
0

Javascript 允许您将函数视为变量。您可以将它们分配给其他变量,可以将它们作为参数传递给其他函数,甚至可以拥有返回其他函数的函数。这可以在大多数使用evil() eval() 的情况下使用。

于 2012-12-21T23:19:48.800 回答