Rails 4 - JavaScript 停止工作,得到:undefined is not a function

Rails 4 - JavaScript stopped working, getting: undefined is not a function

我有一个 Rails 应用程序,我在其中使用 gem chosen-rails(或选择-sass-bootstrap-rails ): 在我的 gemfile 我有这个:

gem 'chosen-sass-bootstrap-rails'

它以前可以工作,但现在我经常收到这个错误 - 我不确定为什么:

[Error] TypeError: undefined is not a function (evaluating '$('.chosen-  select').chosen({
  allow_single_deselect: true,
  no_results_text: 'No results matched',
  width: '100%'
})')

我的 application.js 看起来像这样:

//= require jquery
//= require jquery_ujs
//= require bootstrap

//= require jquery.turbolinks
//= require chosen-jquery
//= require scaffold
//= require jquery.purr
//= require best_in_place
//= require bootstrap-datepicker
//= require jquery-fileupload
//= require autocomplete-rails
//= require jquery-ui
//= require jquery.countdown
//= require autocomplete-rails
//= require bootstrapValidator.min

//= require turbolinks

//= require_tree .

并且在 application.css.scss 我有这一行:

*= require chosen_bootstrap

我的HTML(或(HAML)看起来像这样:

= select_tag "tag", options_from_collection_for_select(@team_tags, 'name', 'name', params[:tag]), prompt: "All tags", class: 'form-control chosen-select select-ideas-tag', onchange: "window.location.replace('/teams/#{@team.id}/tags/' + this.value + '?search=#{params[:search]}');"

我的 JS(或 CoffeeScript)看起来像这样:

# enable chosen js
$('.chosen-select').chosen
  allow_single_deselect: true
  no_results_text: 'No results matched'
  width: '100%'

知道为什么它不起作用吗?

更新

似乎不​​仅 chosen-rails 停止工作了,而且 JS 似乎也完全停止工作了。 None 我的库按预期工作。我曾尝试重建和清理我的资产,但没有帮助。

不确定是什么原因造成的,或者如何找到主要问题。

有什么想法吗?

可能的原因:

包括jquery并且在申请中选择了两次。重复包含任何一个都可能导致此错误。

你也可以试试这个,

//= require jquery

//= require jquery.turbolinks

//= require jquery_ujs

//= requi重新选择-jquery

//= require 脚手架

//= require jquery.purr

//= require jquery-ui

//= require bootstrap

//= require jquery.countdown

//= require turbolinks

//= require_tree .

为什么要求ui同时使用 jquery.turbolinks 和 turbolinks。您可以禁用 turbolinks 并检查吗?

您关于所有 JS 停止工作的建议表明您的初始化代码导致错误:它停止了对 JS 代码的所有进一步评估。该错误显示 'chosen- select' 之间有一些间距(多一点表示问题)。破折号和 'select' 之间可能有一个不可打印的字符吗?

我追查问题的顺序是:

  1. 首先检查 JS 是否正常工作,方法是在代码前后放置一个警告弹出窗口。但是似乎您的代码已达到。
  2. 您的初始化代码可能在错误的位置:Turbolinks 对初始化代码的位置有一些要求,但在您 运行 生产版本之前,这可能不是问题。
  3. 错误没有具体说明是哪一部分出了问题。甚至可能评估字符串中的 'select' 。通过首先分配绝对错误但可在参数哈希中识别的内容,拆分此命令以确保您不会跳得太快到正确的 属性。然后检查 #('chosen-select') 是否有可用的结果(您的视图可能会被破坏)。

请记住,如果此脚本崩溃并且是第一个初始化代码,则大多数 JS 可能不再被调用。

希望此信息能为您指明正确的方向....

原来我想包含 jQuery 两次。曾经在 application.html 中,也在 application.js 中。删除 application.html 中的那个使其工作。