gpt4 book ai didi

javascript - addEventListener 类型 'click' 实际上表现得像 'load'

转载 作者:行者123 更新时间:2023-11-28 13:40:43 25 4
gpt4 key购买 nike

我目前正在尝试在网页上添加一点动态,因此我决定使用事件监听器来加载外部页面,而无需重新加载所有页面。

从现在开始,我制作了以下测试页面内容:

HTML:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
<link href="http://fonts.googleapis.com/css?family=Open+Sans" rel="stylesheet" type="text/css">
<link type="text/css" rel="stylesheet" media="all" href="./assets/css/style.css">
</head>
<body>
<header>
<nav>
<ul>
<li><h1>Tagline of the page</h1></li>
<li id="login"><h1><a href="#" id="authentication">Classic Authentication</a></h1></li>
</ul>
</nav>
</header>
<section id='messages'>
<p class="title">I'm sorry dave, but you can't access this facility right now!</p>
</section>
<script src="/assets/scripts/ajax.js"></script>
</body>
</html>

JavaScript:

function loadview(url, id) {
var xhr_object = null;

if (window.XMLHttpRequest) {

xhr_object = new XMLHttpRequest();

xhr_object.open("GET", url, true);

xhr_object.onreadystatechange = function(){

if (xhr_object.readyState != 4) {
return;
}

if (xhr_object.status != 200 && xhr_object.status != 304 && xhr_object.status !=0){
console.log("erreur :" + xhr_object.status);
return;
}
document.getElementById(id).innerHTML = xhr_object.responseText;
};
xhr_object.send();
}
}

var element = document.getElementById('authentication');
var target = document.getElementById('messages');
element.addEventListener("click",loadview('/views/auth_form.html',target.id),false);

在这里,我的问题来 self 的事件监听器,它没有正确完成工作。当在由 id 'authentication' 标识的元素上检测到事件 click 时,我要求他执行 loadview() 函数,但是页面加载后,事件监听器就会执行 loadview 函数,这对我来说听起来有点尴尬,所以我请求您的帮助。

我知道我的代码不干净而且相当丑陋,特别是在 Js 部分,但我也知道我的 loadview() 函数正在正确地完成工作,而且我也知道如果我使用旧式内联 onclick() 方法,它可以完美工作。

如果您对这个特定主题有任何线索,我正在倾听;-)每个改进建议都可以很好地接受,但请记住,我首先想解决我的问题,而不是真正清理这段代码。

此代码仅用于测试目的,因此如果它不是绝对干净,我并不关心,除了我个人的学习;-)

最佳答案

addEventListener 需要对要调用的函数的引用。您正在做的是将函数的结果作为引用传递,该函数在编译器到达该行时执行,这是不正确的(您的函数返回 undefined,因为它没有返回值)。您应该将代码包装到函数中,以便可以将其作为对方法的引用传递:

element.addEventListener("click", function() { 
loadview('/views/auth_form.html', target.id);
}, false);

这是一个所谓的匿名函数,您也可以使用普通函数来实现:

function listenerReference() {
loadview('/views/auth_form.html', target.id);
}
element.addEventListener("click", listenerReference, false); //passing the reference to the function

在第二种情况下,当触发 click 事件时,浏览器将调用函数 listenerReference,因为它是附加到事件的监听器。请注意,此方法与 on+event 方法不同,因为 addEventListener 可以轻松在同一事件上添加大量监听器,而on+event 需要更多代码。

关于javascript - addEventListener 类型 'click' 实际上表现得像 'load',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18012792/

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