Javascript .append()方法只追加一半的项 var sitename=”http://127.0.0.1:8000/"; var ajaxhot=document.getElementById(“hotajax”); var ajaxpopular=document.getElementById(“popularjax”); var ajaxtoday=document.getElementById(“todayajax”); var ajaxcurrent=document.getElementById(“部分索引”); var ajaxindex=document.getElementById(“ajax索引”); 函数索引jaxfunc(ajaxbutton,getfrom){ ajaxbutton.addEventListener(“单击”),函数(){ var getnew=newXMLHttpRequest(); var parser=新的DOMParser(); 打开(“GET”,sitename+getfrom); getnew.onload=函数(){ var newtitlespagestring=getnew.responseText; var newtitlespage=parser.parseFromString(newtitlespagestring,“text/html”); var newtitles=newtitlespage.getElementById(“内容体”).children[1]; ajaxcurrent.children[0]。children[0]。innerHTML=newtitlespage.getElementById(“内容正文”)。children[0]。innerHTML; while(ajaxindex.hasChildNodes()){ ajaxindex.removeChild(ajaxindex.lastChild) } console.log(newtitles.childElementCount); for(i=0;i While语句删除所有子项

Javascript .append()方法只追加一半的项 var sitename=”http://127.0.0.1:8000/"; var ajaxhot=document.getElementById(“hotajax”); var ajaxpopular=document.getElementById(“popularjax”); var ajaxtoday=document.getElementById(“todayajax”); var ajaxcurrent=document.getElementById(“部分索引”); var ajaxindex=document.getElementById(“ajax索引”); 函数索引jaxfunc(ajaxbutton,getfrom){ ajaxbutton.addEventListener(“单击”),函数(){ var getnew=newXMLHttpRequest(); var parser=新的DOMParser(); 打开(“GET”,sitename+getfrom); getnew.onload=函数(){ var newtitlespagestring=getnew.responseText; var newtitlespage=parser.parseFromString(newtitlespagestring,“text/html”); var newtitles=newtitlespage.getElementById(“内容体”).children[1]; ajaxcurrent.children[0]。children[0]。innerHTML=newtitlespage.getElementById(“内容正文”)。children[0]。innerHTML; while(ajaxindex.hasChildNodes()){ ajaxindex.removeChild(ajaxindex.lastChild) } console.log(newtitles.childElementCount); for(i=0;i While语句删除所有子项,javascript,ajax,Javascript,Ajax,--->Console记录新的标题计数,该计数为25(热门和今日)或4(热门) --->然后,下一个语句应该将所有标题附加到ajaxindex,但它只附加其中的一半,25个标题中的13个或4个标题中的2个 如果我稍微修改一下代码并将其更改为 var sitename = "http://127.0.0.1:8000/"; var ajaxhot = document.getElementById("hotajax"); var ajaxpopular = document.getElementB

--->Console记录新的标题计数,该计数为25(热门和今日)或4(热门)

--->然后,下一个语句应该将所有标题附加到ajaxindex,但它只附加其中的一半,25个标题中的13个或4个标题中的2个

如果我稍微修改一下代码并将其更改为

var sitename = "http://127.0.0.1:8000/";
var ajaxhot = document.getElementById("hotajax");
var ajaxpopular = document.getElementById("popularajax");
var ajaxtoday = document.getElementById("todayajax");
var ajaxcurrent = document.getElementById("partial-index");
var ajaxindex = document.getElementById("ajax-index");

function indexajaxfunc(ajaxbutton, getfrom) {
    ajaxbutton.addEventListener("click", function () {
        var getnew = new XMLHttpRequest();
        var parser = new DOMParser();
        getnew.open("GET", sitename + getfrom);
        getnew.onload = function () {
            var newtitlespagestring = getnew.responseText;
            var newtitlespage = parser.parseFromString(newtitlespagestring, "text/html");
            var newtitles = newtitlespage.getElementById("content-body").children[1];
            ajaxcurrent.children[0].children[0].innerHTML = newtitlespage.getElementById("content-body").children[0].innerHTML;
            while (ajaxindex.hasChildNodes()) {
                ajaxindex.removeChild(ajaxindex.lastChild)
            }
            console.log(newtitles.childElementCount);
            for(i=0; i<newtitles.childElementCount; i++) {
                ajaxindex.append(newtitles.children[i])
            }
        };
        getnew.send();
    });
}

indexajaxfunc(ajaxhot, "titles/hot/");
indexajaxfunc(ajaxpopular, "titles/popular/");
indexajaxfunc(ajaxtoday, "titles/today/");

for(i=0;i一个DOM节点不能同时位于两个DOM树中。当您在循环中调用
.append()
时,它会将节点附加到指定的父节点,并将其从当前父节点中移除。因此,每次递增
i
时,您都会跳过下一个节点

还注意到<代码> .AppEnter()/代码>是在所有浏览器中未实现的实验特性。请考虑使用<代码> .AppDebug()/<代码>。

有几种方法可以解决此问题;一种简单的方法是将
for
循环更改为:

        for(i=0; i<newtitles.childElementCount; i++) {
            console.log(newtitles.children[i]);
            ajaxindex.append(newtitles.children[i]
        }

同样值得注意的是,您在
for
循环中缺少了
var
let
。这当然不是上面
while
循环的问题。

一个DOM节点不能同时位于两个DOM树中。当您调用
.append()时
在循环中,它会将节点附加到指定的父节点,并将其从当前父节点中删除。因此,每次递增
i
时,都会跳过下一个节点

还注意到<代码> .AppEnter()/代码>是在所有浏览器中未实现的实验特性。请考虑使用<代码> .AppDebug()/<代码>。

有几种方法可以解决此问题;一种简单的方法是将
for
循环更改为:

        for(i=0; i<newtitles.childElementCount; i++) {
            console.log(newtitles.children[i]);
            ajaxindex.append(newtitles.children[i]
        }

同样值得注意的是,您在
for
循环中缺少了
var
let
。当然,上面的
while
循环没有问题。

出于好奇,我从for循环中删除了I++并且for和while版本都运行得很好。这是一个非常有洞察力的实验;做得不错。R移动
i++
for
循环转换为与我发布的
循环等价。
newtitles.firstChild
newtitles.children[0]
都是一样的,循环的每次迭代都会从
newtitles
中删除该元素。事实上,如果您检查我答案的修订历史,我首先使用
newtitles.children[0]编写它
然后将其更改为
newtitles.firstChild
以简单起见。出于好奇,我从for循环中删除了I++并且for和while版本都工作得很好。这是一个非常有洞察力的实验;做得很好。删除
I++
for
循环转换为等价于
while
循环I posted.
newtitles.firstChild
newtitles.children[0]
是一回事,循环的每次迭代都会从
newtitles
中删除该元素。事实上,如果您检查我答案的修订历史,我首先使用
newtitles.children[0]编写了它
然后将其更改为
newtitles.firstChild
为简单起见。它有25个(和25个),你能告诉我丢失了哪个吗?在最后一段代码中。哦,那是我在写的,谢谢你它有25个(和25个),你能告诉我是哪个吗)丢失了吗?在最后一段代码中。哦,那是我在飞行中写的,谢谢
while( newtitles.firstChild ) {
    console.log( newtitles.firstChild );
    ajaxindex.appendChild( newtitles.firstChild );
}