【问题标题】:JS Display none with PHP foreach only working with first elemntJS 不显示 PHP foreach 仅使用第一个元素
【发布时间】:2020-09-14 11:55:01
【问题描述】:

我正在使用带有 PHP foreach 循环的 ORDER BY RAND() 从数据库中获取文章:

<?php foreach($posts as $post): ?>
    <div class="post" id="post">
        <article>
            <div class="post-head">
                <a href="<?php echo ROUTE; ?>/profile.php/<?php echo $post['user_id']; ?>">
                    <img class="post-pfp" src="<?php echo ROUTE; ?>/users_pics/<?php echo ($post['profile_pic']); ?>">
                </a>

                <h1>
                    <a class="links-3" href="<?php echo ROUTE; ?>/profile.php?user=<?php echo $post['user_id']; ?>"><?php echo $post['post_by']; ?></a>
                </h1>
                
                <p class="post-date"><?php echo get_date($post['date']); ?></p>

                <div class="x_hover" onclick="hide_post()">
                    <img src="<?php echo ROUTE; ?>/icons/cross.svg">
                </div>

                <hr id="post-hr">

                <br>

                <a href="<?php echo ROUTE; ?>/post.php?p=<?php echo $post['ID']; ?>">
                    <p class="post-content"><?php echo $post['content']; ?></p>
                </a>
            </div>
        </article>
    </div>
<?php endforeach; ?>

如你所见,x_hover 类的 div 有一个 onclick 属性:

<div class="x_hover" onclick="hide_post()">
    <img src="<?php echo ROUTE; ?>/icons/cross.svg">
</div>

hide_post() 函数的作用是这样的:

var post = document.getElementsByClassName("post");

function hide_post(){
    if (post[0].style.display = "block") {
        post[0].style.display = "none"
    }
}

我是 JS 新手,所以我也有一些问题。

我们声明var post等于所有类名为“post”的元素,比如我开头添加的HTML代码,有post这个类:

&lt;div class="post" id="post"&gt;

此 div 具有 display: block; 属性。但是,当我运行所有这些代码时,它只会变成display: none 将我们从数据库中带入的第一个元素,它不适用于其余的元素......

为什么会这样?

【问题讨论】:

    标签: javascript php html css


    【解决方案1】:

    ID 必须是唯一的,并且由于您已命名所有 post,因此只有第一个会被“看到”。使 ID 唯一,更改您的 hide_post 函数以接受要隐藏的 ID 名称,并将唯一 ID 添加到您的 onclick 调用中。

    改变

    <div class="post" id="post">
    

    类似

    <div class="post" id="post<?php echo $post['ID']; ?>">
    

    然后改变

    <div class="x_hover" onclick="hide_post()">
    

    <div class="x_hover" onclick="hide_post('post<?php echo $post['ID']; ?>')">
    

    最后,修改 hide_post 函数以接受要显示或隐藏的 ID 名称。

    function hide_post(idToHide){
        if (idToHide.style.display = "block") {
            idToHide.style.display = "none"
        }
    }
    

    【讨论】:

    • 对不起,我是 JS 的新手……你对 ID 是什么意思?如何更改我的函数以接受 ID 名称?我是 JS 新手。
    • 我修改了我的答案,应该为您指明正确的方向。
    • 好的,但是 var post 将等于什么?我的代码是这样的:var post = document.querySelectorAll('.post'); function hide_post(idToHide){ if (idToHide.style.display = "block") { idToHide.style.display = "none" } } Tha var post 会等于别的东西吗?请帮忙
    【解决方案2】:

    当您使用getElementsByClassName 时,它会返回一个HTMLCollection。如果这是您的意图,您应该迭代元素并隐藏所有元素。现在你只是隐藏了这个集合的第 0 个元素。

    var posts = document.getElementsByClassName("post");
    
    for (let post of posts) {
        if (post.style.display = "block") {
            post.style.display = "none"
        }
    }
    

    如果您打算隐藏单个帖子,请为 div 提供唯一 ID,并使用该帖子的 ID 调用 hide_post。您也应该为此使用getElementById。请注意,它不是复数。函数应该是这样的:

    function hide_post(postId){
        var post = document.getElementById(postId);
    
        if (post.style.display = "block") {
            post.style.display = "none"
        }
    }
    

    【讨论】:

    • 我确实这样做了,但是现在当我检查终端时,它会标记:Uncaught TypeError: Cannot read property 'style' of null at hide_post at HTMLDivElement.onclick 我该怎么办?我还将数据库中的唯一 ID 分配给了 div...
    • 您是否像戴夫所说的那样使用 id 调用函数? &lt;div class="x_hover" onclick="hide_post('post&lt;?php echo $post['ID']; ?&gt;')"&gt;。 js 函数中的console.log(postId) 是什么?
    • 哦,现在它开始工作了!我没有在document.getElementsByClassName("post"); 上正确设置类名
    【解决方案3】:

    一种更清洁的方法是。

    function hide_post() {
    document.querySelectorAll('.post').forEach(v => {
    if(v.style.display == block) v.style.display = none; }); }
    

    【讨论】:

    • 搜索所有具有类 post 的元素并循环遍历每个元素,如果显示样式为块则不显示
    • 据我所知,它应该是这样的:'function hide_post() { document.querySelectorAll('.post').forEach(v => { if(v.style.display == block ) v.style.display = none; }); } ' 应该是这样的吗?没看清楚……
    • 是的,对不起,我忘了把功能键放在前面
    • 我这样做了:function hide_post() { document.querySelectorAll('.post').forEach(v =&gt; {if(v.style.display ==" block") v.style.display = "none"; }); }
    • 好吧,当我点击它时,它不起作用,它什么也没做:/我的代码是一样的,在终端中,它没有给出任何错误或什么的。 ..这是怎么回事?
    猜你喜欢
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    相关资源
    最近更新 更多