在页面刷新之前,JQuery不会运行

时间:2014-04-21 02:59:17

标签: javascript jquery html ruby ruby-on-rails-4

我有一个简单的脚本来隐藏和显示某些按钮,但是javascript在重新加载页面之前不会运行。如果用户点击该链接,我怎样才能让它运行?例如,在用户第一次链接到页面时,页面已经隐藏了某些div。

var array = [".section-1", ".section-2", ".section-3", ".section-4", ".section-5"];

var cnt = 0;

$(function() {
    for(var i = 0; i < 5; i++) {
        $(array[i]).hide();
    }
    $(array[cnt]).show();
    $(".previous").hide();
    $(".next").click(function () {
        if(cnt < 4){
            $(array[cnt]).hide();
            cnt++;
            $(array[cnt]).show();
        }
        if (cnt == 4) {
            $(".next").hide();
        }
        if(cnt > 0) {
            $(".previous").show();
        }

    });

    $(".previous").click(function (){

        if(cnt > 0) {
            $(array[cnt]).hide();
            cnt--;
            $(array[cnt]).show();
        }


        if(cnt < 4){
            $(".next").show();
        }
        if(cnt == 0){
            $(".previous").hide();
        }

    });
});

这是清单文件。

// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file.
//
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
// about supported directives.
//
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require users

2 个答案:

答案 0 :(得分:5)

您的问题出在turbolinks

问题是Turbolinks阻止你的JS加载&#34;通常&#34;因为它每次都通过ajax重新加载你的页面主体(打破你的JS,因为你所有的事件都被绑定了)

这两个解决方案是将您的JS编码为使用Turbolinks,或使用jquery-turbolinks来实现更自然的解决方案

如果您想让当前代码与Turbolinks一起使用,您可以使用:

var ready = function(){

    var array = [".section-1", ".section-2", ".section-3", ".section-4", ".section-5"];
    var cnt = 0;

    for(var i = 0; i < 5; i++) {
        $(array[i]).hide();
    }
    $(array[cnt]).show();
    $(".previous").hide();
    $(".next").click(function () {
        if(cnt < 4){
            $(array[cnt]).hide();
            cnt++;
            $(array[cnt]).show();
        }
        if (cnt == 4) {
            $(".next").hide();
        }
        if(cnt > 0) {
            $(".previous").show();
        }

    });

    $(".previous").click(function (){

        if(cnt > 0) {
            $(array[cnt]).hide();
            cnt--;
            $(array[cnt]).show();
        }


        if(cnt < 4){
            $(".next").show();
        }
        if(cnt == 0){
            $(".previous").hide();
        }

    });
});

$(document).on("page:load ready", ready);

答案 1 :(得分:0)

这似乎是css的工作。您可以使用css将div上的display属性设置为&#34; none&#34;在页面加载之前,然后一旦javascript开始运行,您可以决定是否显示它们。

作为未来参考的注意事项,JS在页面刷新之前不会运行的原因是因为您使用$(function() {})方法中的所有javascript,直到页面为止才执行完成加载。

您还可以在ready函数之外添加一些代码行来立即执行代码。这是不太可取的,因为破解的javascript会阻止加载您的页面。