JQuery - $ не определено


486

У меня есть простое событие jquery click

<script type="text/javascript">
    $(function() {
        $('#post').click(function() {
            alert("test"); 
        });
    });
</script>

и ссылка на jquery, определенная на сайте.

<script src="<%=ResolveUrl("~/Scripts/jquery-1.3.2.js")%>" type="text/javascript"></script>

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

$ не определено

и ни один из jquery не работает. Я также пробовал различные варианты этого, такие как $ (document) .ready, jQuery и т. Д.

Это приложение MVC 2 для .net 3.5, я уверен, что я очень плотный, везде на google говорят, чтобы проверить правильность ссылки на файл, который я проверил и проверил снова, пожалуйста, сообщите! : /


6
Вы действительно видите jquery-1.3.2.js, запрошенный и загруженный с кодом ответа HTTP200, если вы проверяете загрузку страницы с помощью инструмента Fiddler?
наивисты

18
ваш скрипт выполняется перед jquery?
Сурья

2
Можете ли вы просмотреть источник и нажать на ссылку JS. Похоже, ваш JQuery не загружен на странице. Попробуйте экран консоли Firebug, чтобы увидеть ошибки Попробуйте также ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js в своем теге скрипта
nemke

2
Ваш скрипт запускается до загрузки исходного кода jquery?
Дейв Бахер

1
@ Surya / Дэйв, я сейчас ухожу домой, так что завтра еще раз проверю, вернусь и отправлю сообщение, но я думаю, что, вероятно, проблема в том, как стыдно!
Пол Криси

Ответы:


560

Эта ошибка может быть вызвана только одной из трех причин:

  1. Ваш файл JavaScript неправильно загружается на вашу страницу
  2. У вас неверная версия jQuery. Это может произойти из-за того, что кто-то отредактировал основной файл, или плагин мог перезаписать переменную $.
  3. У вас работает JavaScript до полной загрузки страницы и до полной загрузки jQuery.

Прежде всего, убедитесь, что скрипт вызывается правильно, он должен выглядеть

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>

и не должно иметь атрибутов async или defer .

Затем следует проверить Firebug чистую панель , чтобы увидеть , если файл на самом деле загружается должным образом. Если нет, он будет выделен красным цветом и рядом с ним будет написано «404». Если файл загружается правильно, это означает, что проблема номер 2.

Убедитесь, что весь код jQuery javascript выполняется внутри блока кода, такого как:

$(document).ready(function () {
  //your code here
});

Это обеспечит загрузку вашего кода после инициализации jQuery.

Последнее, что нужно проверить, это убедиться, что вы не загружаете никаких плагинов перед загрузкой jQuery. Плагины расширяют объект "$", поэтому, если вы загрузите плагин перед загрузкой ядра jQuery, вы получите ошибку, которую вы описали.

Примечание. Если вы загружаете код, для запуска которого не требуется jQuery, его не нужно помещать в обработчик готовности jQuery. Этот код может быть отделен с помощью document.readyState.


182
Что касается вашего блока кода, то $(document)он также не будет работать, если у вас нет тега script, включающего jQuery, перед этим утверждением ...
PatrikAkerstrand

3
Я хотел бы добавить, что у меня была та же проблема, что и у OP, и моя проблема заключалась в том, что использование https с библиотекой jquery не работает так хорошо.
Майк Чил

20
(function ($) {}) (jQuery);
ДжекМахони

2
@Patrik: Смотрите мой ответ для решения с использованием раздела сценариев в представлении. Таким образом, jquery будет загружен первым и $ будет правильно определено.
angularsen

1
Проверьте, есть ли у вас асинхронный сценарий, вот что вызвало проблему в моем случае.
Андерс

207

Возможно, ваш тег script вызывается до вызова сценария jquery.

<script type="text/javascript" src="js/script.js"></script>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>

Этот результат как $ не определен

Поместите jquery.js перед тегом скрипта, и он будет работать;) примерно так:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>

<script type="text/javascript" src="js/script.js"></script>

1
Это отличный ответ. Я попробовал это, и это сработало для меня. Я использую VS 2013 и ASP.net. Знаете ли вы, как я могу загрузить javascript перед автоматической загрузкой страницы в asp.net или мне нужно ссылаться на javascript таким образом во всех моих файлах?
Пэт

Добавить к вашему ответу. В ASP.net вы можете перейти в Shared_Layout.cshtml `<head> </ head>`
Пэт

