Meteor 的滚动事件

Posted

技术标签:

【中文标题】Meteor 的滚动事件【英文标题】:Scroll event for Meteor 【发布时间】:2014-07-29 11:46:49 【问题描述】:

我在流星文档中找不到流星的滚动事件。当有人在流星应用程序中向下滚动窗口时,我该怎么做?

我试过'scroll window' : function(event) ... ,但没有按预期工作。

【问题讨论】:

【参考方案1】:

我也一直在搞这个。

我还没有找到在Template.template.events 中干净利落的方法。

目前明显的临时解决方案是使用简单的 jQuery 滚动事件。

$(window).scroll(function()//your code); 应该可以解决问题。

我试图用作选择器但无济于事的事情是:

'scroll *'

'scroll body'

'scroll document'

自然而然

'scroll window'

我在通用模板的事件中尝试了所有这些选择器,以及 UI.body 的事件,因为这是包含页面正文的新 blaze 模板。

重申一下:暂时使用 jQuery 可能会更好。

【讨论】:

据我所知没有任何改变:github.com/meteor/meteor/issues/3298【参考方案2】:

这有点晚了,但我想出了一个解决方案;至少在我当前的项目中。

我正在用 Meteor 实现 D3,我想要一个自定义缩放功能,当用户滚动时改变模板的尺寸。

创建一个反应变量“缩放”

Template.graph.onCreated(function() 
    var self = this;
    self.zoom = new ReactiveVar(0);
    $(window).on('scroll', function(e) 
        // ... event processing stuff; 
        // say it produces value 'zoomAmount' ...
        self.zoom.set(zoomAmount);
    
);

创建一个返回缩放的助手。 在隐藏元素中的模板 DOM 中引用它以使其具有反应性。

Template.graph.helpers(
    zoom: function()  
        // This will be called when 'zoom' changes, 
        // so treat this as your events function
        return Template.instance().zoom.get(); 
    
);

【讨论】:

我遇到的这个问题是,如果您导航到一个页面,然后返回到上一个页面,该事件会被多次添加。 @JakobAlexanderEichler 使用 Template.onDestroyed() 方法将其关闭。【参考方案3】:

作为部分解决方案,您可以在您关心的任何元素上侦听 mousewheel 事件。很多时候,这正是你想要的。

例如,以下事件侦听器将完全阻止用户使用滚轮滚动,但他们仍然可以使用页面侧面的导航栏。 (如果您没有使用overflowy: hidden; 禁用它)

Template.body.events(
    'mousewheel': function(event, template) 
        console.log("scrolled");
        return false;
    
);

【讨论】:

这个建议让我很紧张。大多数用户可能会使用滚轮,但也有很多用户使用键盘快捷键或其他辅助工具来控制滚动。因此,除非您要实现的目标非常适合“增强”类别,否则根本不能依赖此事件来获取滚动事件。 鼠标滚轮调用并不一定意味着页面已经滚动。【参考方案4】:

在 Meteor 中,没有原生模板支持滚动事件,因此您必须在 Template.name.onRendered 回调中执行此操作。但是,如果您不将其从Template.name.onDestroyed 中删除,则会发生内存泄漏。这最好通过命名空间事件来完成,因为像 $(window).off('scroll'); 这样的东西会从窗口中分离所有滚动事件。

import  $  from 'jquery';

Template.myTemplateName.onRendered(function()
  // You can do this multiple times
  $(window).on('scroll.whateverNamespace', function()  ... );
  $(window).on('scroll.whateverNamespace', function()  ... );
)

Template.myTemplateName.onDestroyed(function()
  $(window).off('scroll.whateverNamespace');
)

【讨论】:

【参考方案5】:

此时真的很晚了,我认为自从提出问题以来已经发生了很大变化,但我自己也遇到了这个问题,对于其他可能需要知道的人来说,我发现可行的方法是创建一个名为“scroll .container”的助手,其中容器是一个 div,其中包含页面的主体(用户将在我的应用程序中滚动的地方)我的函数看起来像这样:

Template.main_page.events(
    'scroll .container': function(event) 
        console.log(event.currentTarget.scrollTop);
    

);

【讨论】:

以上是关于Meteor 的滚动事件的主要内容,如果未能解决你的问题,请参考以下文章

Meteor:检测嵌套模板中的事件

Meteor - 新 DOM 元素上的事件 [重复]

Meteor 模板事件处理程序中“this”的上下文(使用 Handlebars 进行模板)

Meteor 覆盖包中元素的点击事件

LA - 3905 ——Meteor 流星

如何在 Meteor 中使用客户端重新连接事件