【问题标题】:Uncaught TypeError: undefined is not a function on loading jquery-min.jsUncaught TypeError: undefined is not a function on loading jquery-min.js
【发布时间】:2012-05-12 21:03:02
【问题描述】:

我正在构建一个普通的网页,需要加载大约 5 个 CSS 文件和 10 个 Javascript 文件。

  • 在 HTML 页面中单独加载它们时,我的网页可以正常加载。
  • 现在为了生产,我按照需要的顺序将所有 Javascript 连接到一个文件中,并将所有 CSS 连接到另一个文件中。但是当我尝试使用连接的文件运行网页时,它会抛出一个错误:

    Uncaught TypeError: undefined is not a function

在连接的 Javascript 文件中加载 jquery.min.js 的那一行。

我能做些什么来缓解这种情况?我想连接所有文件并缩小它们以进行生产。请帮忙。


编辑:我将 Javascript 和 CSS 按它们单独加载并且工作正常时的顺序合并。

【问题讨论】:

  • 如果您没有可显示的代码,我们如何知道undefined 是什么?
  • 未定义将出现在我正在加载的 jquery-1.6.1.min.js 中。也许 jquery 没有正确加载或什么?
  • 我认为这个问题不够清晰/狭窄。这是基于这样一个事实,即一些答案已经超出了 OP 问题的范围。此页面需要一些 TLC。要么问题需要澄清编辑,要么需要清除/移动这些不同的答案。

标签: javascript jquery minify


【解决方案1】:

您可能需要重新检查合并文件的顺序, 它应该是这样的:

  1. jquery.min.js
  2. jquery-ui.js
  3. 您加载的任何第三方插件
  4. 你的自定义 JS

【讨论】:

  • 只有 json2.js、jquery-1.6.1.min.js、jquery 插件、我的代码这样的。它按这个顺序。
  • 如果 json2.js 正在使用任何 jquery 函数,那么 jquery.min.js 应该是第一个。我会建议。 jquery.min.js,jqueryPlugins,json2.js,我的代码。
【解决方案2】:

假设这个问题仍然没有解决,很多单独的文件不会用分号结束它们的代码。大多数 jQuery 脚本以 (jQuery) 结尾,您需要有 (jQuery);

作为单独的文件,脚本可以正常加载,但作为一个单独的文件,您需要分号。

【讨论】:

  • +1。当连接 JavaScript 代码时,你总是应该用分号连接它们。它们中的太多仍然有效,而导致错误的可能性较小。
  • Bootstrap 的 js 显然就是这样一个例子。谢谢你!那是一个真正的面条刮刀。
  • 我正在尝试导入 youtube iframe API,但它没有以分号结尾,我收到了这个错误。我没有将它与任何东西连接...我正在使用 jQuery.getScript() 加载它。所以......这可能是导致我的错误的原因吗?还是没有意义?
  • 有人能解释一下这是什么意思吗?我只是在导入 JQUery、Bootstrap 和我编写的一个文件,所有这些都以分号结尾。那么是什么导致了错误呢?
  • 如果在使用库时看到此错误,我们该如何解决?我正在尝试使用 2.3.2/js/bootstrap.min.js 和 /1.4.6/bootstrap-editable/js/bootstrap-editable.min.js
【解决方案3】:

我最近用jQuery Validation plug-in遇到了这个问题,使用Squishit,也得到了js错误:

“未定义不是函数”

我通过更改对 unminified jquery.validate.js 文件而不是 jquery.validate.min.js 文件的引用来修复它。

