gpt4 book ai didi

javascript - 动态创建一个具有动态onclick功能的div

转载 作者:行者123 更新时间:2023-11-30 19:47:01 29 4
gpt4 key购买 nike

上下文:我很懒,我正在尝试动态/自动创建菜单按钮,这些按钮通过原始 JavaScript 超链接到页面的标题。

我的网站从与 document.onload 位于同一文件夹中的外部文件加载正文内容,我正在尝试设置菜单功能,然后应该加载默认页面的菜单项。每次我从一个页面切换到另一个页面时手动加载菜单是有效的,因为我在 loadContents() 末尾包含了 loadMenues(thispage),但是一旦加载页面它就不起作用,因为加载正文内容做。我不明白这种行为。

function setVisible(thisdiv){
var alldivs = document.getElementsByClassName("container");
[].forEach.call(alldivs, function(uniquediv){
document.getElementById(uniquediv.id).style.display = "none";
return;
});
document.getElementById(thisdiv).style.display = "block";
window.scrollTo(0,0);
loadMenues(thisdiv);
}
window.onload = function(){
loadContent("personalinfo");
loadContent("contactdetails");
setVisible("personalinfo");
loadMenues("personalinfo");
}

我正在解释这个次要问题,以便将我的主要问题背景化。

loadContents(file) 是一个从请求的文件中提取内容的函数。每个文件的布局几乎相同,文件的每个部分都由 custompadding div 分隔,其中第一个子元素是 h1 元素,如下所示如下所示:

<html>
<div class="custompadding">
<h1 id="headerpersonaldetails">Personal details</h1>
<p>Lorem ipsum</p>
</div>
<div class="custompadding">
<h1 id="headercontactdetails">Contact details</h1>
<p>Lorem ipsum</p>
</div>
</html>

我正在尝试为这些标题中的每一个设置一个菜单项,它会滚动到单击的标题。手动设置每个菜单项都按预期工作,但我想将其自动化,因此更改任何文件都会自动将菜单项添加到我们更改的任何页面。以下是将这些元素添加到除数的代码,但我在处理 onclick 函数时遇到问题。

function loadMenues(file) {
var rightmenu = document.getElementById("right-menu");
while(rightmenu.firstChild){
rightmenu.removeChild(rightmenu.firstChild);
}
[].forEach.call(document.getElementById(file).children, function(custompaddingchild) {
console.log(custompaddingchild);
headerelement = custompaddingchild.getElementsByTagName("h1")[0]
newbutton = document.createElement("div");
newbutton.setAttribute("class", "menu-item");
let movehere = function() { location.href="#"+headerelement.id; console.log(headerelement.id); }
newbutton.onclick = movehere;
/*rightmenu = document.getElementById("right-menu");*/
buttonspanner = document.createElement("span");
buttoncontent = document.createTextNode(headerelement.innerHTML);
buttonspanner.appendChild(buttoncontent);
newbutton.appendChild(buttonspanner);
rightmenu.appendChild(newbutton);
});
}

函数的第一部分删除菜单中已有的所有节点,以便在更改页面时添加新节点。

尝试使用 onclick 定义 newbutton.setAttribute() 会在 Firefox 中导致 SyntaxError(当前不支持字段)。如果我将静态字符串设置为 newbutton.setAttribute("onclick", "location.href=#headerpersonalinfo"); 也不起作用。

尝试将 newbutton.onclick 设置为一个函数来设置一个静态 anchor 链接,相反,它可以工作,这样

newbutton.onclick = function() {
location.href = "#headerpersonalinfo";
}

这几乎就是我当前代码的设置方式,只是我为该函数提供了一个唯一的变量,然后我调用它。

我遇到的问题是这样的,正如我所看到的:每次找到新 header 时都会重新定义变量,因此调用该函数会将用户发送到 last header ,而不是预期的 header 一。如何设置在我用它定义onclick 时要解析的函数,而不是在用户按下按钮时调用该函数?

PS:我正在使用我自己的文件、标题和项目的内部命名约定,以便尽可能地模块化我的站点。由于这是一个仅用于我的简历的网站,因此我是其唯一的开发者。

最佳答案

出现此问题是因为您将“变量”提升到全局范围(newbutton 和 headerelement)。

将它们设置为 block 范围变量(constlet),您将看到它有效: https://codesandbox.io/s/rm4ko35vnm

function loadMenues(file) {
var rightmenu = document.getElementById("right-menu");
while (rightmenu.firstChild) {
rightmenu.removeChild(rightmenu.firstChild);
}
[].forEach.call(document.getElementById(file).children, function(
custompaddingchild
) {
console.log(custompaddingchild);
const headerelement = custompaddingchild.getElementsByTagName("h1")[0];
console.log(headerelement.innerHTML);
const newbutton = document.createElement("div");
newbutton.setAttribute("class", "menu-item");
console.log(headerelement.id);
let movehere = function() {
location.href = "#" + headerelement.id;
console.log(headerelement.id);
};
newbutton.addEventListener('click', movehere);
const rightmenu = document.getElementById("right-menu");
const buttonspanner = document.createElement("span");
buttoncontent = document.createTextNode(headerelement.innerHTML);
buttonspanner.appendChild(buttoncontent);
newbutton.appendChild(buttonspanner);
rightmenu.appendChild(newbutton);
});
}

关于javascript - 动态创建一个具有动态onclick功能的div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54852994/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com