每次在Rails 5应用程序中加载turbolinks时执行JS

时间:2016-07-17 10:23:00

标签: javascript ruby-on-rails turbolinks

我想在每次加载turbolinks时(即加载页面)执行几行js,而不是从缓存中执行js,但是每次都要在turbolinks加载事件之前强制运行它。这可能吗?

我试图通过隐藏html主体并在app.js.coffee中执行此操作来摆脱FOUC

$user_id                =   1;
$user_info              =   get_userdata( $user_id );
$this_user_roles        =   $user_info->roles;

//For wp_delete_user() function
require_once(ABSPATH.'wp-admin/includes/user.php' );

if( in_array( "administrator", $this_user_roles) ) {
    echo "This user is admin, cannot be deleted";
} else {
    if( wp_delete_user( $user_id ) ){
        echo "Success user deleted :)";
    } else {
        echo "There is a problem while deleting the user.";
    }
}

但是FOUC在重新加载页面后第3或第4次开始启动。

要查看此动态,here是该网站的链接。

2 个答案:

答案 0 :(得分:2)

Turbolinks仅在使用该页面上的链接时加载,而不是在刷新页面或通过URL导航时加载。如果要在加载页面时运行js,请使用$(document).ready(function() { executable js here });

答案 1 :(得分:1)

因此,FOUC加上turbolinks可能会非常恼人。我们最终修复它的方法是使用内联stye隐藏整个身体并在体内添加脚本标记:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("SlabFrom", typeof(int));
            dt.Columns.Add("SlabTo", typeof(int));
            dt.Columns["SlabTo"].AllowDBNull = true;
            dt.Columns.Add("Rate", typeof(double));

            dt.Rows.Add(new object[] {0,100,5.00});
            dt.Rows.Add(new object[] {100,500,10.00});
            dt.Rows.Add(new object[] {501,null,15.00});

            int usage = 1500;

            double cost = 0;
            foreach(DataRow row in dt.AsEnumerable())
            {
                if(usage > 0)
                {
                    if((row.Field<int?>("SlabTo") == null) || (usage < row.Field<int>("SlabTo")))
                    {
                        cost += usage * row.Field<double>("Rate");
                        usage = 0;
                    }
                    else
                    {
                         cost += (row.Field<int>("SlabTo") - row.Field<int>("SlabFrom")) * row.Field<double>("Rate");
                         usage -=  (row.Field<int>("SlabTo") - row.Field<int>("SlabFrom"));
                    }
                }
            }
         }
    }

}

这确保了当turbolinks处于运行状态时,它仅加载HTML的主体,因此在主体内运行脚本时确保每次有turbolinks加载时js都会运行。