【问题标题】:Javascript - Automatically switch/create to another row if a row is filled with 4 cells in a tableJavascript - 如果一行被表格中的 4 个单元格填充,则自动切换/创建到另一行
【发布时间】:2014-05-09 02:09:57
【问题描述】:

我认为标题是不言自明的。我正在使用XMLHttpRequest 检索数据,并且数据被附加到表的列中。我决定只允许一行里面只有 4 列,如果存在另一个项目,那么它应该附加到另一行。这就是我所做的:

//...
//unneccessary
//...
            var album_photos = JSON.parse(xhr2.responseText);
            for(var i = 0; i < album_photos.length; i++) {
                if(!isInArray(album_photos[i].Image_ID, image_ids)) {
                    var tr = document.getElementById("tiare");
                    if(i % 4 == 0) {
                        tr = document.createElement("tr");
                        document.getElementById("images").appendChild(tr);

                    }
//...
//creating elements to be append
//...
                    tr.appendChild(td);
                    td.appendChild(imagewrap);
                    imagewrap.appendChild(imagemenu);
                    imagemenu.appendChild(imagemenuimg1);
                    imagemenu.appendChild(imagemenuimg2);
                    imagewrap.appendChild(imagewrapimg);
                    image_ids.push(album_photos[i].Image_ID);
//...![enter image description here][1]
//unneccessary
//...

这是标记:

<table width="80%" id="images">
    <tr id="tiare">

    </tr>
</table>

看看它是如何没有被正确分割的:

我怎么能做到这一点,我的逻辑根本不起作用!我该怎么办?

P.S:不允许使用 jQuery 解决方案。 :)

任何帮助将不胜感激。提前致谢。 :)

更新:我将代码更改为:

function getAlbumImages() {
    var xhr2 = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
    xhr2.open('GET', 'admin/images_data.php');

    xhr2.onreadystatechange = function(e) {
        if(xhr2.readyState == 4 && xhr2.status == 200) {
            var oldtable = document.getElementById("images");
            var newtable = oldtable.cloneNode();
            var tr = document.createElement("tr");

            var album_photos = JSON.parse(xhr2.responseText);
            for(var i = 0; i < album_photos.length; i++) {
                if(!isInArray(album_photos[i].Image_ID, image_ids)) {
                    if(i%4 == 0 && i != 0){
                        newtable.appendChild(tr);
                        tr = document.createElement('tr');        
                    }
                    var td = document.createElement('td');
                    var imagewrap = document.createElement('div');
                    imagewrap.className = "image-wrap";
                        var imagemenu = document.createElement('div');
                        imagemenu.className = "image-menu";
                            var imagemenuimg1 = document.createElement('img');
                            imagemenuimg1.src = "img/edit_img.png";
                            var imagemenuimg2 = document.createElement('img');
                            imagemenuimg2.src = "img/close.png";
                        var imagewrapimg = document.createElement('img');
                        imagewrapimg.className = "thumbnail";
                        imagewrapimg.src = "admin/album_photos/" + album_photos[i].Image_Path;
                        imagewrapimg.onclick = function() { showBigImage(this); };
                    tr.appendChild(td);
                    td.appendChild(imagewrap);
                    imagewrap.appendChild(imagemenu);
                    imagemenu.appendChild(imagemenuimg1);
                    imagemenu.appendChild(imagemenuimg2);
                    imagewrap.appendChild(imagewrapimg);
                    image_ids.push(album_photos[i].Image_ID);
                } else {
                    continue;
                }
            }
            newtable.appendChild(tr);
            oldtable.parentNode.replaceChild(newtable, oldtable);
        }
    }
    xhr2.send(null);
}

此函数在 setInterval 内调用,间隔 5000 毫秒。

现在出现的问题是它会在 5 秒后消失。我该如何解决?

【问题讨论】:

  • 您能描述一下您当前的代码出错的地方吗?您能否展示一下 HTML 在您的表格中的一般情况?

标签: javascript html css xmlhttprequest


【解决方案1】:

我看到的第一个问题是ii % 4 不是您表中的图像,而是返回数据中的图像。一旦您遇到阵列中已有的图像,两者就会有所不同。您需要为i % 4 使用索引,即表中的实际图像数。您可以单独计算您初始化的表中有多少图像:

var imageCnt = document.getElementById("images").getElementsByTagName("td").length

而且,每次您将图像添加到表中然后检查%imageCnt % 4 以决定何时添加新行时的增量。

那么,您不想将图像添加到表格的最后一行,而不是表格的第一行,因为那是额外的插槽所在的位置以及新的空行所在的位置。当您刚刚创建新行时,您将在最后一行添加图像,但当您开始时最后一行被部分填充时不会。在这种情况下,您会将图像添加到第一行。你可以从最后一行开始

var table = document.getElementById("images");
var lastRow = table.rows[table.rows.length - 1];

将这些应用于您的第一个代码示例将如下所示:

//...
//unneccessary
//...
            var album_photos = JSON.parse(xhr2.responseText);
            var table = document.getElementById("images");
            var tableBody = table.getElementsByTagName("tbody")[0];
            var lastRow = table.rows[table.rows.length - 1];
            // initialize cell count
            var cellCount = table.getElementsByTagName("td").length;
            for(var i = 0; i < album_photos.length; i++) {
                if(!isInArray(album_photos[i].Image_ID, image_ids)) {
                    if (cellCount % 4 == 0 && cellCount !== 0) {
                        // make new row and append it to the table body
                        lastRow = document.createElement("tr");
                        tableBody.appendChild(lastRow);
                    }
//...
//creating elements to be append
//...
                    td.appendChild(imagewrap);
                    imagewrap.appendChild(imagemenu);
                    imagemenu.appendChild(imagemenuimg1);
                    imagemenu.appendChild(imagemenuimg2);
                    imagewrap.appendChild(imagewrapimg);
                    // best to append the new cell when it's fully formed
                    lastRow.appendChild(td);
                    ++cellCount;
                    image_ids.push(album_photos[i].Image_ID);
//...![enter image description here][1]
//unneccessary

【讨论】:

  • @MohammadAreebSiddiqui - 我不知道你现在想做什么。每当您开始时,您都在克隆原始表?为什么?我没有看到您在我的回答中解决了这两个问题。您没有对表格中的实际图像进行计数,也没有开始在现有表格的最后一行插入图像。
  • @MohammadAreebSiddiqui - 添加了修改代码的示例。
  • "Uncaught TypeError: Cannot call method 'appendChild' of undefined" 这就是我得到的。 :)
  • @MohammadAreebSiddiqui - 在哪一行代码上?您了解我在回答中描述的两个问题吗?
  • lastRow.appendChild(td);但是现在当我也反转我的标记时。它不能解决问题。
猜你喜欢
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
相关资源
最近更新 更多