JQuery - $ não está definido

486

Eu tenho um evento simples de jquery click

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

e uma referência de jquery definida no site.master

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

Verifiquei se o script está sendo resolvido corretamente, consigo ver a marcação e visualizá-lo diretamente no firebug, por isso devo estar sendo encontrado. No entanto, ainda estou recebendo:

$ não está definido

e nenhum do jquery funciona. Eu também tentei as várias variações disso como $ (document) .ready e jQuery etc.

É um aplicativo MVC 2 no .net 3.5, tenho certeza de que estou sendo muito denso, em todos os lugares do google diz para verificar se o arquivo é referenciado corretamente, que eu verifiquei e verifiquei novamente, por favor, avise! : /

Paul Creasey
fonte
6
Você realmente vê o jquery-1.3.2.js solicitado e carregado com o código de resposta HTTP200, se você inspeciona o carregamento da página com a ferramenta Fiddler?
naivists
18
seu script está sendo executado antes do jquery?
Surya
2
Você pode visualizar a fonte e clicar no link js. Parece que seu jquery não está carregado na página. Tente Tela Firebug Console para ver os erros Tentar também ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js em sua tag script
nemke
2
Seu script está disparando antes do carregamento da fonte jquery?
Dave Bacher
1
@ Surya / Dave, voltei para casa agora, então amanhã vou conferir novamente e voltar e postar, mas acho que provavelmente esse é o problema: / que vergonha!
Paul Creasey

Respostas:

560

Esse erro pode ser causado apenas por uma das três coisas:

  1. Seu arquivo JavaScript não está sendo carregado corretamente em sua página
  2. Você tem uma versão defeituosa do jQuery. Isso pode acontecer porque alguém editou o arquivo principal ou um plug-in pode ter substituído a variável $.
  3. Você tem JavaScript em execução antes que a página seja totalmente carregada e, como tal, antes que o jQuery seja totalmente carregado.

Antes de tudo, assegure-se de que script é chamado corretamente, deve parecer

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

e não deve ter atributos assíncronos ou adiados .

Então você deve verificar o painel de rede do Firebug para ver se o arquivo está realmente sendo carregado corretamente. Caso contrário, será destacado em vermelho e aparecerá "404" ao lado. Se o arquivo estiver carregando corretamente, isso significa que o problema é o número 2.

Verifique se todo o código jQuery javascript está sendo executado dentro de um bloco de código, como:

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

Isso garantirá que seu código seja carregado após a inicialização do jQuery.

Uma última coisa a verificar é garantir que você não esteja carregando nenhum plug-in antes de carregar o jQuery. Os plug-ins estendem o objeto "$"; portanto, se você carregar um plug-in antes de carregar o núcleo do jQuery, receberá o erro que descreveu.

Nota: Se você estiver carregando um código que não requer a execução do jQuery, ele não precisará ser colocado dentro do manipulador pronto para o jQuery. Esse código pode ser separado usando document.readyState.

Mike Trpcic
fonte
182
Quanto à sua bloco de código, $(document)não vai funcionar a menos que tenha uma tag de script incluindo jQuery antes que a declaração ...
PatrikAkerstrand
3
Gostaria de acrescentar que tive o mesmo problema do OP e meu problema era que o uso de https com a biblioteca do jquery não funciona tão bem.
Mike Cheel
20
(função ($) {}) (jQuery);
amigos estão dizendo sobre jackMahoney
2
@Patrik: Veja minha resposta para uma solução usando uma seção de scripts na exibição. Dessa forma, o jquery será carregado primeiro e $ está definido corretamente.
Angularsen 3/13/13
1
Verifique se você tem assíncrono no script também, foi o que causou o problema no meu caso.
Anders
207

Pode ser que você tenha sua tag de script chamada antes que o script jquery seja chamado.

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

Isso resulta como $ não está definido

Coloque o jquery.js antes da tag do script e ele funcionará;) assim:

