Javascript 通过Getscript检索的脚本以静默方式失败-如何对此进行故障排除?

Javascript 通过Getscript检索的脚本以静默方式失败-如何对此进行故障排除?,javascript,jquery,ruby-on-rails,Javascript,Jquery,Ruby On Rails,我在加载页面后运行脚本。这不能通过预编译的资产管道完成,因为脚本中使用了在页面加载时控制器中生成的ruby变量。下面是我如何调用脚本的简化版本: <script type='text/javascript' charset='utf-8'> var url = "/assets/foo/bar.js"; $(window).on('load', function(){ console.log('page-loaded and url is: ' + url);

我在加载页面后运行脚本。这不能通过预编译的资产管道完成,因为脚本中使用了在页面加载时控制器中生成的ruby变量。下面是我如何调用脚本的简化版本:

<script type='text/javascript' charset='utf-8'>
  var url = "/assets/foo/bar.js";
  $(window).on('load', function(){
    console.log('page-loaded and url is: ' + url);
    $.getScript( url, function() {
      console.log('loaded bar.js');
    });
  });
</script>

var url=“/assets/foo/bar.js”;
$(窗口).on('load',function(){
log('页面加载,url为:'+url);
$.getScript(url,函数(){
log('loaded bar.js');
});
});
其行为是在页面加载时触发第一个console.log,但getScript中的第二个永远不会运行

由于我在第一个控制台日志中显示了url,我可以获取控制台输出中显示的值,将其粘贴到浏览器的地址栏(在域名之后),并成功地将脚本作为文本加载到页面中,因此url引用没有问题

接下来,我将脚本(本例中为bar.js)简化为一个输出ruby变量的console.log语句。这是可行的,所以在我的原始js中肯定有错误,但在任何控制台输出中都没有显示错误

如果javascript控制台(在firefox开发工具中)或rails控制台中都没有出现错误类型/行,那么如何对该javascript进行故障排除?Rails是否将错误记录在其他地方

请注意,在rails控制台中没有任何迹象表明getScript做了/加载了任何事情——无论是使用工作脚本还是神秘的中断脚本,如果这是一个ajax调用,就会出现如下问题:

我没有包括js文件,因为如果我能得到关于错误性质的反馈,我不需要帮助解决javascript故障。如何让错误显示在某个地方

编辑-我尝试内联粘贴脚本,以代替“getScript”调用。它仍然默默地失败。唯一的区别是,我从脚本中获得了第一个console.log()输出,以及分页符上的一些其他内容,这些内容在以前工作过,表明存在js错误,这仍然是一个未报告的谜

编辑#2:

@jfriend00 suggestion#9中的三个错误是:

语法错误:缺少;声明前
堆栈跟踪:

.globalEval/由于我们无法真正了解问题的原因,因此我们最好列出一系列内容供您检查:

  • 脚本是否正在执行任何
    document.write()
    调用,因为在文档完成加载后执行此操作将清除当前文档并隐藏正在发生的事情

  • 您正在加载的脚本除了定义等待调用的函数外,是否可能实际上不执行任何操作

  • 您是否尝试过使用静态脚本标记加载脚本,只是为了看看它是否可以这样工作?这也将使它处于顶层(而不是
    $.getScript()
    的内部),在那里您可能更容易看到任何脚本错误

  • 当传递到
    $.getScript()
    时,您是否200%确定路径正确

  • 您是否查看了Chrome调试器中的“网络”选项卡以查看服务器实际请求和返回的内容?您应该看到请求发出,响应返回

  • 如果文件的旧版本(可能是空版本)卡在缓存中,您是否已清除浏览器缓存?Chrome中的“网络”选项卡还将告诉您文件是从服务器还是从缓存加载的。您可以在URL中添加一个随机数以取消缓存:

    var url=“/assets/foo/bar.js?”+Math.random();

  • 这需要一些时间,但您可以在未具象化版本的jQuery中单步执行
    $.getScript()
    。您必须确定在何处设置断点,因为响应是异步返回的,但这最终会让您确切地看到它得到了什么响应以及该响应在做什么

  • 如果将完成回调作为第二个参数放在
    $.getScript()
    上,那么该回调报告的参数是什么

    $.getScript(url、函数(数据、文本状态、jqXhr){
    console.log(textStatus);
    控制台日志(数据);
    console.log(jqXhr);
    });

  • 如果在
    $.getScript()
    上设置错误处理程序,是否会调用该错误处理程序

    $.getScript(url).fail(函数(jqxhr、设置、异常){
    console.log(异常);
    console.log(jqxhr);
    控制台日志(设置);
    });

  • 如果已确定脚本正在开始执行,但随后失败,则可以调试该脚本
  • 语句,这样您就可以准确地看到它正在走多远,并迭代到一个越来越精细的行号级别,直到您精确地缩小失败的地方(基本上是二进制搜索)

  • 您还可以在脚本顶部附近的动态加载脚本中放置一个
    debugger;
    语句来触发调试器,然后您可以逐步检查脚本的其余部分,查看它在哪里失败


  • 添加了更多调试想法。1.否;2.否;3.尝试内联(请参见编辑);4->6.通过network 200成功验证“”-rails使用param;8->11击败缓存看起来是唯一的调试方法。我以前没有见过这些想法。谢谢。将此标记为“答案”因为它为完全没有理智的错误报告提供了一些有用的解决办法,因为没有其他人愿意尝试,因为诚实的“没有答案存在”意味着没有人会在未来帮助我。我的许多难题都是风滚草,大多数人都会在我的个人资料中看到这一点,并寻找“更容易的要点”而不是挑战。感谢jfriend00,感谢你们的投入和勇气。
    SyntaxError: missing ; before statement
    
    Stack trace:
    .globalEval/<@http://127.0.0.1:3000/assets/jquery.js?body=1:339:5
    .globalEval@http://127.0.0.1:3000/assets/jquery.js?body=1:340:1
    .converters["text script"]@http://127.0.0.1:3000/assets/jquery.js?body=1:9739:4
    ajaxConvert@http://127.0.0.1:3000/assets/jquery.js?body=1:8809:8
    done@http://127.0.0.1:3000/assets/jquery.js?body=1:9226:4
    .send/callback@http://127.0.0.1:3000/assets/jquery.js?body=1:9686:8
     new:234
    Object { readyState: 4, getResponseHeader: .ajax/jqXHR.getResponseHeader(), getAllResponseHeaders: .ajax/jqXHR.getAllResponseHeaders(), setRequestHeader: .ajax/jqXHR.setRequestHeader(), overrideMimeType: .ajax/jqXHR.overrideMimeType(), statusCode: .ajax/jqXHR.statusCode(), abort: .ajax/jqXHR.abort(), state: .Deferred/promise.state(), always: .Deferred/promise.always(), then: .Deferred/promise.then(), 11 more… } new:235
    
    "parsererror"