@pat и убедитесь, что вы пишете свой код внутри @section Scriptsтега
Marc

Обновите ответ, чтобы использовать HTTPS, и рассмотрите возможность использования SPI devdocs.io/html/attributes#integrity-attribute
Джош Хабдас

66

Для начала вам нужно убедиться, что скрипт jQuery загружен. Это может быть из CDN или локально на вашем сайте. Если вы сначала не загрузите его, прежде чем пытаться использовать jQuery, он скажет вам, что jQuery не определен.

<script src="jquery.min.js"></script>

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

Тогда вам нужно использовать одно из двух решений ниже

(function($){
// your standard jquery code goes here with $ prefix
// best used inside a page with inline code, 
// or outside the document ready, enter code here
 })(jQuery); 

или

jQuery(document).ready(function($){
// standard on load code goes here with $ prefix
// note: the $ is setup inside the anonymous function of the ready command
});

имейте в виду, что много раз $ (document) .ready (function () {// code here}); не будет работать.


1
msgstr "jQuery не определен". Однако существует после загрузки страницы.
Пол Тоцке

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

Извините, я думал, что это техника, в которой вы можете использовать сценарии в любом порядке. Да, я использовал это в разделе тела в стиле MVC. mycode.js, то jQuery.js - это две последние вещи на странице.
Пол Тоцке,

Не беспокойся, Пол, я отредактировал решение так, чтобы оно включало фразу «ты должен ... загрузить первым». :)
Эндрю Киллен

Устраняет ли это проблему «Мои сценарии находятся в правильном порядке, но сценарии загружаются в другом порядке». Я помню, как делал это 4 года назад, но не могу вспомнить, какую проблему это решило.
Пол Тоцке

50

Если вызов плагина jQuery находится рядом с </body>, и ваш скрипт загружается до этого, вы должны заставить свой код запускаться после window.onloadсобытия, например так:

window.onload = function() {
  //YOUR JQUERY CODE
}

`

Итак, ваш код будет работать только после загрузки окна, когда все ресурсы будут загружены. В этой точке $будет определен jQuery ( ).

Если вы используете это:

$(document).ready(function () {
  //YOUR JQUERY CODE
});

`

В настоящее время $он еще не определен, потому что он вызывается до загрузки jQuery, и ваш скрипт потерпит неудачу в первой строке консоли.


Вообще плохая идея привязать к window.unload. Это будет фактически единственное мероприятие, которое проходит !!!
Руди Стридом

Примечание: Помните, что вы можете назначить только одну функцию window.onload, если вы назначите ей другую функцию, предыдущая не будет выполнена.
Бруно Перес

28

Я просто сделал то же самое и обнаружил, что у меня было много

type="text/javacsript"

Таким образом, они загружались, но больше никаких намеков на то, почему это не работает. Само собой разумеется, правильное правописание исправило это.


Примечание модератора : опечатка в этом сообщении является преднамеренной , чтобы проиллюстрировать точку зрения. Пожалуйста, не редактируйте сообщение, чтобы «исправить» это.
Мартин Питерс

23

Используйте раздел скриптов в представлении и макете мастера.

Поместите все ваши сценарии, определенные в вашем представлении, в раздел вида Scripts. Таким образом, вы можете загрузить основной макет после загрузки всех других скриптов. Это настройка по умолчанию при запуске нового веб-проекта MVC5. Не уверен насчет более ранних версий.

Просмотров / Foo / MyView.cshtml:

// The rest of your view code above here.

@section Scripts 
{ 
    // Either render the bundle defined with same name in BundleConfig.cs...
    @Scripts.Render("~/bundles/myCustomBundle")

    // ...or hard code the HTML.
    <script src="URL-TO-CUSTOM-JS-FILE"></script>

    <script type="text/javascript">
      $(document).ready(function () {

        // Do your custom javascript for this view here. Will be run after 
        // loading all the other scripts.            
      });
    </script>
}

Views / Shared / _Layout.cshtml

<html>
<body>
    <!-- ... Rest of your layout file here ... -->

    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
</body>
</html>

Обратите внимание, как секция скриптов отображается последней в главном файле макета.


2
Примечание: разделы вида не поддерживаются в частичных видах по конструкции.
Адам Нейлор

Это то, что я должен был сделать для своего исправления .... и я должен был знать, что лучше использовать @Scripts, но забыл об этом, пока не искал исправление.
Caverman

12

убедитесь, что вы действительно загружаете jquery, это не jquery - это пользовательский интерфейс!

  <script language="JavaScript" 
    src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.0/jquery-ui.min.js">
  </script>

Это правильный источник скрипта для jquery:

 <script language="JavaScript"  src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>

11

Как указано выше, это происходит из-за конфликта переменной $.

Я решил эту проблему, сохранив вторичную переменную для jQuery без конфликта.

var $j = jQuery.noConflict();

а затем использовать его где угодно

$j( "div" ).hide();

более подробную информацию можно найти здесь


8

Это означает, что ваша библиотека jQuery еще не загружена.

Вы можете переместить свой код после использования библиотеки jQuery.

или вы можете использовать что-то вроде этого

window.onload = function(){
  // Your code here
};  

Это срабатывает после загрузки DOM, но не после загрузки элементов управления, javascript и других программ, работающих в фоновом режиме. Для этого нужно будет использовать задержку.
Fandango68


5

после нескольких тестов я нашел быстрое решение, вы можете добавить в верхней части страницы индекса:

<script>
$=jQuery;
</script>

это работает очень хорошо :)