@MvcHtmlString.Create(
    @SquishIt.Framework.Bundle.JavaScript()
        .Add("~/Scripts/Libraries/jquery-1.8.2.min.js")
        .Add("~/Scripts/Libraries/jquery-ui-1.9.1.custom.min.js")
        .Add("~/Scripts/Libraries/jquery.unobtrusive-ajax.min.js")
        .Add("~/Scripts/Libraries/jquery.validate.js")
        .Add("~/Scripts/Libraries/jquery.validate.unobtrusive.js")
         ... more files

我认为某些文件的缩小版本,例如,当使用 Squishit 进一步压缩时,在某些情况下可能无法处理缺少的分号等,正如@Dustin 所建议的那样,因此您可能需要尝试使用哪个你可以双重压缩的文件,你只需将它们留给 Squishit 或任何你捆绑的东西。

【讨论】:

  • 使用未缩小版对我来说只是门票 - 谢谢。
  • 对我来说,是 NuGet 包 1.0.2 版中的 json2.min.js 文件导致了问题。我将它切换到非最小文件,现在 Squishit 组合文件工作正常。
【解决方案4】:

我刚刚收到以下代码(在 IcedCoffeeScript 中)的相同消息:

f = (err,cb) ->
  cb null, true

await f defer err, res
console.log err if err  

在我看来,这就像常规的 ICS 代码。我将 await-defer 结构展开为常规 CoffeeScript:

f (err,res) ->
  console.log err if err

真正发生的事情是,我试图将 1 个回调函数(带有 2 个参数)传递给函数 f,需要两个参数,实际上没有在 f 内设置 cb,编译器正确地将其报告为 undefined is not a function

错误的发生是因为我盲目地粘贴了回调样式的样板代码。 f 不需要传入 err 参数,因此应该是:

f = (cb) ->
  cb null, true
f (err,res) ->
  console.log err if err

在一般情况下,我建议仔细检查函数签名和调用是否匹配 arities。错误消息中的调用堆栈应该能够提供有用的提示。

在您的特殊情况下,我建议寻找在合并文件中出现两次的函数定义,具有不同的签名,或分配给保存函数的全局变量。

【讨论】:

    【解决方案5】:

    当错误地将具有相同名称的变量命名为函数时,我遇到了同样的问题。

    所以这个:

    isLive = isLive(data);
    

    失败,生成 OP 提到的错误消息。

    解决这个问题就像将上面的行更改为:

    isItALive = isLive(data);
    

    我不知道,在这种情况下它有多大帮助,但我决定将此答案提供给其他寻找类似问题解决方案的人。

    【讨论】:

      【解决方案6】:

      是的,我也修复了它在 js 库中更改为未缩小的。

      例如,在标签中,更改:

      <script type="text/javascript" src="js/jquery.ui.core.min.js"></script>
      <script type="text/javascript" src="js/jquery.ui.widget.min.js"></script>
      <script type="text/javascript" src="js/jquery.ui.rcarousel.min.js"></script>
      

      为:

      <script type="text/javascript" src="js/jquery.ui.core.js"></script>
      <script type="text/javascript" src="js/jquery.ui.widget.js"></script>
      <script type="text/javascript" src="js/jquery.ui.rcarousel.js"></script>
      

      以未缩小的形式退出'min'。

      感谢您的想法。

      【讨论】:

        【解决方案7】:

        两次引用不同版本的 jQuery 时,我遇到了同样的错误。

        在我的母版页中:

        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
        

        还有在页面上:

        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"> </script>
        

        【讨论】:

          【解决方案8】:

          确保您已注释掉所有评论。有时在复制和粘贴时,您会遗漏“/*!”

          此外,当您进入控制台时,它们会列出您的错误,您应该一次处理一个。如果您看到“Uncaught SyntaxError: Unexpected token *”,这可能意味着它正在读取您的 js 文件并且它没有超过第一行。

          /*! * jquery.tools 1.1.2 - Web 缺少的 UI 库 * * [tools.tabs-1.0.4,tools.tooltip-1.1.2,tools.scrollable-1.1.2,tools.overlay-1.1.2,tools.expose-1.0.5] * * 版权所有 (c) 2009 Tero Piirainen * http://flowplayer.org/tools/ * 文件生成时间:2009 年 10 月 7 日星期三 09:40:16 GMT */

          【讨论】:

            【解决方案9】:

            对于那些仍然无法解决此问题的人,我在使用 jQuery 时将“this”更改为“$(this)”。

            例如:

            $('.icon').click(function() {
                this.fadeOut();
            });
            

            固定:

            $('.icon').click(function() {
                $(this).fadeOut();
            });
            

            【讨论】:

              【解决方案10】:

              如果有像我这样的白痴,我会遇到这个令人沮丧的问题,因为我忘记了一个简单的

              new

              实例化新对象之前的关键字。

              【讨论】:

                【解决方案11】:

                这个解决方案对我有用

                ;(函数($){ // 你的代码 })(jQuery);

                将代码移到闭包内并使用 $ 而不是 jQuery

                我在https://magento.stackexchange.com/questions/33348/uncaught-typeerror-undefined-is-not-a-function-when-using-a-jquery-plugin-in-ma找到了上面的解决方案

                搜索太多

                【讨论】:

                  【解决方案12】:

                  记住:Javascript 函数是区分大小写的。

                  我有一个案例,我很确定我的代码会顺利运行。但是,仍然出现错误,我检查了 Google Chrome 的 Javascript 控制台 以检查它是什么。

                  我的错误行是

                  opt.SetAttribute("value",values[a]);
                  

                  得到了同样的错误信息:

                  Uncaught TypeError: undefined is not a function
                  

                  上面的代码似乎没有问题,但它没有运行。我排查了将近一个小时,然后将其与我的其他运行代码进行了比较。我的错误是设置为SetAttribute,应该是setAttribute

                  【讨论】:

                    【解决方案13】:

                    当我不小心将太多参数传递给一个只需要一个回调参数的 jquery 函数时,我得到了这个。

                    对于其他故障排除:确保检查所有 jquery 函数调用是否有额外参数。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2014-06-28
                      • 1970-01-01
                      • 1970-01-01
                      • 2014-09-09
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多