【问题标题】:How would I properly implement onclick using childnodes to make a div disappear?如何使用子节点正确实现 onclick 以使 div 消失?
【发布时间】:2015-04-02 02:24:38
【问题描述】:

我昨天问了一个问题,但它跑题了,我已经解决了代码以通过悬停实现我想要的目标,但现在我希望每个被点击的 div 都变得透明。我知道的问题是我在 Dreamweaver 而不是 phpstorm 中工作,我不确定我使用的命令是否有效。我的 html 在这里:

<!DOCTYPE html>
<html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="category">

            <div class="content">
            </div>

            <div class="content">
            </div>

            <div class="content">
            </div>

            <div class="content">
            </div>

            <div class="content">
            </div>

        </div>

    <style>
        div { background-color: springgreen; }
        div { width: 100px; }
        div { height: 100px; }
    </style>

</body>
<script src="js/main.js"></script>
</html>

和javascript:

/**
* Created by Mark M. on 3/28/2015.
*
*/

 var category = document.getElementById("category");
 for (var child = category.firstChild; child != null; child =    child.nextSibling) {
  if (child.nodeType == 1 && child.className == "content") {
    child.onmouseover = function() {
        this.style.width = "150px";
        this.style.height = "150px"
    };

    child.onmouseout = function() {
        this.style.width = "100px";
        this.style.height = "100px"
    };

    child.onmouseclick= function() {
        //disappear
        this.style.backgroundColor = "transparent";


    }
}}

【问题讨论】:

  • 你能做这个吗?
  • 纯原生JS或者jquery好吗?
  • 标记无效,脚本元素必须在头部或正文内。如果您只想处理属于 category 子级的 div 元素,选择器可能是更好的选择。
  • 如果你真的想在不影响布局的情况下让 div 消失,那么this.style.visibility = 'hidden' 将完成这项工作。或者,如果您希望他们根本不占用任何空间,请使用this.style.display = 'none'。但是最好通过添加类值和通过删除类来删除效果来应用两者。
  • 我想使用纯原生js,抱歉回复晚了。

标签: javascript html transparency children child-nodes


【解决方案1】:

对于您的问题,这应该是一个优雅的解决方案。点击“运行代码片段”查看:

var contentDivs = document.getElementsByClassName('content');

for(var i = 0; i < contentDivs.length; i++) {
    var div = contentDivs[i];
    div.onclick = function(){
        this.style.display = 'none';
    }
}
div {background-color: springgreen; width: 100px; height: 100px;}
<div id="category">
    <div class="content">Content 1</div>
    <div class="content">Content 2</div>
    <div class="content">Content 3</div>
    <div class="content">Content 4</div>
    <div class="content">Content 5</div>
</div>

【讨论】:

  • 很好的解决方案,但最好将样式声明放在一条规则上,而不是 3 条。;-)
  • 感谢您的反馈,我只是从问题中复制它。已编辑。
【解决方案2】:

试试这个:

HTML

<div id="category">
    <div class="content"></div>
    <div class="content"></div>
    <div class="content"></div>
    <div class="content"></div>
    <div class="content"></div>
</div>

JavaScript

var arrContent = document.querySelectorAll("#category div.content");
for(i =0; i< arrContent.length; i++){
    var child = arrContent[i];
    console.log(child)
    if (child.nodeType == 1 ) {
        child.onmouseover = function() {
            this.style.width = "150px";
            this.style.height = "150px"
        };

        child.onmouseout = function() {
            this.style.width = "100px";
            this.style.height = "100px"
        };

        child.onclick= function() {
            this.style.backgroundColor  = "transparent";
        }
    }
}`

样式表

div.content {background-color: springgreen;width: 100px;height: 100px;}

var arrContent = document.querySelectorAll("#category div.content");
for(i =0; i< arrContent.length; i++){
var child = arrContent[i];
console.log(child)
if (child.nodeType == 1 ) {
    child.onmouseover = function() {
        this.style.width = "150px";
        this.style.height = "150px"
    };

    child.onmouseout = function() {
        this.style.width = "100px";
        this.style.height = "100px"
    };

    child.onclick= function() {
        this.style.backgroundColor  = "transparent";
    }
}
}
div.content {background-color: springgreen;width: 100px;height: 100px;}
<div id="category">
<div class="content"></div>
<div class="content"></div>
<div class="content"></div>
<div class="content"></div>
<div class="content"></div>
</div>

【讨论】:

  • 这样就达到了预期的效果。我一直在尝试对每个人的帖子发表评论,但没想到会有这么多帮助,我很感激,并尝试了人们发布它的各种不同方式。
【解决方案3】:

问题是您使用的是“onmouseclick”而不是“onclick”

如何使用document.getElementsByClassName('content')addEventListener() 而不是使用'onX' 语法。我相信 addEventListener 更符合标准,应该提供更好的浏览器兼容性。

https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName

https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener

var content = document.getElementsByClassName('content');
console.log('content found', content);
for (var i = 0; i < content.length; i+=1){
  content[i].addEventListener("click", function(){
    this.style.backgroundColor = "transparent";
  });
}

【讨论】:

  • 或者var content = document.querySelectorAll('#category &gt; div')。 ;-)
  • 是的,我正要添加 querySelectorAll 建议。你打败了我 :) developer.mozilla.org/en-US/docs/Web/API/Document/…
  • 或者可能是var content = document.querySelectorAll('#category &gt; div.content'):P
  • 我可能会使用事件委托并在 content 上放置一个侦听器。
  • 我同意使用事件委托davidwalsh.name/event-delegate,如果我们谈论的是非常非常长的 .content 项目列表。在大多数情况下,我怀疑它是否会产生任何实际影响:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多