Ruby on Rails JavaScript未加载到链接

Ruby on Rails JavaScript未加载到链接,javascript,ruby-on-rails,google-visualization,ruby-on-rails-4,turbolinks,Javascript,Ruby On Rails,Google Visualization,Ruby On Rails 4,Turbolinks,我正在使用Google Visualization在视图中嵌套的脚本标记中构建图表表。当直接获取页面时,这就足够了,但是当运行到帮助程序的链接时,javascript不起作用 我相信这与turbolinks有关,但是用page:load包装JavaScript并没有什么不同。我已经确认关闭turbolinks确实可以解决这个问题,但是如果没有它,整个应用程序的速度会明显变慢 <script type="text/javascript" charset="UTF-8"> fu

我正在使用Google Visualization在视图中嵌套的脚本标记中构建图表表。当直接获取页面时,这就足够了,但是当运行到帮助程序的
链接时,javascript不起作用

我相信这与turbolinks有关,但是用
page:load
包装JavaScript并没有什么不同。我已经确认关闭turbolinks确实可以解决这个问题,但是如果没有它,整个应用程序的速度会明显变慢

<script  type="text/javascript" charset="UTF-8">
    function resultstable () {
        google.load('visualization', '1', {packages:['table']});
          google.setOnLoadCallback(drawTable);
          function drawTable() {
           var data = new google.visualization.DataTable();
            data.addColumn('string', '');
            data.addColumn('number', 'Lot #');
            data.addColumn('string', 'Client');
            data.addColumn('boolean', 'Commercial');
            data.addColumn('string', 'Site');
            data.addColumn('string', 'Biological Classification');
            data.addColumn('string', 'Actions');
            data.addRows([
                <% @lots.each do |lot| %>
                    [
                    '<%= check_box_tag "lot_ids[]", lot.id %>', 
                    <%= lot.id.to_s %>, 
                    '<%= link_to Client.find(lot.client_id).org.to_s.humanize, client_path(lot.client_id) %>',
                    <%= lot.commercial %>,
                    '<%= lot.site %>',
                    '<%= lot.phylum.to_s + " " + lot.l_class.to_s + " " + lot.genus.to_s + " " + lot.species.to_s %>',
                    '<%= link_to edit_lot_path(lot) do %><i class="icon-edit"></i><% end %> <%= link_to lot_path(lot) do %><i class="icon-time"></i><% end %>'
                    ],
                <% end %>           
            ]);

            function rm_google_classes() {
            var className = 'google-visualization-table-table';
            $('.'+className).removeClass(className);

            var className = 'google-visualization-table-th';
            $('.'+className).removeClass(className);

            var className = 'google-visualization-table-tr-head';
            $('.'+className).removeClass(className);

            var className = 'google-visualization-table-tr-odd';
            $('.'+className).removeClass(className);

            var className = 'google-visualization-table-tr-even';
            $('.'+className).removeClass(className); 

            var className = 'google-visualization-table-td';
            $('.'+className).removeClass(className);  

            var className = 'google-visualization-table-td-number';
            $('.'+className).removeClass(className);  

            var className = 'google-visualization-table-td-bool';
            $('.'+className).removeClass(className);  

            $("#gtable-results table").addClass("table table-condensed"); 
            };

            var table = new google.visualization.Table(document.getElementById('gtable-results'));
              table.draw(data, {allowHtml: true});
              rm_google_classes();

            google.visualization.events.addListener(table , 'sort',
            function(event) {
              rm_google_classes();
            });     
           };
         }

    $(document).ready(resultstable());
    $(document).on('page:load', resultstable());       
</script>

