-3

在我的一个项目中,我需要在我的脚本中做一个“自定义”脚本。它正在工作,这里有一个小例子:

var object = {test : 10};

var script = document.createElement('script');

var condition = $('div').data('if');

script.innerHTML = 
    'function runIf(){\
        with(object){ \
            try{\
                return '+condition+'? true : false;\
            }catch(err){\
                console.log(err.message);\
                return false;\
            }\
        }\
    }';

document.body.appendChild(script)

$('div').toggle(runIf());

document.body.removeChild(script)

我得到这样的DOM元素的条件:

<div data-if='test>0'>test</div>

在这里测试它:http: //jsfiddle.net/nb234/2/

但是现在,我想知道是否可以在不向 HTML 附加内容的情况下获得相同的结果。我不能创建脚本标签(或字符串形式的函数)并运行它吗?

编辑:

我做了另一个例子,希望它有助于理解:http: //jsfiddle.net/nb234/4/

4

4 回答 4

1

您可以使用

eval(string_with_code);

执行你的字符串函数。

于 2013-09-27T18:59:20.273 回答
0

您当然可以在不将其添加到<body>元素的情况下运行脚本:改为将其添加到<head>元素中。

document.getElementsByTagName('head')[0].appendChild(script);

撇开诡异不谈,将元素添加到 DOM 是动态加载脚本的首选方法,这就是 jQuery$.getScript和 requirejs 等工具将新<script>元素插入 DOM 的原因。

您当然可以在插入后从 DOM 中删除脚本,但这并不是必需的。

于 2013-09-27T18:59:06.303 回答
0

这是利用 javascript 的一流功能的理想场所。无需存储包含 javascript 的字符串,只需在数据中存储一个实际的 javascript 函数并将其用作谓词。

function runIf(predicate) {
    return predicate() ? true : false;
}

function pred() {
    return 1==1;
}

alert(runIf(pred) );

注意:不鼓励使用 with https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with

于 2013-09-27T19:01:50.430 回答
0

您的代码所做的就是这个,它不需要脚本标签、eval 或 with 语句。

$('div').toggle($('div').data('if'));
于 2013-09-27T19:11:35.573 回答