4
вопрос был: $ не определено, нет?
Мимуни

Uncaught ReferenceError: jQuery не определен
Саймон Шнелл

Вы поместили это прямо под импортом библиотеки jQuery?
Майк Уоррен

4

Я получил то же сообщение об ошибке, когда неправильно написал ссылку на jQuery, и вместо этого type="text/javascript"набрал «... javascirpt». ;)


Эврика! У меня был мой как type="text/css". Спасибо за сохранение моего здравомыслия!
Джерико

Я лох и имел type="javascript". Потратил 30 минут на поиски.
масон

4

Похоже, JQuery не загружается должным образом. Какой источник / версию вы используете?

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


3

Эта ошибка означает, что jQuery еще не загружен на странице. Использование $(document).ready(...)или любой его вариант не принесет пользы, как $и функция jQuery.

Использование window.onloadдолжно работать здесь. Обратите внимание, что только одна функция может быть назначена window.onload. Чтобы не потерять оригинальную логику загрузки, вы можете украсить оригинальную функцию следующим образом:

originalOnload = window.onload;
window.onload = function() {
  if (originalOnload) {
    originalOnload();
  }
  // YOUR JQUERY
};

Это выполнит функцию, которая была первоначально назначена window.onload, и затем выполнится // YOUR JQUERY.

См. Https://en.wikipedia.org/wiki/Decorator_pattern для более подробной информации о шаблоне декоратора.


2

Я использую Url.Content и никогда не имею проблем.

<script src="<%= Url.Content ("~/Scripts/jquery-1.4.1.min.js") %>" type="text/javascript"></script>

2

В решении упоминается: «Последнее, что нужно проверить, это убедиться, что вы не загружаете какие-либо плагины перед загрузкой jQuery. Плагины расширяют объект« $ », поэтому, если вы загружаете плагин перед загрузкой ядра jQuery, то вы вы получите ошибку, которую вы описали. "

Чтобы избежать этого -

Многие библиотеки JavaScript используют $ как имя функции или переменной, как это делает jQuery. В случае jQuery $ - это псевдоним для jQuery, поэтому все функции доступны без использования $. Если нам нужно использовать другую библиотеку JavaScript вместе с jQuery, мы можем вернуть управление $ back другой библиотеке с помощью вызова $ .noConflict ():


1

У меня была эта проблема однажды без видимой причины. Это происходило локально, пока я работал через сервер разработки aspnet. Это сработало, и я вернул все в состояние, в котором он ранее работал, и все же он не работал. Я заглянул в отладчик chrome и jquery-1.7.1.min.js загрузился без проблем. Это было все очень запутанно. Я до сих пор не знаю, в чем проблема, но закрываю браузер, закрываю сервер разработки, а затем снова пытаюсь разобраться с этим.


1

Просто поместите URL JQuery в верхней части вашего кода JQuery

нравится--

<script src="<%=ResolveUrl("~/Scripts/jquery-1.3.2.js")%>" type="text/javascript"></script>

<script type="text/javascript">
    $(function() {
        $('#post').click(function() {
            alert("test"); 
        });
    });
</script>

1

У меня была та же самая проблема, и это было, потому что моя ссылка на jQuery.js не была в теге. Как только я это переключил, все начало работать.

Энтони


