【问题标题】:How to run a script embedded as an attribute in a DOM element?如何运行作为属性嵌入到 DOM 元素中的脚本?
【发布时间】:2011-12-31 21:55:51
【问题描述】:

我正在使用一个名为 d3 的出色可视化库,我发现自己的代码看起来非常像以下代码:

<span id="sparkline"></span>
<script type="text/javascript">
  drawSparkline('#target', [10, 20, 30, 40]);
  // or
  drawSparkline('#target', 'http://data.com/location'));
</script>

有没有办法通过将直接作用于 dom 元素的代码作为属性嵌入来使其更具表现力?也许是这样的:

<span onload="drawSparkline(this, [10, 20, 30, 40])"></span>
<span onload="drawSparkline(this, 'http://data.com/location')"></span>

可能是这样的:

<span data-onload="drawSparkline(this, [10, 20, 30, 40])"></span> 

在 jQuery 的开头有一些东西,比如:

$(document).ready(function() {
  $('*[data-onload]').each( eval the onload? );
});

什么是合适的方式?

【问题讨论】:

    标签: javascript jquery dom d3.js


    【解决方案1】:

    我会更明确地说明您正在编码的不同类型的数据:

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

    如果您想节省一些时间并让它们在 IE 中工作,我还建议您查看 Sparky(它是 on github)。 :)

    【讨论】:

      【解决方案2】:

      您可以使用这样的类来识别跨度,而不是使用 eval:

      <span class="sparkLine" data-sparkdata="[10, 20, 30, 40]"></span>
      <span class="sparkLine" data-sparkdata="http://data.com/location"></span>
      

      然后,使用 jQuery:

      $(document).ready(function() {
         $('.sparkLine').each( function(){
            drawSparkline(this, $(this).data("sparkdata"));
         });
      });
      

      【讨论】:

      • 有时是迷你图,有时是迷你饼图。为所有人上课似乎很奇怪。
      • 哦,好吧,您可以使用 $('[data-sparkdata]') 代替 $('.sparkLine') 并且相同的代码可以工作(或者,如果可以的话,$("某事").find('[data-sparkdata]'))
      • 我认为这是一个很好的方法,但请注意,您从属性中获取字符串,因此在数组情况下,您需要执行类似JSON.parse($(this).data(sparkdata)) 的操作。
      • 我正在测试这种方法,但我真的很想有一些适用于任何 javascript sn-p 的东西。除非我能找到更安全的东西,否则我可能不得不使用 eval 版本。
      • @nrabinowitz jQuery 自己做,检查这个goo.gl/5Z7mV。我不知道它是否可以帮助您,但您可以添加一个可以作为方法本身的属性,然后使用它,快速示例:window[jQuert("#something").data("method")]()
      猜你喜欢
      • 2014-04-06
      • 1970-01-01
      • 2012-04-19
      • 2016-08-12
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 2018-01-23
      • 2012-12-17
      相关资源
      最近更新 更多