社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Jquery

jquery函数不使用Ajax返回/呈现的页面[重复]

gamernes konge • 6 年前 • 2264 次点击  

我有一些代码,我在其中循环浏览页面上的所有选择框并绑定 .hover 事件让他们在宽度上做点小动作 mouse on/off .

这在页面上发生,并且工作得很好。

我遇到的问题是,在初始循环之后,通过Ajax或DOM添加的任何选择框都不会绑定事件。

我找到了这个插件( jQuery Live Query Plugin 但是,在我用插件为页面添加另一个5K之前,我想看看是否有人知道这样做的方法,可以直接使用jquery,也可以使用其他选项。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38189
 
2264 次点击  
文章 [ 23 ]  |  最新文章 6 年前
Barmar
Reply   •   1 楼
Barmar    7 年前

这是一个 纯JavaScript 没有任何库或插件的解决方案:

document.addEventListener('click', function (e) {
    if (hasClass(e.target, 'bu')) {
        // .bu clicked
        // Do your thing
    } else if (hasClass(e.target, 'test')) {
        // .test clicked
        // Do your other thing
    }
}, false);

哪里 hasClass

function hasClass(elem, className) {
    return elem.className.split(' ').indexOf(className) > -1;
}

Live demo

信用卡给了戴夫和西米·维达斯

使用更现代的JS, 哈斯class 可以实现为:

function hasClass(elem, className) {
    return elem.classList.contains(className);
}
user664833 Ronen Rabinovici
Reply   •   2 楼
user664833 Ronen Rabinovici    8 年前

文件中有一个很好的解释 jQuery.fn.on .

简而言之:

事件处理程序仅绑定到当前选定的元素;它们必须在代码调用时存在于页面上 .on() .

因此在下面的例子中 #dataTable tbody tr 在生成代码之前必须存在。

$("#dataTable tbody tr").on("click", function(event){
    console.log($(this).text());
});

如果向页面中注入新的HTML,最好使用委托事件来附加事件处理程序,如下所述。

委托事件 其优点是,它们可以处理以后添加到文档中的后代元素中的事件。例如,如果表存在,但行是使用代码动态添加的,那么下面将处理它:

$("#dataTable tbody").on("click", "tr", function(event){
    console.log($(this).text());
});

除了能够处理尚未创建的子代元素上的事件之外,委托事件的另一个优点是,当必须监视许多元素时,它们的开销可能更低。在数据表中有1000行 tbody ,第一个代码示例将处理程序附加到1000个元素。

委托事件方法(第二个代码示例)只将事件处理程序附加到一个元素,即 表格主体 ,并且事件只需要向上冒泡一个级别(从单击的 tr 表格主体 )。

注: 委派的事件不适用于 SVG .

Popnoodles
Reply   •   3 楼
Popnoodles    7 年前

自jquery 1.7起 你应该使用 jQuery.fn.on :

$(staticAncestors).on(eventName, dynamicChild, function() {});

在此之前 建议的方法是 live() :

$(selector).live( eventName, function(){} );

然而, LIVER() 在1.7中被否决,赞成 on() ,并在1.9中完全移除。这个 LIVER() 签名:

$(selector).live(eventname,function());

…可替换为以下内容 on() 签名:

$(document).on( eventName, selector, function(){} );

例如,如果您的页面正在使用类名动态创建元素 dosomething 您将事件绑定到 已存在的父级 (这是问题的关键所在,您需要一些现有的内容来绑定,而不是绑定到动态内容),这可以是(也是最简单的选项) document . 尽管要记住 document may not be the most efficient option .

$(document).on('mouseover mouseout', '.dosomething', function(){
    // what you want to happen when mouseover and mouseout 
    // occurs on elements that match '.dosomething'
});

绑定事件时存在的任何父级都可以。例如

$('.buttons').on('click', 'button', function(){
    // do something here
});

将应用于

<div class="buttons">
    <!-- <button>s that are generated dynamically and added here -->
</div>