0

所以我有了这个程序,我花了一段时间才弄清楚如何动态创建对象。根据其他统计数据。无论如何,我想知道为什么这实际上有效。它为每个 td 创建一个对象。例如,目前它有 100 个 td 元素。我希望能够为每个 td 分离信息,并能够根据 tds id # 访问它。其中工作正常。

为什么对象可以像任何其他对象一样访问?

我对它为什么起作用的部分感到困惑。我知道它确实大声笑。

无论如何,这是我的代码......它放在/body之前的html文档的末尾。

<script>
    (function (){
    var list = document.getElementsByTagName("td");
    var number = 0;
    var text = '';
    text += '<script>';
    text += 'var plots = {\r';

    while (number <= list.length - 1) {
        text += number + ' : {\rstamp : 0\r';
        if (number >= list.length - 1) {
            text += '}}\r';
            number++
        } else(text += '},\r');
        number++
    }
    text += '</\script>';
    document.write(text);
    })();
</script>

再说一次,如果你能帮助我理解,为什么这些工作就像我硬编码的对象一样???

基本上,我制作了一个脚本来制作脚本……对我来说有点奇怪。

顺便说一句,\r 只是为了在控制台中查看源代码时使其更具可读性。没有其他原因。当然不需要它们。

想知道为什么删除了 3dgoo (function (){ 在那里并且应该在那里,否则它不起作用......谢谢。

4

1 回答 1

3

为什么这些工作就像我硬编码了对象一样???

它起作用的原因在于浏览器如何与脚本标签交互,以及浏览器如何解释 javascript。

当浏览器遇到脚本标签时,它的默认行为是执行其中的代码。

这使您可以做一些强大而富有表现力的事情,但也可能是头痛的主要来源。

您所做的实际上是修改 DOM,即代表 HTML 结构的底层对象。您正在向其写入 HTML(在本例中为<script>标签),这会导致浏览器正确呈现内容。由于浏览器的行为是在遇到<script>标签时执行脚本,因此它会执行您的 javascript。当它执行你的 javascript 时,它会创建一个名为“plot”的全局变量,然后可以在全局命名空间中访问该变量。

这使您可以执行完全相同的操作,但无需 document.write。

var plot = (function () {
    var list = document.getElementsByTagName("td");

    var plots = {};

    for(var i = 0; i < list.length; ++i) {
      plots[i] = {'stamp': 0};    
    }

    return plots;
})();

这个plunker显示了上述代码的交互式示例。请注意,脚本标签位于正文标签中。

编辑添加,来自评论:

是的,在运行时会解析 javascript,但是当重新评估 DOM 时,会导致执行任何新的 javascript。已经执行的代码或已经触发的事件将不会再次执行。

于 2013-06-03T04:19:15.967 回答