将属性的内容转换为函数&执行

时间:2013-12-03 16:56:23

标签: javascript jquery

采用以下示例:

<div id="Demo" data-after-load="alert('Woof!')">Loading...</div>

您会注意到我已为data-添加了自定义div属性 - ID的目的是:

  • 检查div是否包含属性
  • 如果是,则将属性的内容存储为稍后要执行的匿名函数
  • 稍后执行匿名函数

这是我到目前为止所做的:

var runLater = function () {};
if ($("#Demo").attr("data-after-load")) {
    runLater = ?????;
}
runLater();

2 个答案:

答案 0 :(得分:3)

if($("#Demo").data('afterLoad') !== undefined){
    var runLater = $("#Demo").data('afterLoad');
}
eval(runLater);

虽然,通常有一种比使用eval更好的方法。或许可以解释一下你使用它的原因,并且可能有更好的设计来满足你的要求。

答案 1 :(得分:1)

您可以eval()属性...

var runLater = $("#Demo").attr("data-after-load");

if( runLater ) {
    eval( runLater );
}

...但是如果可能的话,你应该将函数附加到.data()元素。这样就可以避免使用eval。

$("#Demo").data("after-load", function() {
    alert( 'Woof!' );
});

...

var runLater = $("#Demo").data("after-load");

if( runLater ) {
    runLater();
}

Demo

...如果你绝对必须拥有HTML中的data属性,那么下一个最好的事情就是让它引用一个函数,如果可能的函数列表是已知的。

HTML:

<div id="Demo" data-after-load="woof">Loading...</div>

JS:

var runLater = $("#Demo").data("after-load");

var funcList = {
    woof: function() {
        alert( 'Woof!' );
    },
    foow: function() { ... }
};

if( runLater && funcList[ runLater ] ) {
    funcList[ runLater ]();
}

Demo