未捕获的TypeError:加载jquery-min.js时未定义函数


104

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

  • 当将它们分别加载到HTML页面中时,我的网页加载正常。
  • 现在进行生产时,我将所有Javascript按所需的顺序连接到一个文件中,并将所有CSS连接到另一个文件中。但是,当我尝试使用串联文件运行网页时,会引发错误消息:

    Uncaught TypeError: undefined is not a function

在串联的Javascript文件中加载jquery.min.js的行中。

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


编辑:我按照它们分别加载时的顺序合并了Javascript和CSS,并能正常工作。


5
undefined如果您没有要显示的代码,我们怎么知道?
约瑟夫

该未定义出现在即时载入的jquery-1.6.1.min.js中。也许jQuery没有正确加载或什么?
ghostCoder 2012年

接受排名最高的答案吗?
Allisone 2013年

Answers:


179

假设此问题仍未解决,那么许多单个文件的代码都不会以分号结尾。大多数jQuery脚本都以结尾,(jQuery)而您需要拥有(jQuery);

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


18
+1。串联JavaScript代码时,始终应以分号将它们连接起来。它们中的太多仍然有效,而导致错误的可能性降低。
Bergi 2012年

9
调试起来非常棘手。感谢您提供真正有效的答案!
ghayes,2012年

5
Bootstrap的js就是一个这样的例子,显然。谢谢你!那真是个方便面。
凯文·比尔2013年

我正在尝试导入youtube iframe API,但它没有以分号结尾,并且出现此错误。我没有将它与任何东西串联起来...我正在用jQuery.getScript()加载它。所以...这可能是导致我出错的原因吗?还是没有道理?
丹尼尔(Daniel)

1
如果在使用库时看到此错误,我们该如何解决?我正在尝试使用2.3.2 / js / bootstrap.min.js和/1.4.6/bootstrap-editable/js/bootstrap-editable.min.js
codeObserver 2014年

28

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

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

像这样只有json2.js,jquery-1.6.1.min.js,jquery插件,我的代码。其顺序。
ghostCoder 2012年

如果json2.js使用任何jquery函数,则应优先使用jquery.min.js。我会建议。jquery.min.js,jqueryPlugins,json2.js,我的代码。
Bilal Murtaza,2012年


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>

7

我最近使用SquishitjQuery Validation插件遇到了这个问题,也收到了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或与之捆绑的任何东西。


使用未压缩版本只是我的门票-谢谢。
保罗·迪恩

对我来说,这是导致问题的NuGet软件包1.0.2版本中的json2.min.js文件。我将其切换到非Min文件,并且Squishit组合文件现在可以正常工作。
billoreid 2013年

6

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

例如:

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

固定:

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

5

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

所以这:

isLive = isLive(data);

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

解决此问题的方法很简单,只需将上述行更改为:

isItALive = isLive(data);

我不知道在这种情况下有什么帮助,但是我决定将这个答案提供给其他寻求类似问题解决方案的人。


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”最小化。

谢谢你的主意。


3

切记:Javascript函数区分大小写。

我曾经确信我的代码可以顺利运行。但是仍然出现错误,我检查了Google Chrome浏览器的Javascript控制台以检查它是什么。

我的错误行是

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

并得到了相同的错误消息:

Uncaught TypeError: undefined is not a function

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


2

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

new

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


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。错误消息中的调用堆栈应该能够提供有用的提示。

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


1

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

同样,当您进入控制台时,他们将列出您的错误,您应该一次执行一次。如果看到“未捕获的SyntaxError:意外的令牌*”,则可能表示它正在读取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日星期三GMT * /


0

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

对于其他疑难解答:确保检查所有jquery函数调用中是否包含其他参数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.