<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>
Hanky ​​Panky
fonte
1
Esta é uma ótima resposta. Eu tentei e funcionou para mim. Estou usando o VS 2013 e o ASP.net. Você sabe como posso fazer o carregamento do javascript antes que a página seja carregada automaticamente no asp.net ou preciso fazer referência ao javascript dessa maneira em todos os meus arquivos?
Pat
Para adicionar à sua resposta. No ASP.net, você pode acessar Shared_Layout.cshtml `<head> </head>`
Pat
@pat e certifique-se de escrever o seu código dentro de um @section Scriptstag
Marc
Por favor, responda atualização para usar o HTTPS e considerar o uso de SPI devdocs.io/html/attributes#integrity-attribute
Josh Habdas
66

Primeiro, você precisa garantir que o script jQuery esteja carregado. Pode ser de uma CDN ou local no seu site. Se você não carregar isso antes de tentar usar o jQuery, ele informará que o jQuery não está definido.

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

Isso pode estar no HEAD ou no rodapé da página, apenas carregue-o antes de tentar chamar qualquer outro material do jQuery.

Então você precisa usar uma das duas soluções abaixo

(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); 

ou

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

esteja ciente de que muitas vezes $ (document) .ready (function () {// codifique aqui}); não funciona.

Andrew Killen
fonte
1
"jQuery não está definido". No entanto, existe após o carregamento da página.
Paul Totzke 22/03
Não tenho certeza se isso é uma pergunta ou uma declaração, mas gostaria de verificar se você fez a chamada para o script jQuery antes de tentar usá-lo. Parece que você o carrega no rodapé e chama coisas mais altas na página.
Andrew Killen 23/03
Desculpe, achei que era uma técnica que você poderia usar os scripts em qualquer ordem. Sim, eu estava usando isso na seção body no estilo MVC. mycode.js e jQuery.js são as duas últimas coisas da página.
Paul Totzke
Não se preocupe Paul, editei a solução para incluir 'você deve ... carregar primeiro'. :)
Andrew Killen 24/03
Isso corrige o problema de "Meus scripts estão na ordem correta, mas os scripts são carregados em uma ordem diferente". Lembro-me de fazer algo assim há 4 anos, mas não me lembro de qual problema foi resolvido.
Paul Totzke 24/03
50

Se a chamada do plugin jQuery estiver ao lado de </body>, e seu script for carregado antes disso, você deverá executar seu código após o window.onloadevento, desta forma:

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

`

portanto, seu código será executado somente após o carregamento da janela, quando todos os ativos tiverem sido carregados. Nesse ponto, o jQuery ($ ) será definido.

Se você usar isso:

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

`

o $ainda não está definido no momento, porque é chamado antes do carregamento do jQuery e seu script falhará nessa primeira linha no console.

dandapereira
fonte
Geralmente é uma má idéia vincular ao window.unload. Será efetivamente o único evento que será executado !!!
Rudi Strydom
Nota: Lembre-se de que você pode atribuir apenas uma função window.onload; se você atribuir outra função a ela, a anterior não será executada.
Bruno Peres
28

Eu fiz a mesma coisa e descobri que tinha um monte de

type="text/javacsript"

Então eles estavam carregando, mas não havia mais nenhuma dica de por que não estava funcionando. Escusado será dizer que a grafia correta o corrigia.

George R
fonte
Nota do moderador : o erro de digitação neste post é deliberado , para ilustrar um ponto. Por favor, não edite a postagem para "corrigir" isso.
Martijn Pieters
23

Use uma seção de scripts na exibição e no layout principal.

Coloque todos os seus scripts definidos em sua exibição dentro de uma seção Scripts da exibição. Dessa forma, você pode fazer com que o layout principal carregue isso depois que todos os outros scripts tiverem sido carregados. Essa é a configuração padrão ao iniciar um novo projeto da web MVC5. Não tenho certeza sobre versões anteriores.

Visualizações / 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>
}

Visualizações / compartilhadas / _Layout.cshtml

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

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

Observe como a seção de scripts é renderizada pela última vez no arquivo de layout principal.

angularsen
fonte
2
Nota: As seções da vista não são suportadas em vistas parciais por design.
Adam Naylor
Era isso que eu tinha que fazer pela minha correção ... e eu deveria saber usar os @Scripts em primeiro lugar, mas esqueci-me até procurar uma correção.
Caverman
12

