我正在使用JavaScript构建决策树。我没有为这个项目提供jQuery。
我希望能够在决策树中的任何位置放置按钮(隐藏或显示在页面的任何位置),具有相同的类名。然后,JS端的监听器将运行一个函数。
这是我正在使用的和基于ID的监听器。它运作良好,但我需要能够有多个具有相同类或名称的按钮。虽然我已经看到了这方面的例子,但我无法让它正常运作。
function q1a1() {
var q1a1button = document.getElementById("q1answer1");
if(q1a1button.addEventListener){
q1a1button.addEventListener("click", function() { q1answer1();}, false);
} else if(q1a1button.attachEvent){
q1a1button.attachEvent("onclick", function() { q1answer1();});
}
};
if(window.addEventListener){
window.addEventListener("load", q1a1, false);
} else if(window.attachEvent){
window.attachEvent("onload", q1a1);
} else{
document.addEventListener("load", q1a1, false);
}
function q1answer1() {
//DO SOME STUFF
}
这也需要尽可能多的IE版本。对于单类处理,我使用的是querySelectorAll。
答案 0 :(得分:6)
你真正想要的是JavaScript Event Delegation。在你的情况下,你有BUTTON元素,我将假设它是<button>
标签。现在您想知道何时单击其中一个按钮然后运行一个函数:
if (document.addEventListener) {
document.addEventListener("click", handleClick, false);
}
else if (document.attachEvent) {
document.attachEvent("onclick", handleClick);
}
function handleClick(event) {
event = event || window.event;
event.target = event.target || event.srcElement;
var element = event.target;
// Climb up the document tree from the target of the event
while (element) {
if (element.nodeName === "BUTTON" && /foo/.test(element.className)) {
// The user clicked on a <button> or clicked on an element inside a <button>
// with a class name called "foo"
doSomething(element);
break;
}
element = element.parentNode;
}
}
function doSomething(button) {
// do something with button
}
页面上显示<button class="foo">...</button>
元素,点击它或其中的任何HTML标记的任何地方都将运行doSomething
功能。
更新:由于使用了事件委派,因此只在文档对象上注册了单击处理程序。如果由于AJAX调用而创建了更多<button>
s,则您不必在这些新<button>
上注册点击处理程序,因为我们利用从元素冒泡的点击事件用户单击了文档对象本身。
答案 1 :(得分:1)
如果你没有jquery:
if (document.body.addEventListener){
document.body.addEventListener('click',yourHandler,false);
}
else{
document.body.attachEvent('onclick',yourHandler);//for IE
}
function yourHandler(e){
e = e || window.event;
var target = e.target || e.srcElement;
if (target.className.match(/keyword/))
{
//an element with the keyword Class was clicked
}
}
如果您使用像jquery这样的跨浏览器库:
HTML:
<div class="myClass">sample</div>
<div class="myClass">sample 2</div>
JS:
function theFuncToCall(event){
//func code
}
$(document).on('click', '.myClass', theFuncToCall);
答案 2 :(得分:0)
var buttons = document.querySelectorAll(".MyClassName");
var i = 0, length = buttons.length;
for (i; i < length; i++) {
if (document.addEventListener) {
buttons[i].addEventListener("click", function() {
// use keyword this to target clicked button
});
} else {
buttons[i].attachEvent("onclick", function() {
// use buttons[i] to target clicked button
});
};
};
答案 3 :(得分:0)
这个答案有点矫枉过正,但它应该向您展示如何在现代化的#34;即使您仍然定位旧版浏览器
,也会如此编写代码以添加事件侦听器,以便新旧浏览器之间的差异最小
var listen = (function () { // will return the handler for use in unlisten
if (window.addEventHandler) {
return function (node, type, handler) {
node.addEventListener(type, handler);
return handler;
};
} else if (window.attachEvent) {
return function (node, type, handler) {
var fn = function (e) {
if (!e) {
e = window.event;
}
if (!e.target && e.srcElement) {
e.target = e.srcElement;
}
return handler.call(this, e);
};
node.attachEvent('on' + type, fn);
return fn;
};
} else {
throw new Error('Events not supported in this environment');
// or
// return function ... node['on' + type] = function () { ... };
}
}());
如果您反过来也是如此
var unlisten = (function () { // use handler given by listen
if (window.removeEventListener) {
return function (node, type, handler) {
node.removeEventListener(type, handler);
};
} else if (window.detachEvent) {
return function (node, type, handler) {
node.detachEvent('on' + type, handler);
};
} else {
throw new Error('Events not supported in this environment');
// or
// return function ... node['on' + type] = null;
}
}());
编写点击处理程序
function clickHandler(e) {
// do stuff
}
将您的点击处理程序包装在一个函数中,以便只选择具有正确类
的按钮function wrappedClickHandler(e) {
var tokens, i;
if (e.target.tagName !== 'INPUT' && e.target.tagName !== 'BUTTON') {
return;
}
tokens = (e.target.className || '').split(' ');
for (i = 0; i < tokens.length; ++i) {
if (tokens[i] === 'theClassTokenWeWant') {
return clickHandler.call(this, e);
// or
// return clickHandler.call(e.target, e);
}
}
}
将此作为侦听器添加到共同的祖先节点
var h = listen(document, 'click', wrappedClickHandler);
// .. later, if desired
unlisten(document, 'click', h);
答案 4 :(得分:0)
编写事件委托函数的简单方法是将其添加到按钮的容器中吗?例如,
// Select Container Element
const questionContainer = document.querySelector(".container");
// Listen For Clicks Within Container
questionContainer.onclick = function (event) {
// Prevent default behavior of button
event.preventDefault();
// Store Target Element In Variable
const element = event.target;
// If Target Element Is a Button
if (element.nodeName === 'BUTTON') {
// Event Code
}
}