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

104

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

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

    Uncaught TypeError: undefined is not a function

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

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


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

ghostCoder
источник
5
как мы можем узнать, что происходит, undefinedесли у вас нет кода для показа?
Джозеф
undefined входит в jquery-1.6.1.min.js, который загружается. может быть, jquery не загружается должным образом или что-то в этом роде?
ghostCoder
может быть, принять высокопоставленный ответ?
Allisone

Ответы:

179

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

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

Дастин
источник
18
+1. При объединении кода JavaScript вы всегда должны соединять их точкой с запятой. Слишком многие из них по-прежнему действительны, а меньшее приводит к ошибкам.
Bergi
9
Это невероятно сложно отладить. Спасибо за действительно эффективный ответ!
ghayes
5
Очевидно, Bootstrap js является одним из таких примеров. Спасибо за это! Это была настоящая чесалка для лапши.
Кевин Бил
Я пытаюсь импортировать API-интерфейс iframe youtube, и он не заканчивается точкой с запятой, и я получаю эту ошибку. Я не связываю его ни с чем ... Я загружаю его с помощью jQuery.getScript (). Итак ... Может ли это быть причиной моей ошибки? Или в этом нет смысла?
Дэниел
1
Как решить эту проблему, если мы видим эту ошибку при работе с библиотекой? Я пытаюсь использовать 2.3.2 / js / bootstrap.min.js и /1.4.6/bootstrap-editable/js/bootstrap-editable.min.js
codeObserver
28

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

  1. jquery.min.js
  2. jquery-ui.js
  3. любые сторонние плагины, которые вы загружаете
  4. ваш собственный JS
Билал Муртаза
источник
это похоже только на json2.js, jquery-1.6.1.min.js, плагины jquery, мой код. это в этом порядке.
ghostCoder
если json2.js использует любую функцию jquery, то первым должен быть jquery.min.js. я бы предложил. jquery.min.js, jqueryPlugins, json2.js, мой код.
Билал Муртаза
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>
scw
источник
7

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

Ральф Лавель
источник
Использование unminified версии было для меня билетом - спасибо.
Пол Дин
Для меня это был файл json2.min.js из версии 1.0.2 пакета NuGet, который вызывал проблему. Я переключил его на файл без min, и теперь комбинированный файл Squishit работает нормально.
billoreid
6

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

НАПРИМЕР:

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

Исправлена:

$('.icon').click(function() {
    $(this).fadeOut();
});
разъем
источник
5

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

Итак, это:

isLive = isLive(data);

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

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

isItALive = isLive(data);

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

Trejder
источник
5

Да, я также исправил изменение в библиотеках 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>

Выход из "мин" без миниатюр.

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

Франсиско Алонсо
источник
3

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

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

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

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

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

Uncaught TypeError: undefined is not a function

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

Логан Уэйн
источник
2

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

new

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

CodyBugstein
источник
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

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

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

Йенс Йенсен
источник
1

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

Также, когда вы заходите в консоль, они перечисляют ваши ошибки, и вы должны делать это по очереди. Если вы видите «Uncaught SyntaxError: Unexpected token *», это может означать, что он читает ваш файл 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] * * Авторские права (c) 2009 Tero Piirainen * http://flowplayer.org/tools/ * Файл создан: среда, 7 октября, 09:40:16 по Гринвичу 2009 г. * /

Таша
источник
0

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

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

JSideris
источник