jquery - 克隆 Html 表行并显示 DIV 菜单

标签 jquery

我有一个包含多行的 HTML 表格。如果将鼠标悬停在该行上,则会显示一个上下文菜单,允许添加或删除行。

当您添加行时,我克隆现有行并添加到表中。这工作正常!问题是当我将鼠标悬停在新行上时,它会在错误的位置显示菜单。该位置与我最初克隆的行有关!它甚至返回与克隆的原始行相关的错误的顶部和左侧位置。

任何想法!

不确定这是否有帮助,但这里有一些代码:

function addOptionRow(rowToBeAdded,rowId) {

    var searchClass = "TBLCONTENTS";

    var rows = $("#" + rowId).parent().children("tr");
    var rowCount = rows.length;

    for(i=0;i<rows.length;i++) {

        if ($(rows[i]).attr('class') != searchClass && $(rows[i]).prev().attr('class') == searchClass) {

            rowToBeAdded.attr("id", getRandomString()); 
            $(rows[i]).before(rowToBeAdded.clone());
        }
    }
}

菜单显示代码如下:

function OnMouseOver(obj) { // obj is row which is passed in

    var top = 0;
    var left = 0;
    var id = "#" + obj.id;   

    currTemplateRow = obj.parentElement.parentElement;

    var pos = $(id).position();
    top = pos.top - 5;
    left = pos.left - 5;

    $("#menuToolsetTemplate").css(
            { position: "absolute",
                top: top + "px",
                left: left + "px"
            }
        ).show();  

}

最佳答案

您可能从错误的方向看待它。

  • HTML = 结构
  • JavaScript = 行为
  • CSS = 设计

不要越界!这严格来说是一个 CSS 问题。

您可能使用某种 JavaScript 来动态设置菜单的顶部和左侧值,但由于您克隆了该元素,菜单的旧位置仍然保留。

您应该做的是定位父级,即行,如下所示:

position: relative;

然后,任何 position:absolute 元素都将与最近定位的父元素相关

然后您就可以为所有上下文菜单使用单一一致的样式。

<强> Here's a working example

完整代码:

<!DOCTYPE HTML>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
    <script>
        $(function () {

            var $menu = $("<div class=menu>Menu</div>"),                //Create a single menu
                $td;
            $('table tr:nth-child(1) td:nth-child(1)').append($menu);   //Append it to the first by default, it won't appear until hovered.
            $('table tr').hover(function () {                           //When hovered...
                $td = $(this).find("td:nth-child(1)");                  //Find the first table cell in the row
                $('.menu').fadeOut(function () {                        //Fade out the existing menu, and when it ends...
                    $td.append($menu);                                  //Move it to the hovered row
                    $('.menu').fadeIn();                                //Fade it back in
                });

            }, function () { //When going out of hover
                $('.menu', this).fadeOut(); //Fade the menu out.
            });
        });
    </script>
    <style type="text/css">
        table {
            border-collapse: collapse;
        }

        table .menu {
            display:    none;
            position:   absolute;
            top:        2px;
            left:       2px;
            background: red;
        }

        table td:nth-child(1) {
            position: relative;
        }
    </style>
</head>
<body>

<table>
    <tr>
        <td>blah</td>
        <td>blah</td>
        <td>blah</td>
    </tr>
    <tr>
        <td>blah</td>
        <td>blah</td>
        <td>blah</td>
    </tr>
    <tr>
        <td>blah</td>
        <td>blah</td>
        <td>blah</td>
    </tr>
</table>

</body>
</html>

请注意,我没有在此示例中包含行添加部分,因为这并不重要,只需将 .menu (或任何您所说的)元素附加到第一个 td,并看到我不需要重新计算它的位置(我没有在任何地方这样做)。因为它与定位的父级(也称为该行的第一个 TD)相关联,所以它是相对于该父级定位的。

更新:

  • 更新了代码,始终只创建一个元素,并在行之间传递。

关于jquery - 克隆 Html 表行并显示 DIV 菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9219050/

相关文章:

jquery - Materialize 和 jquery 事件 onChange

javascript - jquery Tab 内容放置问题

javascript - 无法在同一类的另一个方法中使用 'this' 关键字来调用方法

javascript - 如何检查 div 中是否有任何内容可见

javascript - 仅运行一次获取的脚本

Javascript 和 CSS,在 HTML 中与在外部文件中

jquery - AJAX jquery值自动递增

javascript - HTML 5 模式深层链接和刷新不起作用 AngularJS

jquery - 如何在不显示 :table-cell 的情况下垂直对齐另一个 div 内的 div

javascript - ios5 iPad 的功能无法正常工作