首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有jQuery的情况下模拟命名空间事件或解除单个事件的绑定?

如何在没有jQuery的情况下模拟命名空间事件或解除单个事件的绑定?
EN

Stack Overflow用户
提问于 2015-03-21 01:35:25
回答 2查看 735关注 0票数 0

我有一个框架,当它们滚动到视口时,它会懒洋洋地加载。当页面加载时,我会检查哪些在视图中并加载它们。如果它们不在视图中,我将创建一个滚动事件,并为每个事件命名空间,以便分别绑定和解除绑定:

代码语言:javascript
复制
if (adIsInView("ad1") == false) { 
    $(document).on("scroll.ad1", function() {
        if (adIsInView("ad1") == true) {
            displayAd("ad1");
            $(document).off("scroll.ad1");
        } 
    });
}

这样就可以很容易地设置scroll.ad1、scroll.ad2等,单独绑定和解除绑定。

这是我的代码中唯一依赖jQuery的部分。我不想加载一个50 KB的文件只是为了我可以有名称空间的事件。我如何使用addEventListener和removeEventListener来完成这个任务?显然我不能就这么用

代码语言:javascript
复制
window.removeEventListener("scroll");

因为这将解除对所有滚动事件的绑定,名称空间("scroll.ad1")本机不存在。

我还没有找到任何关于这个确切主题的其他帖子。我听说过一些人提到,jQuery源代码通过将事件存储在对象中来创建名称空间,但我不太确定它是如何工作的。有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-21 01:44:27

可以绑定和取消绑定特定的处理程序。

代码语言:javascript
复制
if (adIsInView("ad1") == false) {
    var ad1_listener = function() {
        if (adIsInView("ad1") == true) {
            displayAd("ad1");
            window.removeEventListener("scroll", ad1_listener);
        } 
    }
    window.addEventListener("scroll", ad1_listener);
}

你可以更进一步,做:

代码语言:javascript
复制
function register_ad(ad) {
    function listener() {
        if (adIsInView(ad) === true) {
            displayAd(ad);
            window.removeEventListener("scroll", listener);
        } 
    }
    window.addEventListener("scroll", listener);
}

if (adIsInView("ad1") === false) {
    register_ad("ad1");
}
票数 1
EN

Stack Overflow用户

发布于 2015-03-21 01:50:39

您正在寻找具有名称空间支持的PubSub JavaScript实现。

例如,快速googling提供了这个https://jsperf.com/pubsub-js-vs-jquery-events/12

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29178288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档