Javascript 如何运行作为DOM元素中的属性嵌入的脚本?
我正在使用一个名为d3的强大可视化库,我发现自己的代码与下面的代码非常相似:Javascript 如何运行作为DOM元素中的属性嵌入的脚本?,javascript,jquery,dom,d3.js,Javascript,Jquery,Dom,D3.js,我正在使用一个名为d3的强大可视化库,我发现自己的代码与下面的代码非常相似: <span id="sparkline"></span> <script type="text/javascript"> drawSparkline('#target', [10, 20, 30, 40]); // or drawSparkline('#target', 'http://data.com/location')); </script> 合适的方
<span id="sparkline"></span>
<script type="text/javascript">
drawSparkline('#target', [10, 20, 30, 40]);
// or
drawSparkline('#target', 'http://data.com/location'));
</script>
合适的方法是什么?不使用eval,您可以使用以下类来识别跨度:
<span onload="drawSparkline(this, [10, 20, 30, 40])"></span>
<span onload="drawSparkline(this, 'http://data.com/location')"></span>
<span class="sparkLine" data-sparkdata="[10, 20, 30, 40]"></span>
<span class="sparkLine" data-sparkdata="http://data.com/location"></span>
我会更明确地说明您正在编码的不同类型的数据:
<span class="sparkline" data-values="10,20,30,40"></span>
<span class="sparkline" data-url="http://data.com/location"></span>
如果你想节省一些时间并让它们在IE中工作,我还建议你检查一下(它是:)有时是迷你饼图,有时是迷你饼图。为所有这些类都提供类似乎很奇怪。哦,好吧,您可以使用$('[data sparkdata]')而不是$('.sparkLine'),同样的代码也可以工作(或者,如果可以的话,$('something')。find('[data sparkdata]'))我认为这是一种非常好的方法,但是请注意,您从属性中获得了一个字符串,因此,在数组的情况下,您需要执行类似于
JSON.parse($(this.data(sparkdata))
的操作。我正在测试这种方法,但我真的希望有一些东西可以用于任何javascript片段。除非我能找到更安全的东西,否则我可能不得不使用eval版本。@nrabinowitz jQuery自己做的,检查这个。我不知道它是否能帮助您,但您可以添加一个可以作为方法本身的属性,然后使用该属性,快速示例:window[jQuert(“#something”).data(“method”)()
<span class="sparkLine" data-sparkdata="[10, 20, 30, 40]"></span>
<span class="sparkLine" data-sparkdata="http://data.com/location"></span>
$(document).ready(function() {
$('.sparkLine').each( function(){
drawSparkline(this, $(this).data("sparkdata"));
});
});
<span class="sparkline" data-values="10,20,30,40"></span>
<span class="sparkline" data-url="http://data.com/location"></span>
$(".sparkline").each(function() {
var $source = $(this),
values = $source.data("values"),
url = $source.data("url");
if (values) {
// JSON.parse() is okay too, but if you're just
// encoding lists of numbers this will be faster
var data = values.split(", ").map(parseFloat);
drawSparkline(this, data);
} else if (url) {
var that = this;
$.ajax(url)
.then(function(data) {
drawSparkline(that, data);
});
}
});