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 に答える