单个 Javascript 函数在 Heroku 上不起作用

Posted

技术标签:

【中文标题】单个 Javascript 函数在 Heroku 上不起作用【英文标题】:Single Javascript function not working in on Heroku 【发布时间】:2015-10-14 11:04:24 【问题描述】:

我刚刚将一个 Rails 应用程序部署到 Heroku,发现只有一个 javascript 函数。函数officerCheck() 存在于它自己的文件officerCheck.js 中。并由初始化文件init.js 调用,行为officerCheck

函数如下;日志的第一个输出甚至不显示

function officerCheck()
    console.log("officer check in");
    var change=0;
    $('#toggle-two-wrapper').on('change', function()
        if(change===0)
        checking();
        else
            change=0;
        
    );
    function checking()
        var alert=0;
        var existingRoles=[];
        neededRoles=["President", "Secretary", "Treasurer"];
        $("select.officer_role").each(function(i,e)
            existingRoles[i]=$(e).val();
            console.log("existing Roles "+existingRoles[i]);
        );
        $(neededRoles).each(function(i,e)
            if($.inArray(e,existingRoles)==-1)
                alert=1;
                $('div#final-submission').prepend("<span class='warning' style='display:block'>"+e+" needed.</span>");
                $("span.warning").delay(9000).slideUp("medium");
            
        );
        console.log("alert equals "+alert);
        if(alert==1)
            console.log("we're in");
            change=1;
            $('div.incorporation_submit #toggle-two').bootstrapToggle('off');
        
    

以下是我目前调查过的列表:

所有其他 javascript 函数都可以正常工作(包括那些由 init.js 调用的函数) officerCheck 函数确实可以在我的 localhost 上运行,并且 heroku 在该机器上是最新的。 当我浏览heroku 托管的站点时,浏览器确实加载了函数officerCheck 及其各自的调用。 (我可以在 firebug 的脚本选项卡中看到两者)。 如果我将函数的内容剪切并粘贴到 firebug 中,它们仍然有效。 (让我相信 heroku 只是不喜欢我调用函数的方式) 使用 officerCheck(); 从 firebug 调用函数不起作用。 但是,将整个函数加载到 firebug 并使用 officerCheck(); 调用它确实有效。

我猜我在扯一些 Heroku 无法忍受的草率。欢迎任何想法想法或警告。

【问题讨论】:

change 在哪里声明?也许尝试另一个变量名并为初学者添加var 声明。 如果您在控制台officerCheck 中运行不带括号,那么您应该得到一个输出:function。如果你不这样做,这意味着你的功能没有找到,你应该检查你的资产。此外,如果您在开发模式和 Heroku 生产模式下在 localhost 上运行,请确保在创建函数后编译您的资产。 @RubyRacer 好的专业提示。运行不带括号的officerCheck 的输出是officerCheck() 这算吗?我确实一直在开发模式下运行,所以我将检查该操作顺序。感谢您的帮助。 @WhiteHat 不错。我忘记了我的变量。它没有解决它,但仍然感谢QC。 在新加载的页面上像您一样获取现有函数输出,意味着该函数确实已声明并加载。您确实有一些未声明变量的问题,也在checking() 中,但这应该是浏览器的事情,无论您的应用程序托管在哪里,它都应该工作......您的浏览器是否提供任何反馈以说明原因函数没有运行? 【参考方案1】:

在 Heroku 上运行的 Rails 应用程序可能需要做一些工作才能让资产管道为自定义脚本提供服务。

您可以将脚本移动到 application.js 并检查它是否从那里运行。

如果您想将脚本保留在原处,请参阅Rails javascript asset missing after precompile

【讨论】:

感谢您的提示。但是,该脚本似乎存在,这可以通过它出现在 firebug 的脚本选项卡中以及 ruby​​ racer 在上面的 cmets 中提供的故障排除来证明。如果资产丢失,我认为这两种方法都行不通? ...但是,当我按照您的建议将脚本移动到 application.js 时,它似乎确实有效。我想这表明资产管道中缺少它。但它怎么会“丢失”但仍然出现在firebug的应用程序javascript文件中?

以上是关于单个 Javascript 函数在 Heroku 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

单个 Heroku 应用程序上的多个工作程序/Web 进程

您如何在单个 Heroku 测功机上运行多个 DelayedJob 工作人员?

是否可以跳过 Heroku 上的单个 git push 的资产预编译步骤?

Heroku(Cedar) + Node + Express + Jade 子目录中的客户端 javascript 文件在本地与 foreman+curl 一起工作,但在推送到 Heroku 时不能

如何在 Heroku 上的 Rails 4 中引用 javascript 中的图像

使用JavaScript函数从数组中获取单个对象[重复]