1
  1. Проверьте точный путь вашего файла JQuery включен.

    <script src="assets/plugins/jquery/jquery.min.js"></script>

если вы добавите это внизу вашей страницы, пожалуйста, все вызовите функцию JS ниже этой декларации.

  1. Проверьте с помощью этого теста кода,

    <script type="text/javascript">
    /***
     * Created by dadenew
     * Submit email subscription using ajax
     * Send email address
     * Send controller
     * Recive response
     */
    $(document).ready(function() { //you can replace $ with Jquery
    
      alert( 'jquery working~!' );
    });

Мир!


0

У нас та же проблема .... но я случайно проверил свойства папки и что-то установил ...

Вы должны проверить свойства каждой папки, к которой вы обращаетесь.

  1. папка правой кнопкой мыши
  2. вкладка "разрешения"
  3. установить доступ к папке: ВЛАДЕЛЕЦ: создание и удаление файлов ГРУППА: доступ к файлам ДРУГИЕ: доступ к файлам

Я надеюсь, что это решение ......


0

При использовании jQuery в asp.net, если вы используете главную страницу и загружаете туда исходный файл jquery, убедитесь, что у вас есть заголовок contentplaceholder после всех ссылок на скрипт jquery.

У меня была проблема, когда любые страницы, которые использовали эту мастер-страницу, возвращали бы '$ is notfined' просто потому, что из-за неправильного порядка выполнялся код на стороне клиента до создания объекта jquery. Поэтому убедитесь, что у вас есть:

<head runat="server">
    <script type="text/javascript" src="Scripts/jquery-VERSION#.js"></script>
    <asp:ContentPlaceHolder id="Header" runat="server"></asp:ContentPlaceHolder>
</head>

Таким образом, код будет работать по порядку, и вы сможете запускать код jQuery на дочерних страницах.


0

В моем случае я указывал на Google JQuery. Он был включен правильно, но я был на странице HTTPS и звонил по HTTP. Как только я исправил проблему (или допустил небезопасный контент), он сразу же запустился.


0

У меня была такая же проблема, и я не мог понять, что ее вызвало. Я недавно преобразовал свои HTML-файлы с японского в UTF-8, но я ничего не делал с файлами сценариев. Каким-то образом jquery-1.10.2.min.js повредился в этом процессе (я до сих пор не знаю, как). Замена jquery-1.10.2.min.js оригиналом исправила его.


0

Похоже, что если вы разместите ваши файлы jquery.js в той же папке или в некоторых подпапках, где находится ваш html-файл, проблема Firebug будет решена. Например, если ваш html-файл находится в C: / folder1 /, то ваши js-файлы должны быть где-то в C: / folder1 / (или C: / folder1 / folder2 и т. д.), а также соответствующим образом указаны в html doc. надеюсь это поможет.


0

У меня та же проблема, и ни в коем случае я не могу ее решить. Единственное, что работает для меня, это положить в файл Site.master, следующее:

<script src="<%= ResolveUrl("~/Scripts/jquery-1.7.1.min.js") %>" type="text/javascript"></script>
<script src="<%= ResolveUrl("~/Scripts/bootstrap/js/bootstrap.min.js") %>" type="text/javascript"></script>

При src = "<% = ResolveUrl (" ") ... загрузка jQuery на страницах контента правильная.


0

У меня была очень похожая проблема. В моем приложении C # MVC JQuery не распознавался. Мне нужно было переместить @ Scripts.Render ("~ / bundles / jquery") из нижней части моего файла _Layout.cshtml в начало раздела. Также убедитесь, что вы взяли Jquery как пакет Nuget, если вы используете visual studio!

<head>
    @Scripts.Render("~/bundles/jquery")
</head>

0

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

Перейдите в Views \ Shared_Layout.html и добавьте следующее

<head>
  <*@ Omitted code*@>
  <script src="~/Scripts/jquery-1.10.2.min.js" type="text/javascript"></script>
</head>

0

если scriptтег имеет deferатрибут, он показывает ошибку

Uncaught ReferenceError: $ не определено

и должен удалить атрибут deferиз scriptтега


0

Это общая проблема, чтобы решить эту проблему, вы должны проверить

  1. Включить основную библиотеку Jquery
  2. Проверьте кросс-браузерную проблему
  3. Добавить библиотеку в ТОП кода jquery
  4. Проверьте, что CDN могут быть заблокированы.

Полная информация дана в этом блоге, нажмите здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.