104

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

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

    Uncaught TypeError: undefined is not a function

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

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


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

4

13 回答 13

180

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

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

于 2012-06-04T15:42:27.117 回答
28

您可能需要重新检查合并文件的顺序,它应该类似于:

  1. jquery.min.js
  2. jquery-ui.js
  3. 您加载的任何第三方插件
  4. 你的自定义 JS
于 2012-05-03T10:53:23.463 回答
20

这个解决方案对我有用

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

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

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

在搜索太多之后

于 2014-11-08T18:02:58.350 回答
16

我有两次引用不同版本的 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>
于 2014-06-02T18:30:31.177 回答
7

我最近在使用jQuery Validation 插件时遇到了这个问题,使用Squishit,也得到了 js 错误:

“未定义不是函数”

我通过更改对未缩小的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 或您捆绑的任何东西。

于 2012-11-08T00:47:25.313 回答
6

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

例如:

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

固定的:

$('.icon').click(function() {
    $(this).fadeOut();
});
于 2014-07-05T22:25:42.773 回答
5

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

所以这:

isLive = isLive(data);

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

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

isItALive = isLive(data);

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

于 2013-08-30T07:58:12.787 回答
5

是的,我也修复了它在 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'作为未缩小的。

谢谢你的主意。

于 2014-04-21T23:31:23.773 回答
3

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

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

我的错误行是

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

并得到了同样的错误信息:

Uncaught TypeError: undefined is not a function

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

于 2015-03-05T09:00:18.917 回答
2

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

new

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

于 2014-07-07T13:45:54.700 回答
1

我刚刚收到了与以下代码相同的消息(在 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期望两个参数的函数,实际上没有cb在内部设置f,编译器正确地报告为undefined is not a function.

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

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

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

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

于 2013-02-03T22:19:24.410 回答
1

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

此外,当您进入控制台时,他们会列出您的错误,您应该一次处理一个。如果您看到“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 */

于 2014-06-13T19:29:49.350 回答
0

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

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

于 2015-08-20T19:59:52.397 回答