函数resultstable(){
load('visualization','1',{packages:['table']});
setOnLoadCallback(drawTable);
函数drawTable(){
var data=new google.visualization.DataTable();
data.addColumn('string','');
data.addColumn('编号','批次');
data.addColumn('string','Client');
data.addColumn('boolean','Commercial');
data.addColumn('string','Site');
data.addColumn('string','Biological Classification');
data.addColumn('string','Actions');
data.addRows([
[
'', 
, 
'',
,
'',
'',
' '
],
]);
函数rm_google_classes(){
var className='google可视化表';
$('..+className).removeClass(className);
var className='google可视化表th';
$('..+className).removeClass(className);
var className='google可视化表tr head';
$('..+className).removeClass(className);
var className='google可视化表tr-odd';
$('..+className).removeClass(className);
var className='google可视化表tr even';
$('..+className).removeClass(className);
var className='google可视化表td';
$('..+className).removeClass(className);
var className='google可视化表td-number';
$('..+className).removeClass(className);
var className='google可视化表td bool';
$('..+className).removeClass(className);
$(“#gtable results table”).addClass(“table table condensed”);
};
var table=新的google.visualization.table(document.getElementById('gtable-results');
table.draw(数据,{allowtml:true});
rm_google_classes();
google.visualization.events.addListener(表'sort',
功能(事件){
rm_google_classes();
});     
};
}
$(document).ready(resultstable());
$(文档).on('page:load',resultstable());

一种解决方案可能是尝试
jquery turbolinks
gem。在这种情况下,使用jQuery
ready()
事件应该可以工作


请参阅:

一个解决方案可能是尝试
jquery turbolinks
gem。在这种情况下,使用jQuery
ready()
事件应该可以工作


请参阅:

可视化API对加载方式非常详细,因此,当您在另一个类似函数中调用google.load时,必须稍微更改加载结构。这:

google.load('visualization', '1', {packages:['table']});
google.setOnLoadCallback(drawTable);
必须更改为:

google.load('visualization', '1', {packages:['table'], callback: drawTable});
此外,您的事件处理程序没有正确执行:

$(document).ready(resultstable());
$(document).on('page:load', resultstable()); 
调用
resultstable
函数,并将函数的返回值(在您的情况下为null)传递给ready事件处理程序,而ready事件处理程序不起任何作用。如果希望在document ready上调用resultstable函数,则需要从函数名末尾删除
()

$(document).ready(resultstable);
$(document).on('page:load', resultstable); 
另外,我浏览了turbolinks的内容,似乎你想在这里采取不同的方法。Google loader动态地将脚本标记添加到页面的
,这不会被turbolinks删除,因此您不希望在加载新页面时一直调用loader。请尝试以下方法:

function drawTable () {
    // table drawing code
}

function init () {
    $(document).on('page:load', drawTable);
    drawTable();
} 
google.load('visualization', '1', {packages:['table'], callback: init});

这将确保加载可视化API,并且每次加载页面时都会调用
drawTable
函数。

可视化API对加载方式非常详细,因此当您在另一个类似函数中调用google.load时,您必须稍微更改加载结构。这:

google.load('visualization', '1', {packages:['table']});
google.setOnLoadCallback(drawTable);
必须更改为:

google.load('visualization', '1', {packages:['table'], callback: drawTable});
此外,您的事件处理程序没有正确执行:

$(document).ready(resultstable());
$(document).on('page:load', resultstable()); 
调用
resultstable
函数,并将函数的返回值(在您的情况下为null)传递给ready事件处理程序,而ready事件处理程序不起任何作用。如果希望在document ready上调用resultstable函数,则需要从函数名末尾删除
()

$(document).ready(resultstable);
$(document).on('page:load', resultstable); 
另外,我浏览了turbolinks的内容,似乎你想在这里采取不同的方法。Google loader动态地将脚本标记添加到页面的
,这不会被turbolinks删除,因此您不希望在加载新页面时一直调用loader。请尝试以下方法:

function drawTable () {
    // table drawing code
}

function init () {
    $(document).on('page:load', drawTable);
    drawTable();
} 
google.load('visualization', '1', {packages:['table'], callback: init});

这将确保加载可视化API,并且每次加载页面时都会调用
drawTable
函数。

谢谢!这解决了问题。你有没有可能解释回叫发生了什么事?如果可以的话,我会解释的,但我自己并不完全理解背景中发生了什么。如果我没记错的话,加载程序有两个代码路径,一个用于在页面加载时处理加载脚本,另一个用于在页面加载后加载脚本,出于某种原因,第二个用于以不同的方式处理回调。谢谢。很好的解决方案。真的帮了我的忙。谢谢!这解决了问题。有机会吗