- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我构建了一个将事件处理程序附加到类的函数。它可以很好地处理页面加载期间 DOM 中已经存在的元素,但在页面加载后动态添加到 DOM 的元素上会静默失败。我感谢任何建议。下面的代码是我正在开发的名为 launchjs https://github.com/bytewarestudios/launchjs 的 JavaScript 库的一部分。 .建议的其他解决方案仅指向我已经知道如何使用的 JQuery 代码,我需要一个没有 JQuery 的 JavaScript 解决方案。
我认为在 Event binding on dynamically created elements? 有一个解决方案接近我的需要由 Ram swaroop 提供,但我不认为它指向我在将事件附加到动态创建的元素时遇到的根本问题,并且它没有像本页上接受的答案那样彻底地解释它。
代码的最终结果应允许用户使用以下代码结构将事件附加到具有类的元素。
l(".className").on("click",function(event){
//do something here
});
JavaScript:
/*
The type parameter passed in to this function is "click" and the
selector variable value equals .view
Note: the isClass function returns true if the selector value is prefixed
with a .
*/
this.on = function(type,fn){//begin on function
//store the events
var events = ["click","mouseover","mouseout","submit","dblclick"];
//if the event array contains the event and the selector is not a class
if(events.indexOf(type) !== -1 && !isClass()){//begin if then
//add the event listenter to the document
document.addEventListener(type,function(event){//begin function
/*
if the event listener target id equals the selector id passed to the launch
function and the selectors doesn't contain the . prefix or class prefix.
*/
if(event.target.id === selector){//begin if then
//call the function passed in as a parameter, pass the event so it can be used.
fn(event);
}//end if then
});//end function
}//end if then
//if the event array contains the event and the selector is a class
if(events.indexOf(type) !== -1 && isClass()){//begin if then
//store the collection of classes
var classes = document.getElementsByClassName(selector.split(".")[1]);
//loop through the classes and add the event listeners
for(var i = 0; i < classes.length; i++){
classes[i].addEventListener(type,function(event){//begin addEventListener function
//add functionality for classes
if(event.target.className === selector.split(".")[1] && isClass()){//begin if then
//call the function passed in as a parameter,pass the event so it can be used.
fn(event);
}//end if then
});//end addEventListener function
}//end for loop
}//end if then
};//end on function
最佳答案
您要么需要在每次添加新元素时都运行此代码,同时确保您不会将事件监听器附加到旧元素两次,要么您可以使用委托(delegate)事件技术,如 .on()来自 jQuery。
简而言之,您将事件监听器附加到全局容器,并检查指定类的点击元素。这是一篇关于这个问题的文章:DOM Event Delegation without jQuery
还有一个库,由同一个人为该特定案例编写:https://github.com/ftlabs/ftdomdelegate
请看我的这个概念的简短例子:
var area = document.getElementsByClassName('clickable-area')[0];
area.onclick = function(e) {
if (e.target.className === 'add-children') {
var button = document.createElement('button');
button.className = 'child-button';
button.innerText = 'Child button';
area.appendChild(button);
} else if (e.target.className === 'child-button') {
e.target.innerText = 'Dynamically added child is clicked';
}
}
html,
body {
width: 100%;
height: 100%;
padding: 0;
margin: 0;
}
.clickable-area {
display: block;
cursor: pointer;
background: #eee;
width: 100%;
height: 100%;
}
<div class="clickable-area">
<button class="add-children">Add children</button>
</div>
关于javascript - 使用纯 JavaScript 将事件处理程序附加到具有类的动态创建的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32847377/
我关注了 tutorial on creating a popup for an add-on在 Firefox 中,效果很好。 我现在遇到的问题是它创建的弹出窗口不会更改大小以适应我添加到其中的内容
我有一些视频,我需要连接一个标题并添加一些覆盖,问题是我需要先做覆盖,否则时间不正确,然后才将标题连接到视频的开头 ffmpeg -i talk.mp4 -i start_pancarte.png
我正在尝试附加一个 CSV 文件。这是我正在使用的线路。不幸的是,我找不到 export-csv 的附加选项。任何想法都有助于使其发挥作用。 Get-ADGroupMember "Domain Adm
我正在努力理解 Attach API (com.sun.tools.attach.*) 的用途。它的典型用途是什么?它是为了“模拟”JVM,以便您可以在不部署/启动代码的情况下测试您的代码吗?它是一个
我不明白为什么这不起作用。 soup_main = BeautifulSoup('FooBar') soup_append = BeautifulSoup('Meh') soup_main.body.
我有以下代码来返回我想要的字符串 $sql = " SELECT `description` FROM `auctions` WHERE `description` REGEX
我正在尝试从数组中附加具有多个值的元素,但我做错了。这是我的代码: for(var i=0; i ` + pricesArray[i].start_date ` ` + pricesArray[i
我正在尝试将图像链接添加到此 javascript 附加表中。使图像位于按钮上方 这是代码 $("#1").append(""+section+""+no+""+price+""+button+""
我有一个问题,我已经解决了,但它太烦人了。 我有一个 js 代码,当使用“追加”按下按钮时,它会放下一些 html 代码,并且通过该代码,我为 x 按钮提供了一个 id,并为容器元素提供了一个 id。
我想逐行读取文件,并且每一行可能都有很多字符。 这个版本的readline效果很好 func readLine(r *bufio.Reader) ([]byte, error) { var (
我有一个网站,每次用户登录或注销时,我都会将其保存到文本文件中。 如果不存在,我的代码在附加数据或创建文本文件时不起作用。这是示例代码 $myfile = fopen("logs.txt", "wr"
我正在尝试使用 typescript 和 Formik 创建一个自定义输入字段。我可以就完成以下代码的最佳方式获得一些帮助吗?我需要添加额外的 Prop 标签和名称......我已经坚持了一段时间,希
我有一个字符串 big_html,我想将它添加到某个 div 中。我观察到以下方面的性能差异: $('#some-div').append( big_html ); // takes about 10
如何使用 FormData 创建以下结果 ------WebKitFormBoundaryOmz20xyMCkE27rN7 Content-Disposition: form-data; name="
有没有办法附加 jQuery 事件处理程序,以便在任何先前附加的事件处理程序之前触发该处理程序?我遇到了this article ,但代码不起作用,因为事件处理程序不再存储在数组中,而这正是他的代码所
我正在开发一个需要网络登录的 iPhone 应用程序。像往常一样我打电话 [[UIApplication sharedApplication] openURL:loginURL]; 这将关闭应用程序并
我想开发一个仅针对特定域激活的扩展。 我不希望它在不浏览此特定域时出现在浏览器菜单中。 有可能这样做吗? 最佳答案 可能:对于菜单,您可以添加一个弹出窗口侦听器,用于检查当前加载的URL(docs f
这段 JavaScript 代码 function writeCookie(CookieName, CookieValue, CookieDuration) { var expiration
我正在使用 Handlebars 来渲染使用ajax从本地服务器获得的信息。我的 HTML 看起来像: {{#each Tabs}}
我尝试了以下代码,但当输入框中没有数据时它不会通知。当我直接添加此内容(不附加)时,它会起作用。我在这里做错了什么 var output = "\n"+ "\n"+
我是一名优秀的程序员,十分优秀!