【问题标题】:Delay Turbolink's visit for off-canvas menu to close延迟 Turbolink 访问关闭画布菜单
【发布时间】:2016-09-22 18:31:23
【问题描述】:

我正在使用 TurboLinks 和一个以动画结束的 off-canvas menu。到时候,Turbolinks 在菜单完全关闭之前就换了个页面,显得有些仓促。我尝试添加超时并修改 TurboLinks 的事件,但没有任何运气。 Javascript/Jquery 真的不是我的强项,所以,我的问题是:有没有办法延迟 TurboLinks 请求的触发,以便菜单可以正常关闭?

钯。我正在使用 Laravel 进行开发。

更新:

documentation我发现你不能在开始之前取消访问。考虑到这一点,我设置了这个

$(document).on('turbolinks:before-visit', function(e){
    var url = event.data.url;
    console.log(url);
    event.preventDefault();
    e.stopImmediatePropagation();

    setTimeout(function(url){
        Turbolinks.visit(url);
    }, 1000);
});

但是,正如我在 @OhGodWhy 的 cmets 行中所说,一切都崩溃了,页面卡住了,并且控制台中多次显示错误“超出最大调用堆栈大小”。

【问题讨论】:

    标签: javascript jquery laravel turbolinks


    【解决方案1】:

    有一个 RFC 规定您不能在没有他们干预的情况下减慢/停止用户离开页面的过程;因此,当您想离开页面时,为什么您会看到 alert 窗口弹出,但您仍然可以单击“继续”继续离开。

    也就是说,我可以给你一个解决方案。他们所有的动画都是 CSS3 驱动的,你唯一需要担心的是切换类的 javascript。

    $('.sidebar').on('click', 'a', function(e){
        e.preventDefault();
    
        var $this = $(this);
    
        if ($('body').hasClass('st-menu-open')) {
            $('body').removeClass('st-menu-open')
            setTimeout(function(){
               Turbolinks.visit($this.prop('href'));
            }, 500);
        }
    });
    

    我们在这里所做的只是在您的导航中捕获点击,如果主体有类,那么我们将删除它。但是,我们将等待500ms,它对应于库使用的CSS transition delay,直到我们执行重定向。这样,在 500 毫秒后,转换将完成,您可以重定向用户。

    【讨论】:

    • 我试过了(对不起,我应该提一下),但是这个“window.location = $this.prop('href');”的问题是我绕过或禁用了 TurboLinks 效果,或者好吧,这就是我认为页面像“正常”页面一样加载的原因。
    • @JorgeAnzola 对不起,我走得太快了。我已经知道了,请再次查看超时功能。我认为您可以手动从TurboLinks 中调用.visit() 方法。
    • 我在文档中发现你不能cancel a visit before ir starts 而我做到了,他们还指出你可以通过event.data.url 获取访问url,所以我做了var url = event.data.url;。正如你肯定提到的,我可以[调用访问方法](github.com/turbolinks/turbolinks#turbolinksvisit)。我写了 Turbolinks.visit(url); 包装到一个 setTimeOut() 中。但是现在,当我单击链接时,一切都变得糟糕透顶,出现“超出最大调用堆栈大小”错误并且页面卡住了。
    • @JorgeAnzola 我猜e.preventDefault() 不会停止点击函数的内部。你能告诉我,e.stopImmediatePropagation() 对你有帮助吗?
    • 好的,现在页面没有爆炸。 IDK 该方法来自哪里,但它有效(第一次获胜!)。现在,visit 方法在 setTimeOut 中不起作用(它在您调用侧时起作用)。你认为我错误地传递了 url 变量? (检查 OP 更新)
    猜你喜欢
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多