2011-07-25 29 views
3

的简单版本是有可能得到的任何地方具有相似的功能jQuery的live()事件处理纯javascript函数?我需要能够将事件附加到尚未创建的对象上,但jquery-livequery以及jquery-events源由于依赖于jQuery核心而无用。jQuery的直播功能

+0

是的,是否有可能。Jquery是用JavaScript语言创建的一个库。 所有功能都可以自行改写 –

+0

为什么要重新发明这个轮子?这个函数依赖于jQuery有什么问题? – Sparky

+0

你用什么方法向页面添加新元素?为什么你不能在添加元素的相同代码中连接事件? – ErikE

回答

7

活动委派很简单。就拿这个例子:

标记:

<div id="container"> 
    <p>Test</p> 
    <p>Test</p> 
    <p>Test</p> 
</div> 

<button id="add">Add new paragraph</button> 

脚本:

document.getElementById("container").onclick = function(e) { 

    // e.target is the target of the event or "source element" 
    alert(e.target.innerHTML); 
}; 

// dynamically adds new paragraph on button click 
document.getElementById("add").onclick = function() { 
    var p = document.createElement("p"); 
    p.innerHTML = "a new paragraph"; 
    document.getElementById("container").appendChild(p); 
}; 

由于事件处理程序连接到母体,它会为插入任何未来元素的工作。

You can try it here.

有用的参考:

1

jQuery是纯JavaScript和开放源代码,所以只要看看我们的代码,然后复制你需要什么并适应它。

+0

+1更不用说它已经通过了浏览器测试。我永远不会明白,为什么人们觉得需要“重新发明轮子”,而没有更大的目的。 – Sparky

+0

我认为它很好奇;)但另一方面,单独处理IE的可能性会让我感到恶心;) –

+7

不像jQuery看起来像常规的DOM操作。它建立在它自己的迷你平台上的很多层中,因此弄清楚在相对简单的jQuery操作中实际进行的DOM调用可能非常令人生畏。我并不是说这对jQuery不利,只是你的建议不像使用jQuery那样容易。在发现实际调用DOM之前,您必须深入了解它,然后,您发现不容易复制或移出jQuery,因为它使用了很多自己的平台。 @ karim79的答案更有帮助。 – jfriend00

2

是的,这就是所谓的事件代表团,并已经有超过jQuery和“活”。

“活”的工作原理是监听在阀体上或文档事件,那么当事件发生时着眼于event.target,看看它的选择相匹配的存储在缓存中的一个。这是相当低效的,但对一些工程确定。

一个更有效的方法是在添加要监听元素的数组,然后侦听要委派事件元素的最低共同祖先冒泡事件。 body元素是后备,但效率最低。当侦听器得到一个正在等待的事件时,检查event.target是否是数组中的一个元素,如果是,请使用这个调用相关函数。

用户也可以直接在元素的ID存储为一个对象的属性,以便查找它的速度更快,如果你有很多的元素,或者您可以注册基于类的事件。

有一些限制和弱点(某些浏览器中的某些事件冒泡,但不是其他浏览器,有些则完全不冒泡),并且效率非常低,请小心使用。

+0

+1关于性能问题以及关于非冒泡事件和浏览器实现不一致的警告信息。 – CMS

+0

有一篇关于jQuery的.live扩展名为[为什么你不应该使用jQuery Live]的有趣文章(http://jupiterit.com/news/why-you-should-never-use-jquery-live)。大部分细节适用于一般的事件授权。 – RobG

1

我知道一点jQuery和你的功能。 您正在寻找如何在JavaScript中使用事件? 你可以这样:

element.addEventListener('onclick', 
function() { 
    //do something 
}); 

element.onclick = 
function() { 
    //do something 
}); 

element变种是DOM文档的参考。 查询https://developer.mozilla.org/en/DOM了解更多详情。