【问题标题】:Change Div Content with JavaScript, onmouseover and onmouseout?使用 JavaScript、onmouseover 和 onmouseout 更改 Div 内容?
【发布时间】:2013-08-24 15:33:39
【问题描述】:

我有以下代码:

window.onload = function createDivs() { 
    for(var i = 1;i<29;i++) {
        var div = document.createElement("div"); 
        var body = document.getElementsByTagName("body")[0];
        var n1 = document.createTextNode("Cell " + i);
        var n2 = document.createTextNode(i + " Cell");
        div.style.width = "100px";
        div.style.height  = "100px";
        div.style.border = "1px solid red";
        div.style.cssFloat = "left";
        div.style.margin = "1px"
        div.className = i;
        body.appendChild(div);
    }
    div.onmouseover = function() {
        this.appendChild(n1);
    },
    div.onmouseout = function() {
        this.appendChild(n2);
    } 
}

我想要实现的目标

  1. 在每个 div 的鼠标悬停时,该 div 应该有一个单元格 1、单元格 2、..... 直到 cel 28 的文本。但我只是让每个单元格悬停在 Cell 28 上。

2。我也想实现那个onmouseout,单元格应该有“1 cell”作为文本,但它不起作用。

感谢任何帮助。

http://jsbin.com/iXuLEDE/7/edit?html,output

