Py学习  »  Jquery

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

gamernes konge • 5 年前 • 2240 次点击  

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

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

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

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38189
 
2240 次点击  
文章 [ 23 ]  |  最新文章 5 年前
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>