certifique-se de realmente carregar o jquery, este não é o jquery - é a interface do usuário!

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

Esta é uma fonte de script correta para jquery:

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

Como mencionado acima, isso ocorre devido ao conflito da variável $.

Resolvi esse problema reservando uma variável secundária para jQuery sem conflito.

var $j = jQuery.noConflict();

e depois use em qualquer lugar

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

mais detalhes podem ser encontrados aqui

Abbas Naveed
fonte
8

Isso significa que sua biblioteca jQuery ainda não foi carregada.

Você pode mover seu código depois de puxar a biblioteca jQuery.

ou você pode usar algo parecido com isto

window.onload = function(){
  // Your code here
};  
Nesar
fonte
Isso é acionado após o carregamento do DOM, mas não quando os controles, javascript e outros programas em execução em segundo plano são carregados. Um atraso de tempo precisaria ser usado para que isso funcionasse.
Fandango68
5

Após alguns testes, encontrei uma solução rápida, você pode adicionar no topo da sua página de índice:

<script>
$=jQuery;
</script>

funciona muito bem :)

Mimouni
fonte
4
a pergunta era: $ não está definido, não?
precisa
Erro de referência não detectado: jQuery não está definido
Simon Schnell
Você o colocou logo abaixo da importação da biblioteca jQuery?
Mike Warren
4

Recebi a mesma mensagem de erro quando type="text/javascript"escrevi incorretamente a referência do jQuery e, em vez de digitar "... javascirpt". ;)

Alan
fonte
Eureka! Eu tinha o meu como type="text/css". Obrigado por salvar minha sanidade!
Jeriko
Eu brincava e tinha type="javascript". Desperdiçou 30 minutos em encontrá-lo.
pedreiro
4

Parece que o jQuery não está carregando corretamente. Qual fonte / versão você está usando?

Como alternativa, pode ser uma colisão de namespace, portanto, tente usar o jQuery explicitamente em vez de usar $. Se isso funcionar, você pode usar noConflictpara garantir que o outro código que está usando $não seja quebrado.

Alexender Dumma
fonte
3

Esse erro significa que o jQuery ainda não foi carregado na página. O uso $(document).ready(...)ou qualquer variante do mesmo não servirá, pois$ é a função jQuery.

O uso window.onloaddeve funcionar aqui. Observe que apenas uma função pode ser atribuída window.onload. Para evitar perder a lógica onload original, você pode decorar a função original da seguinte maneira:

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

Isso executará a função que foi originalmente atribuída e window.onload, em seguida, executará// YOUR JQUERY .

Consulte https://en.wikipedia.org/wiki/Decorator_pattern para obter mais detalhes sobre o padrão do decorador.

Kyle McVay
fonte
2

Eu uso Url.Content e nunca tenho um problema.

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

Na solução mencionada - "Uma última coisa a verificar é garantir que você não esteja carregando nenhum plug-in antes de carregar o jQuery. Os plug-ins estendem o objeto" $ "; portanto, se você carregar um plug-in antes de carregar o núcleo do jQuery, poderá receberá o erro que você descreveu. "

Por evitar isso -

Muitas bibliotecas JavaScript usam $ como uma função ou nome de variável, assim como o jQuery. No caso do jQuery, $ é apenas um alias para o jQuery; portanto, toda a funcionalidade está disponível sem o uso de $. Se precisarmos usar outra biblioteca JavaScript junto com o jQuery, podemos retornar o controle de $ back para a outra biblioteca com uma chamada para $ .noConflict ():


fonte
1

Eu tive esse problema uma vez sem motivo aparente. Isso estava acontecendo localmente enquanto eu estava executando o servidor de desenvolvimento aspnet. Estava funcionando e eu reverti tudo para um estado em que estava trabalhando anteriormente e ainda não funcionava. Procurei no depurador do chrome e o jquery-1.7.1.min.js havia sido carregado sem problemas. Foi tudo muito confuso. Ainda não sei qual era o problema, mas fechei o navegador, fechei o servidor de desenvolvimento e tentei resolvê-lo novamente.

cedd
fonte
1

