3

你们中的任何人都可以帮助我解决 Javascript 问题吗?我正在尝试为我的网站编写一个帖子扩展功能,由于某种原因,每当我展开第一个帖子时,第二个帖子将不再展开,而是重定向到主题页面上的完整帖子。如果我展开第二个帖子,然后再展开第一个,我没有问题。

这是加载页面时运行的代码:

function postExpansionPrep(){
    if(!document.body.className){
        var links = document.getElementsByClassName("abbrev");
        for (var i = 0; i < links.length; i++ ){
            (function(e) {
                links[e].firstElementChild.addEventListener("click", function(a){ expandPost(links[e].firstElementChild); a.preventDefault(); }, true);
                console.log(links[e].firstElementChild.href);
            })(i);
        }
    }
}

这是您单击链接以展开帖子时运行的代码。

function expandPost(link){
    if(link.hash){
        $.get(link, function(data) {
            var loadedPost = $(data).find("#reply" + link.hash.replace("#",""));
            document.getElementById("reply" + link.hash.replace("#","")).lastElementChild.innerHTML = $(loadedPost).find("blockquote").last().html();
        });
    }
    else{
        $.get(link, function(data) {
            var loadedPost = $(data).find("#parent" + link.pathname.substring(link.pathname.lastIndexOf("/")+1));
            document.getElementById("parent" + link.pathname.substring(link.pathname.lastIndexOf("/")+1)).lastElementChild.innerHTML = $(loadedPost).find("blockquote").last().html();
        });
    }
}

您可以在此处查看实际问题:http ://www.glauchan.org/test/

顺便说一句,该功能是可选的,因此您需要在 Board Options 菜单中启用 Post Expansion。

4

1 回答 1

5

document.getElementsByClassName方法返回一个活动节点列表。因此,当处理程序被触发时,links将发生变化,并且可能不再有项目在位置e- 导致在访问其属性undefined时引发错误的值。firstElementChild

您不需要从links列表中获取当前元素。a.target通过或只是动态获取它this

function postExpansionPrep() {
    if (document.body.className)
        return;
    var links = document.getElementsByClassName("abbrev");
    for (var i = 0; i < links.length; i++ ) {
        var child = links[i].firstElementChild;
        if (!child) // could be null as well
            continue;
        child.addEventListener("click", function(e) {
            expandPost(this);
            e.preventDefault();
        }, true);
        console.log(child.href);
    }
}

顺便说一句,因为你有可用的 jQuery,你应该使用它,特别是对于附加的事件处理程序:

if (!document.body.className)
    $(".abbrev > :first-child").click(function(e) {
        expandPost(this);
        e.preventDefault();
    });
于 2012-08-03T16:49:42.203 回答