0

変数に配置した一連の関数を実行しようとしています。

ここに(デモ)があります

コード:

function pass_me(x) {
    alert(x);        
};

var colors = new Array();
var colors = ["pass_me('yellow');", "pass_me('green');", "pass_me('blue');"]

for(var i = 0; i <= colors.length; i++) {
    window[colors[i]]();
}​

残念ながら実行できません。私のコードで何が間違っているのですか?

ありがとう


関数の配列変数の背後にある話は、動的要素からコピーしたためです。このようにして、ページに既にある機能のみを実行します。したがって、pass_me("red") が存在しない場合は実行されません。

例:

<img src="img/something.jpg" ondblclick="pass_me("yellow")" />
<img src="img/something.jpg" ondblclick="pass_me("green")" />
<img src="img/something.jpg" ondblclick="pass_me("blue")" />

それから私はただ使用します:

jQuery("td img").each(function(){
colors.push(jQuery(this).attr("ondblclick"));
})
4

6 に答える 6

1

javascriptの文字列を実行する場合は、evalを使用して、文字列をjavascriptに解析するようにjavascriptに指示する必要があります。これは通常、JavaScriptを作成するための最良の方法ではありません。

evalの使用を避けるために、私はこれを提案します:

function pass_me(x) {
    alert(x);        
};

var colors = ["yellow", "green", "blue"];

for(var i = 0; i <= colors.length; i++) {
    pass_me(colors[i]);
}​

または、本当に関数を配列に入れて、配列にさまざまな関数を含めることができるようにしたい場合は、次のようにすることができます。

function pass_me(x) {
    alert(x);        
};

var colors = [{fn:pass_me, color: "yellow"}, {fn:pass_me, color: "green"}, {fn:pass_me, color: "blue"}];

for(var i = 0; i <= colors.length; i++) {
    colors[i].fn(colors[i].color);
}​
于 2012-11-17T04:43:40.173 に答える
1

デモ

function pass_me(x) {
    alert(x);        
}

var colors = ["yellow", "green", "blue"];

for(i = 0; i < colors.length; i++) {
    pass_me(colors[i]);
}
于 2012-11-17T04:49:52.503 に答える
1

配列メンバーを次のようなハンドラーに変更します。

function pass_me(x) {
    alert(x);        
};

var colors = [{ handler: pass_me, args: ['yellow'] }, { handler: pass_me, args: ['green'] }, { handler: pass_me, args: ['blue'] }];

for(var i = 0; i < colors.length; i++) {
    colors[i].handler.apply(this, colors[i].args);
};

このようにして、ハンドラーごとに異なるパラメーターを使用して、同じ配列に複数のハンドラーを含めることができます。または、メンバーのデータ型が関数ではなく文字列であるため、メンバーを呼び出す前にメンバーを初期化します。このような:

function pass_me(x) {
    alert(x);        
};

var colors = ["pass_me('yellow')", "pass_me('green')", "pass_me('blue')"];

for(var i = 0; i < colors.length; i++) {
    eval(colors[i]);
};

お役に立てば幸いです。

乾杯

于 2012-11-17T05:00:14.377 に答える
1

ここで使用してもおそらく安全ですevalが、個人的にはもう少しクリーンな別の解決策を次に示します。

イベント ハンドラーは、HTML 属性を介してバインドされます。ほとんどの HTML 属性値は、対応する DOM プロパティ値の基礎です。この場合、各imgDOM 要素にはondblclick、HTML 属性の値である関数本体を持つプロパティがあります。

つまり、HTML は次と同等です。

imgElement.ondblclick = function() {
    pass_me('yellow');
};

したがって、これらの関数を「収集」したい場合は、イベント ハンドラーへの参照を取得するだけです。

var handlers = jQuery("td img").map(function(){
    return this.ondblclick;
}).get();

後で呼び出します。

for(var i = 0, l = handlers.length; i < l; i++) {
    handlers[i]();
}

ただし、画像を物理的にクリックせずにすべてのハンドラーを実行したい場合は、それらのイベントをトリガーするだけです。

jQuery("td img").trigger('dblclick');

これにより、イベントのすべてのイベント ハンドラーが実行されますdbclick

于 2012-11-17T07:13:08.063 に答える
0

おそらくあなたは無名関数を探しています:

function pass_me(x) {
    alert(x);        
}

var colors = [
    function(){ return pass_me('yellow'); }, 
    function(){ return pass_me('green'); },
    function(){ return pass_me('blue'); }
];

for(var i = 0; i < colors.length; i++){
    colors[i]();
}
于 2012-11-17T04:46:55.383 に答える
0

あなたは試す必要があります

eval(colors[i]);

関数ではなく文字列なので

于 2012-11-17T04:41:40.053 に答える