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);
,
Как отдельные файлы скрипт будет загружаться просто отлично, но как один отдельный файл вам нужны точки с запятой.
Возможно, вам придется еще раз проверить порядок, в котором вы объединяете файлы, это должно быть что-то вроде:
- jquery.min.js
- JQuery-ui.js
- любые сторонние плагины, которые вы загружаете
- ваш пользовательский 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 на наличие дополнительных параметров.