Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何运行作为DOM元素中的属性嵌入的脚本?_Javascript_Jquery_Dom_D3.js - Fatal编程技术网

Javascript 如何运行作为DOM元素中的属性嵌入的脚本?

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> 合适的方

我正在使用一个名为d3的强大可视化库,我发现自己的代码与下面的代码非常相似:

<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);
            });
    }
});