我的代码涉及到使用jQuery的Ajax获取一些数据。 然后,我将从服务器获得的结果附加到html(以按钮的形式)。 所有按钮都有一个类名MyButton。 单独的JavaScript文件处理按钮单击事件。 第一次Ajax调用时一切正常,但第二次Ajax调用时出现错误。 Ajax调用按一定时间间隔进行
HTML代码
<button class="mybutton">Button 1</button>
Script1.js文件中的Javascript代码
document.addEventListener("DOMContentLoaded", ready);
function ready() {
let buttons = document.querySelectorAll(".mybutton");
buttons.forEach((button) => {
button.addEventListener("click", () => {
//do some stuff
console.log("I was Clicked");
});
});
}
Script2.js文件中的jQuery代码
$(document).ready(() => {
//append the html to add more buttons after some time
setInterval(() => {
$.ajax({
method: "GET",
url: "/getButtons",
async: true,
success: function (data, status, xhr) {
data.forEach((item) => {
$("body").append(
'<button class="mybutton">' + item + "</button>"
);
});
const scriptsrc = document.createElement("script");
scriptsrc.setAttribute("type", "text/javascript");
scriptsrc.setAttribute("src", "//script location here");
$("head").append(scriptsrc);
},
});
}, 10000);
});
附加到按钮上的JavaScript只在第一个Ajax请求之后触发一次,第二次时出现错误:
Uncaught SyntaxError: Identifier 'buttons' has already been declared
这段代码看起来有点混乱,有几个错误。
scriptsrc.setAttribute('src', ''); //script location?
_r = '+Math.random()+Math.pow(10,10).toString(2)); Not sure what this part does
请检查此fiddle以减少错误:https://jsfiddle.net/p1x9vnj2/
你能用下面的脚本试试吗? 以澄清是发出了'let buttons',还是ready()函数覆盖了现有函数。
document.addEventListener("DOMContentLoaded", init_fun);
function init_fun() {
document.querySelectorAll(".mybutton").forEach((button) => {
button.addEventListener("click", () => {
//do some stuff
console.log("I was Clicked");
});
});
}
在本例中,如果您在ajax调用之后注入script1,您将有多个script标记,其中包含多个具有相同名称的变量。
不是添加整个脚本,而是在ajax调用的成功回调后调用函数。 这样可以避免多个可变的问题。