3

Javascriptの問題で私を助けてくれる人はいますか? サイトの投稿展開機能を作成しようとしていますが、何らかの理由で最初の投稿を展開すると、2 番目の投稿が展開されなくなり、代わりにスレッド ページの完全な投稿にリダイレクトされます。2 番目の投稿を展開し、次に最初の投稿を展開しても、問題はありません。

ページが読み込まれたときに実行されるコードは次のとおりです。

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項目が位置にない可能性があります。その結果、そのプロパティにアクセスするときにエラーをスローする値が発生します。eundefinedfirstElementChild

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 に答える