【问题标题】:Where is the circular reference in this code?此代码中的循环引用在哪里?
【发布时间】:2013-01-19 16:11:05
【问题描述】:

我有一个表格,我可以在其中添加图片 onclick。该表是从表单动态创建的。我试图将表保存到本地存储,但我遇到了循环引用问题。我已经读过这个Example of a circular reference in Javascript?,但我是一个完全的新手,很难理解。你能给我指出来吗?

function makeChart() {
        var table = document.createElement('table'),
        taskName = document.getElementById('taskname').value,
        header = document.createElement('th'),
        numDays = document.getElementById('days').value, //columns
        howOften = document.getElementById('times').value, //rows
        row,
        r,
        col,
        c;



    var cel = null;
    var myImages = new Array();
    myImages[0] = "http://www.olsug.org/wiki/images/9/95/Tux-small.png";
    myImages[1] = "http://a2.twimg.com/profile_images/1139237954/just-logo_normal.png";
    var my_div = document.createElement("div");
    my_div.id = "showPics";
    document.body.appendChild(my_div);
    var newList = document.createElement("ul");
    my_div.appendChild(newList);

    if (taskName == '' || numDays == '') {
        alert('Please enter task name and number of days');
    }
    if (howOften == '') {
        howOften = 1;
    }
    if (taskName != '' && numDays != '') {

        for (var i = 0; i < myImages.length; i++) {
            var allImages = new Image();
            allImages.src = myImages[i];
            allImages.onclick = function (e) {
                if (sel !== null) {
                    sel.src = e.target.src;

                    my_div.style.display = 'none';
                    sel.onclick = null;
                    sel = null;
                }
            };

            var li = document.createElement('ul');
            li.appendChild(allImages);
            newList.appendChild(li);
        }
        my_div.style.display = 'none';

        header.innerHTML = taskName;
        table.appendChild(header);

        function addImage(col) {
            var img = new Image();
            img.src = "http://cdn.sstatic.net/stackoverflow/img/tag-adobe.png";
            col.appendChild(img);
            img.onclick = function () {
                my_div.style.display = 'block';
                sel = img;
            };
        }
        for (r = 0; r < howOften; r++) {
            row = table.insertRow(-1);
            for (c = 0; c < numDays; c++) {
                col = row.insertCell(-1);
                addImage(col);
            }
        }
        document.getElementById('holdTable').appendChild(table);
        document.getElementById('createChart').onclick = null;
        console.log(table);
        localStorage.setItem(name, JSON.stringify(table));
        console.log( JSON.parse( localStorage.getItem( table ) ) );
    }
}

【问题讨论】:

  • 所有 DOM 元素都包含循环引用(例如通过parentNode.childNodes…。将它们序列化为 HTML,而不是尝试 JSON 字符串化。

标签: javascript circular-reference


【解决方案1】:

任何 DOM 元素都包含对 parentNodedocument 的引用,您无法对其进行字符串化。事实上,每个元素都拥有一个指向它的父元素的链接,该父元素拥有指向其子元素的链接。

您不能将JSON.stringify 应用于 DOM 元素。

如果您真的想保存表格,可以使用table.innerHTML 保存其 HTML。我们可以提出其他解决方案(甚至有特定的 stringify 实现能够从循环元素或 DOM 节点生成 JSON)。但我们需要知道为什么您尝试将表格保存在 localStorage 中。

【讨论】:

  • 好的,所以如果我理解正确,它会尝试将整个备份 DOM 的方式进行字符串化,所以我应该像这样定位表 localStorage.setItem(name, JSON.stringify(table.innerHTML) ); ?而且我刚刚注意到我应该在最后一个日志中将名称作为键而不是表。
  • 可以这样做,但为什么呢?序列化页面的一部分不是标准做法。
  • 那行得通。该表对不同的用户是唯一的,所以我希望用户在进入页面时看到他们的特定表。我不确定我是否理解您的意思。我应该保存整个页面吗?
  • 不,您不应该保存任何 HTML。难道你的表不能用你可以保存的一小段数据来构建吗?
  • 你说的是cookie还是什么的?
猜你喜欢
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 2022-01-15
  • 2023-03-19
  • 2014-12-15
  • 2017-06-17
  • 1970-01-01
相关资源
最近更新 更多