【问题讨论】:

    标签: javascript jquery function dom


    【解决方案1】:

    您的问题来自您对n1n2 的关闭。最简单的解决方案如下。

    从这里:

    div.onmouseover = function() {
        this.appendChild(n1);
    }
    

    到这里:

    div.onmouseover = (function(text) {
          return function () {
              this.innerHTML = text;
          }
    }(n1.textContent));
    

    这样,您使用的是文本节点的副本(通过将其用作函数的参数),而不是稍后作为闭包。

    更新

    只需阅读问题的第二部分,这应该可以:

    div.onmouseover = (function(text) {
        return function() {
            this.innerHTML = text;
        };
    }("Cell " + i));
    div.onmouseout = (function(text) {
        return function() {
            this.innerHTML = text;
        };
    }(i + " Cell"));
    

    使用文本节点

    function createDivs() { 
        for(var i = 1;i<29;i++) {
            var div = document.createElement("div"); 
            var body = document.getElementsByTagName("body")[0];
            div.style.width = "100px";
            div.style.height  = "100px";
            div.style.border = "1px solid red";
            div.style.cssFloat = "left";
            div.style.margin = "1px"
            div.className = i;
            var n1 = document.createTextNode("Cell " + i);
            var n2 = document.createTextNode(i + " Cell");
            body.appendChild(div);
            div.onmouseover = (function(n_text1, n_text2) {
              return function() {
                  if (n_text2.parentNode == this) {
                      this.removeChild(n_text2);
                  }
                  this.appendChild(n_text1);
              };
            }(n1, n2));
            div.onmouseout = (function(n_text1, n_text2) {
              return function() {
                  if (n_text1.parentNode == this) {
                      this.removeChild(n_text1);
                  }
                  this.appendChild(n_text2);
              };
            }(n1, n2));
        }
    }
    

    在这里提琴:http://jsfiddle.net/Mk5e5/

    【讨论】:

    • 感谢您指出关闭。我一直在努力学习闭包。但是使用您的解决方案,我遇到了另一个问题。虽然我可以使用鼠标悬停功能,但是当我使用鼠标悬停时,它会产生另一个问题jsbin.com/iXuLEDE/7/edit 我知道闭包没有问题,但是如何在鼠标悬停时删除文本节点。
    • @Mike 查看更新,我还发布了一个链接到一个工作 jsFiddle(不是 jsbin 的忠实粉丝)。
    • 文本节点方法和上面的有什么区别?你个人更喜欢哪一个?
    • @Mike - 这真的取决于,只要 div 中没有任何其他内容,设置 innerHTML 是更简单的选项。文本节点意味着您不必担心div中是否还有其他孩子。
    • 谢谢,刚刚接受。你提供了一些关于闭包的好信息,我从来没有遇到过这个话题。
    【解决方案2】:

    请改成这样

        window.onload = function createDivs() { 
        for(var i = 1;i<29;i++) {
            var div = document.createElement("div"); 
            div.setAttribute("index", i);
            var body = document.getElementsByTagName("body")[0];
            div.style.width = "100px";
            div.style.height  = "100px";
            div.style.border = "1px solid red";
            div.style.cssFloat = "left";
            div.style.margin = "1px"
            div.className = i;
            body.appendChild(div);
            div.onmouseover = function() {
              var n1 = document.createTextNode("Cell " + this.getAttribute("index"));
              this.appendChild(n1);
    
            } ,
            div.onmouseout = function() {
            var n2 = document.createTextNode(this.getAttribute("index") + " Cell");
              this.appendChild(n2);
    
            } 
    
        }
    }
    

    您应该在循环中为每个div 添加事件

    【讨论】:

    • 这将有与当前代码完全相同的问题。 i 永远是 29。
    【解决方案3】:

    尝试理解 javascript 闭包,特别是在 for 循环中。在这篇博文中查看这个出色的解释:http://www.mennovanslooten.nl/blog/post/62

    将您的 createDivs 函数更改为:

    function createDivs() { 
    
    for(var i = 1;i<29;i++) {
        var div = document.createElement("div"); 
        var body = document.getElementsByTagName("body")[0];
        div.style.width = "100px";
        div.style.height  = "100px";
        div.style.border = "1px solid red";
        div.style.cssFloat = "left";
        div.style.margin = "1px"
        div.className = i;
        body.appendChild(div);
        div.onmouseover = (function(value) { 
            return function() {
                var n1 = document.createTextNode("Cell " + value);
                this.appendChild(n1);
            }
        })(i);
        div.onmouseout = (function(value) { 
            return function() {
                var n2 = document.createTextNode(value + " Cell");
                this.appendChild(n2);
            }
        })(i);
    
    };
    

    };

    【讨论】:

    • 谢谢,但我也想在鼠标移出时删除 n1 节点。有什么想法吗? jsbin.com/iXuLEDE/7/edit
    • 我想对于这个例子,在 onmouseout 函数中,你可以遍历子元素并删除它们,例如: div.onmouseout = (function(value) { return function() { var children = this.childNodes; for(var i=0;i
    【解决方案4】:

    您的代码不起作用,因为当您的 onmouseoveronmouseout 函数被执行时,您的文本变量的值是“单元格 28”。另外,如果我正确理解您的意图,您的孩子被带走有点不对劲。

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset=utf-8 />
    <title>JS Bin</title>
    </head>
    <body>
      <script type="text/javascript">
        function createDivs(n) { 
          for(var i = 1; i <= n; i++) {
            var div = document.createElement("div"); 
            var body = document.getElementsByTagName("body")[0];
    
            div.style.width = "100px";
            div.style.height  = "100px";
            div.style.border = "1px solid red";
            div.style.cssFloat = "left";
            div.style.margin = "1px"
            div.className = i;
            body.appendChild(div);
    
            div.onmouseover = function() {
              if (this.childNodes.length > 0) this.removeChild(this.childNodes[0]);
              var n_text = document.createTextNode("Cell " + this.className);
              this.appendChild(n_text);
            },
            div.onmouseout = function() {
              if (this.childNodes.length > 0) this.removeChild(this.childNodes[0]);
              var n_text = document.createTextNode(this.className + " Cell");
              this.appendChild(n_text);
            }  
          }   
        }
    
        createDivs(28)
    
      </script>
    
    </body>
    </html>
    

    我还更改了您的 if 语句,以便您传递所需的单元格数量而不是单元格数量 +1。

    【讨论】:

    • 如果您使用 innerHTML 而不是使用儿童作为文本,这也会更容易,但我将儿童保留在那里,因为我认为您以后可能会使用比文本更多的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多