Uncaught TypeError: undefined не является функцией при загрузке jquery-min.js

Я создаю обычную веб-страницу, которая требует от меня загрузки около пяти CSS-файлов и десяти Javascript-файлов.

  • Когда я загружаю их отдельно в HTML-страницу, моя веб-страница загружается нормально.
  • Теперь для производства я объединил весь Javascript в один файл в нужном порядке и весь CSS в другой файл. Но когда я пытаюсь запустить веб-страницу с объединенными файлами, выдается сообщение об ошибке:

    Uncaught TypeError: undefined is not a function

На строке, где jquery.min.js загружается в объединенном файле Javascript.

Что я могу сделать, чтобы смягчить это? Я хочу объединить все файлы и минимизировать их для производства. Пожалуйста помоги.


РЕДАКТИРОВАТЬ: Я слил Javascript и CSS в том порядке, в котором они были, когда они загружались по отдельности и работали нормально.

13 ответов

Решение

Предполагая, что эта проблема все еще не решена, многие отдельные файлы не заканчивают свой код точкой с запятой. Большинство скриптов jQuery заканчиваются на (jQuery) и вам нужно иметь (jQuery);,

Как отдельные файлы скрипт будет загружаться просто отлично, но как один отдельный файл вам нужны точки с запятой.

Возможно, вам придется еще раз проверить порядок, в котором вы объединяете файлы, это должно быть что-то вроде:

  1. jquery.min.js
  2. JQuery-ui.js
  3. любые сторонние плагины, которые вы загружаете
  4. ваш пользовательский JS

Это решение сработало для меня

;(Функция ($){
        // ваш код
    })(Jquery);

Переместите свой код в замыкание и используйте $ вместо jQuery

Я нашел вышеуказанное решение в https://magento.stackexchange.com/questions/33348/uncaught-typeerror-undefined-is-not-a-function-when-using-a-jquery-plugin-in-ma

после сурка слишком много

Я получил ту же ошибку из-за двух ссылок на разные версии 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>

Недавно у меня была эта проблема с плагином jQuery Validation, использующим Squishit, также получающим ошибку js:

"undefined не является функцией"

Я исправил это, изменив ссылку на 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 или что-то, с чем вы связываете.

Для тех, кто до сих пор не может это исправить, я сделал это, изменив "this" на "$(this)" при использовании jQuery.

НАПРИМЕР:

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

Исправлена:

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

Да, я также исправил изменение в библиотеках js на unminified.

Например, в теге измените:

<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>

Выход из "мин" как неунифицированный.

Спасибо за идею.

Я столкнулся с той же проблемой, когда ошибочно назвал переменную с тем же именем, что и функция.

Итак, это:

isLive = isLive(data);

не удалось, генерируется упомянутое сообщение об ошибке OP.

Исправить это было так же просто, как изменить вышеуказанную строку на:

isItALive = isLive(data);

Я не знаю, насколько это помогает в этой ситуации, но я решил разместить этот ответ для других, ищущих решение для подобных проблем.

Помните: функции Javascript чувствительны к регистру.

У меня был случай, когда я почти уверен, что мой код будет работать гладко. Но все же, получил ошибку, и я проверил консоль Javascript Google Chrome, чтобы проверить, что это такое.

Моя строка ошибки

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

И получил то же сообщение об ошибке:

Uncaught TypeError: undefined is not a function

Ничто не кажется неправильным с кодом выше, но он не работал. Я устраняю неполадки в течение почти часа, а затем сравниваю его с моим другим работающим кодом. Моя ошибка в том, что он был установлен на SetAttribute, который должен быть setAttribute,

В случае, если есть какие-то дебилы, как я, у меня была эта неприятная проблема, потому что я забыл простой

new

Ключевое слово перед созданием нового объекта.

Я только что получил то же сообщение со следующим кодом (в 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

В общем случае я бы рекомендовал перепроверить сигнатуры функций и вызовы на соответствие арентности. Стек вызовов в сообщении об ошибке должен содержать полезные советы.

В вашем особом случае я рекомендую искать определения функций, появляющиеся дважды в объединенном файле, с разными сигнатурами или назначениями глобальных переменных, содержащих функции.

Убедитесь, что вы прокомментировали любые комментарии. Иногда при копировании и вставке вы пропускаете "/*!"

Также, когда вы заходите в консоль, они будут перечислять ваши ошибки, и вы должны принимать их по одной. Если вы видите "Uncaught SyntaxError: Неожиданный токен * ", это может означать, что он читает ваш js-файл и не выходит за первую строку.

/ *! * jquery.tools 1.1.2 - Отсутствующая библиотека пользовательского интерфейса для Интернета * * [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] * * Copyright (c) 2009 Tero Piirainen * http://flowplayer.org/tools/ * Файл сгенерирован: среда, 07 октября, 09:40:16 GMT 2009 */

Я получил это, когда случайно передал слишком много параметров в функцию jquery, которая ожидала только один параметр обратного вызова.

Для устранения других проблем: убедитесь, что вы проверяете все вызовы функций jquery на наличие дополнительных параметров.

Другие вопросы по тегам