2012-04-24 24 views
0

私は、次のdiv持っている:私はこのようなJavaSciptの関数としてのdivのコールバック文字列を実行できるようにしたいHTML5データ文字列をJavaScript(evalなし)として実行しますか?

<div id="foo" data-callback="function(){console.log(1)}"></div>

($('#foo').data('callback'))()

をしかし、これは明らかにしません作業。これを行う方法はありますか?

ここにはJSFiddleがあります。

答えて

7

私はようなコードを格納していないことをお勧め3210属性。関数を作成し、その関数名を属性として保存してください。

<script> 
function callbackA(){ 
    console.log(1) 
} 
</script> 
<div id="foo" data-callback="callbackA"></div> 

次に、window[$('#foo').data('callback')]()を実行できます。

編集:これをやりたくない場合は、onclickイベント(またはその問題についての(組み込み)イベント)を使用することもできます。

<div id="foo" onclick="console.log(1)"></div> 

その後、あなたは(関数として)イベントを取得するために.propを使用し、それを使用することができます。

var callback = $('#foo').prop('onclick'); // get function 
$('#foo').removeProp('onclick'); // remove event 
callback(); // use function 
+0

私は本当にこれを行うことはできません。私はプラグインを開発しています。ユーザーが特定の要素に簡単な方法でカスタムコールバックを追加できるようにしたいと考えています。 –

+1

これは「シンプルな簡単な方法」です。グローバル関数を作成し、その属性を単純な名前に設定します。どうしてそんなことはできないの? –

+0

はい、他のスクリプトタグをページに追加する必要はありません。理想的には、私が仕事に与えたHTMLサンプルのJavaScriptソリューションが必要です。 –

0

evalを使用して行うことができますが、evalはevilです。

編集:

そして、いくつかのmodifictionがあなたのHTMLに必要とされ、

<div id="foo" data-callback="(function(){console.log(1)})"></div> 

JS

eval($('#foo').data('callback'))(); 

DEMO

+0

タイトルを読む:HTML5データ文字列をJavaScriptとして実行する(**評価なし**)? –

+0

@DC_文字列式をjavascriptオブジェクト(関数)に変換すると、evalが使用されます。 'eval'なしで文字列を評価することはできません。 –

+0

@Downvoter - コメントを残してください。 –

0

いつもFunctionコンストラクタを使用できますが、文だけを含む文字列が必要です。ソースでそのデータ属性の値を変更できる場合は、既存の文字列を解析するか、さらにはそれをさらに解析することができます。あなたが行うことができ、その後

<div id="foo" data-callback="{console.log(1)}"></div> 

にHTMLを変更することができれば、あなたは

var fn = new Function($("#foo").data("callback")); 
fn(); 

Updated JSFiddle

2

を行うだろう

new Function($('#foo').data('callback'))() 

しかし、なぜあなたはが必要ですそのようにするには?

+1

+1は大胆でNEEDですか?フォーム送信時にコールバックを保存できるので、 –

+0

が必要です。 –

3

解決策は、js.jsを使用することです。これはevalより安全です。

+2

+1:本当にクレイジー!私は解決策が好きです。 :-) – kay

関連する問題