アップデート
これが私の最終的な実用的な答えです:
コンソールでこのコードを実行した後
theMethod = 'attr("id","foo")'.match(/^([^(]+)\(([^)]*)\)/);
jQuery('#post-form')[theMethod[1]].apply(jQuery('#post-form'),JSON.parse('['+theMethod[2]+']'));
post-form 要素に新しい ID が付けられましたが、まったく問題ありません。これは、複数の引数、単一の引数、または引数をまったくとらないメソッドで機能します。要約:
theMethod = theInString.match(/^\.?([^(]+)\(([^)]*)\)/);
//added \.? to trim leading dot
//made match in between brackets non-greedy
//dropped the $ flag at the end, to avoid issues with trailing white-space after )
elem[theMethod[1]].apply(elem,JSON.parse('['+theMethod+']'));
それは私が考えることができる最も安全で信頼できるアプローチです
EVALを使用しないでください:
var theMethod = 'attr(\'id\')';
//break it down:
theMethod = theMethod.match(/^([^(]+)\(.*?([^)'"]+).*\)$/);
//returns ["attr('id')", "attr", "id"]
elem[theMethod[1]](theMethod[2]);//calls the method
これは、任意のオブジェクトで使用するのと同じ基本原則です (JS では、関数はすべてそれ自体がオブジェクトであり、jQuery オブジェクトもオブジェクトであることを思い出してください)。これは、プロパティとまったく同じ方法でメソッドにアクセスできることを意味します。
$('#foo').attr('id') === $('#foo')['attr']('id');
したがって、文字列を分割し、オブジェクト プロパティのようにメソッド名を使用するだけで、準備完了です。
覚えておいてください: eval ハンマーしかない場合、すべてが親指のように見えます。
ブレンダン・アイヒ
複数の引数が何らかのメソッドに渡される可能性がある場合は、それを回避することもできます(私は思います-まあ:ロジックは指示しますが、かなり遅く、ロジックはジンによってかなりひどいものになっています) :
theMethod = theMethod.match(/^([^(]+)\(([^)]+)\)$/);
//["attr('id','foo')", "attr", "'id','foo'"] --> regex must now match quotes, too
elem.theMethod[1].apply(elem,JSON.parse('['+theMethod[2]+']'));
これにより、処理している要素/オブジェクトのメソッドがそれ自体に適用されるため、呼び出し元のコンテキストは変更されず (this
メソッド内のオブジェクトを指します)、呼び出されたメソッドに渡される引数の配列が渡されます。