Coloque o jquery url na parte superior do seu código jquery

como isso--

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

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

Eu tive o mesmo problema e foi porque minha referência ao jQuery.js não estava na tag. Depois que mudei isso, tudo começou a funcionar.

Anthony

Anthony
fonte
1
  1. Verifique se o caminho exato do seu arquivo jquery está incluído.

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

se você adicionar isso na parte inferior da sua página, chame a função JS abaixo desta declaração.

  1. Verifique usando este teste de código,

    <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~!' );
    });

Paz!

Daniel Adenew
fonte
0

Temos o mesmo problema .... mas acidentalmente verifiquei as propriedades da pasta e defini algo ...

Você precisa verificar as propriedades de cada pasta que está acessando.

  1. pasta com o botão direito
  2. guia "permissões"
  3. defina a pasta acesso: PROPRIETÁRIO: crie e exclua arquivos GRUPO: acesse arquivos OUTROS: acesse arquivos

Espero que esta seja a solução ......

RoyS_philippines
fonte
0

Ao usar o jQuery no asp.net, se você estiver usando uma página mestre e estiver carregando o arquivo de origem jquery, verifique se possui o cabeçalho contentplaceholder após todas as referências ao script jquery.

Eu tive um problema em que qualquer página que usasse essa página mestre retornaria '$ não está definida' simplesmente porque a ordem incorreta estava executando o código do lado do cliente antes da criação do objeto jquery. Portanto, verifique se você tem:

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

Dessa forma, o código será executado em ordem e você poderá executar o código jQuery nas páginas filho.

Francis Musignac
fonte
0

No meu caso, eu estava apontando para o JQuery hospedado pelo Google. Ele foi incluído corretamente, mas eu estava em uma página HTTPS e a chamei via HTTP. Depois de corrigir o problema (ou permitir conteúdo inseguro), ele foi acionado.

Anthony
fonte
0

Eu estava tendo o mesmo problema e não conseguia descobrir o que estava causando isso. Recentemente, converti meus arquivos HTML do japonês para UTF-8, mas não fiz nada com os arquivos de script. De alguma forma, o jquery-1.10.2.min.js ficou corrompido nesse processo (ainda não tenho idéia de como). Substituindo jquery-1.10.2.min.js pelo original, foi corrigido.

Gavin
fonte
0

parece que se você localizar os arquivos jquery.js na mesma pasta ou em algumas subpastas em que está o arquivo html, o problema do Firebug será resolvido. por exemplo, se o seu html estiver em C: / folder1 /, seus arquivos js deverão estar em algum lugar em C: / folder1 / (ou C: / folder1 / folder2 etc) e também ser endereçados de acordo no documento html. espero que isto ajude.

sc123
fonte
0

Eu tenho o mesmo problema e nenhum caso me resolve o problema. A única coisa que funciona para mim é o arquivo Site.master, o seguinte:

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

Com src = "<% = ResolveUrl (" ")) ... a carga do jQuery nas páginas de conteúdo está correta.

ameliano
fonte
0

Eu tive um problema muito semelhante. No meu aplicativo C # MVC, o JQuery não estava sendo reconhecido. Eu precisava mover o @ Scripts.Render ("~ / bundles / jquery") da parte inferior do meu arquivo _Layout.cshtml para o cabeçalho da seção. Verifique também se você pegou o Jquery como um pacote Nuget se estiver usando o visual studio!

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

Existe uma maneira de fazê-lo carregar o javascript automaticamente antes que o restante do código seja executado.

Vá para Views \ Shared_Layout.html e adicione o seguinte

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

se a scripttag tiver deferatributo, ela mostra o erro

ReferenceError não capturado: $ não está definido

e deve remover o atributo deferda scripttag

AbdulAhmad Matin
fonte
0

Este é o problema comum para resolver isso, você deve verificar algum ponto

  1. Incluir Biblioteca Jquery Principal
  2. Verificar problema entre navegadores
  3. Adicionar biblioteca na parte superior do código jquery
  4. Verifique se as CDNs podem estar bloqueadas.

Todos os detalhes são dados neste blog, clique aqui

Anju Batta
fonte