.onclick()仅在第一个按钮上触发

时间:2019-09-15 02:54:32

标签: javascript html ajax

当我单击“显示评论”按钮时,即使我单击了另一个按钮(第二,第三,第四,...按钮),结果也始终仅显示在第一个按钮上。我想要的内容已正确显示,但未显示在相应的按钮上。

我已经尝试过在Internet上搜索解决方案,但是我认为我找不到一个解决方案,尤其是其他使用jQuery回答的解决方案。 (请没有jQuery解决方案)

HTML:

        <div id="card-container" class="posts-card-container">
            <p><strong><em>Press button "Show Posts" above (any user)</em></strong></p>
        </div>

一些script.js:

function showPosts(data) {
    let cardContainer = document.getElementById('card-container').querySelector('p');
    cardContainer.innerHTML = '';
    for (let i = 0; i < data.length; i++) {
        let cardTitle = '<h3>TITLE: '+data[i].title+'</h3>';
        let cardBody = '<p><em>'+data[i].body+'</em><p>'
        let btnShowComments = '<td><button id="button-show-comment" class="button-comments" postId='+data[i].id
        +' onclick="loadComments('+data[i].id+')">Show Comments</button></td>';
        let cardShowComments = '<div id="show-comments"><p></p></div>';
        let newCard = '<div id="card-container" class="child-card-container">'+cardTitle
                    +cardBody+btnShowComments+cardShowComments+'</div>';
        cardContainer.innerHTML += newCard;
    }
}
function showComments(data) {
    let commentContainer = document.getElementById("show-comments");
    commentContainer.innerHTML = '<h2>Comments</h2>';
    for (let i = 0; i < data.length; i++) {
        let commentPoster = data[i].name+' '+'('+data[i].email+')';
        let commentBody = data[i].body;
        let newComment = '<p><strong>'+commentPoster+'</strong><em> commented: 
                        "'+commentBody+'</em></p>';
        commentContainer.innerHTML += newComment;
    }
}

我希望newComment显示在相应的按钮上(例如:如果onclick()发生在第三个按钮上,则newComment必须显示在第三个按钮下),但是在我的代码中,newComment始终仅显示在第一个按钮上。

2 个答案:

答案 0 :(得分:0)

这里的问题是showPosts()中的querySelector()只会提供要查找的适合选择器的元素集中的第一个元素。

这不是您想要的,因此,我们可以将此函数连接到一个事件,在该事件中,我们在包含所有按钮的div周围放置一个onclick事件,并使用event.target选择要使用的按钮。因此,类似:

document.getElementById("card-container").onclick=function showPosts(event)
{
    let data=getData();//put in something like this

    //no needed element checking since only buttons have onclick events
    let cardContainer = event.target;
...
}

但是,您必须以其他方式获取数据才能在函数中使用它。更不用说,您不应在两个不同的元素中使用相同的ID。 ID用于将浏览器定向到单个元素。

答案 1 :(得分:0)

通过定义document.getElementById仅返回一个DOM元素,即找到的第一个DOM元素,即使存在多个具有相同ID的元素也是如此。您应该找到一种选择按钮的不同方法,并且还应该避免具有相同ID的多个元素具有与唯一相同的ID。

编辑:我意识到这并不是您真正要的,但是您仍然应该避免多次使用相同的ID,否则会引起各种问题。

相关问题