如何在没有 jQuery 的情况下模拟命名空间事件或取消绑定单个事件?
How to simulate namespaced events or unbind individual events WITHOUT jQuery?
我有一个框架可以在广告滚动到视口中时延迟加载广告。当页面加载时,我检查查看哪些在视图中并加载它们。如果它们不在视图中,我会创建一个滚动事件并为每个事件命名,以便我可以单独绑定和取消绑定它们:
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 来做到这一点?显然我不能只使用
window.removeEventListener("scroll");
因为这会解除我所有滚动事件的绑定,并且命名空间 ("scroll.ad1") 本身并不存在。
我还没有找到关于这个确切主题的任何其他帖子。我听说有人提到 jQuery 源代码通过在对象中存储事件来创建命名空间,但我不确定它是如何工作的。有什么想法吗?
您可以绑定和取消绑定特定的处理程序。
if (adIsInView("ad1") == false) {
var ad1_listener = function() {
if (adIsInView("ad1") == true) {
displayAd("ad1");
window.removeEventListener("scroll", ad1_listener);
}
}
window.addEventListener("scroll", ad1_listener);
}
您可以更进一步:
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");
}
您正在寻找具有命名空间支持的 PubSub JavaScript 实现。
快速谷歌搜索给出了这个 https://jsperf.com/pubsub-js-vs-jquery-events/12 例如。
我有一个框架可以在广告滚动到视口中时延迟加载广告。当页面加载时,我检查查看哪些在视图中并加载它们。如果它们不在视图中,我会创建一个滚动事件并为每个事件命名,以便我可以单独绑定和取消绑定它们:
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 来做到这一点?显然我不能只使用
window.removeEventListener("scroll");
因为这会解除我所有滚动事件的绑定,并且命名空间 ("scroll.ad1") 本身并不存在。
我还没有找到关于这个确切主题的任何其他帖子。我听说有人提到 jQuery 源代码通过在对象中存储事件来创建命名空间,但我不确定它是如何工作的。有什么想法吗?
您可以绑定和取消绑定特定的处理程序。
if (adIsInView("ad1") == false) {
var ad1_listener = function() {
if (adIsInView("ad1") == true) {
displayAd("ad1");
window.removeEventListener("scroll", ad1_listener);
}
}
window.addEventListener("scroll", ad1_listener);
}
您可以更进一步:
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");
}
您正在寻找具有命名空间支持的 PubSub JavaScript 实现。
快速谷歌搜索给出了这个 https://jsperf.com/pubsub-js-vs-jquery-events/12 例如。