TypeError não capturado: undefined não é uma função ao carregar jquery-min.js

104

Estou construindo uma página da web normal que exige que carregue cerca de cinco arquivos CSS e dez arquivos Javascript.

  • Ao carregá-los separadamente na página HTML, minha página da web carrega bem.
  • Agora, para a produção, concatenei todo o Javascript em um único arquivo, na ordem necessária, e todo o CSS em outro arquivo. Mas quando tento executar a página da web com os arquivos concatenados, ocorre um erro dizendo:

    Uncaught TypeError: undefined is not a function

Na linha onde jquery.min.js está sendo carregado no arquivo Javascript concatenado.

O que posso fazer para atenuar isso? Quero concatenar todos os arquivos e reduzi-los para produção. Por favor ajude.


EDITAR: Eu combinei o Javascript e o CSS na ordem em que estavam quando foram carregados individualmente e estavam funcionando bem.

ghostCoder
fonte
5
como podemos saber o que é undefinedse você não tem nenhum código para mostrar?
Joseph
o indefinido está chegando no jquery-1.6.1.min.js que estou carregando. talvez jquery não esteja sendo carregado corretamente ou algo assim?
ghostCoder
aceitar a resposta de alto escalão talvez?
Allisone

Respostas:

179

Supondo que o problema ainda não foi resolvido, muitos arquivos individuais não terminam seu código com um ponto e vírgula. A maioria dos scripts jQuery termina com (jQuery)e você precisa ter (jQuery);.

Como arquivos separados, o script carregará perfeitamente, mas como um arquivo individual você precisa dos pontos-e-vírgulas.

Dustin
fonte
18
+1. Ao concatenar o código JavaScript, você sempre deve juntá-los em ponto-e-vírgulas. Muitos deles ainda são válidos, embora menos levem a erros.
Bergi
9
Isso é incrivelmente complicado de depurar. Obrigado por uma resposta realmente eficaz!
ghayes
5
O JS do Bootstrap é um exemplo, aparentemente. Obrigado por isso! Esse foi um verdadeiro scratcher de macarrão.
Kevin Beal de
Estou tentando importar a API iframe do youtube e ela não termina em ponto-e-vírgula e estou recebendo este erro. Não estou concatenando com nada ... Estou carregando com jQuery.getScript (). Então ... Pode ser isso que está causando meu erro? Ou isso não faz sentido?
Daniel
1
Como resolveremos isso se virmos esse erro ao trabalhar com uma biblioteca? Estou tentando usar 2.3.2 / js / bootstrap.min.js e /1.4.6/bootstrap-editable/js/bootstrap-editable.min.js
codeObserver
28

Pode ser necessário verificar novamente a ordem em que você está mesclando os arquivos, deve ser algo como:

  1. jquery.min.js
  2. jquery-ui.js
  3. quaisquer plug-ins de terceiros que você está carregando
  4. seu JS personalizado
Bilal Murtaza
fonte
é assim apenas json2.js, jquery-1.6.1.min.js, plug-ins jquery, meu código. está nesta ordem.
ghostCoder
se json2.js estiver usando qualquer função jquery, jquery.min.js deve ser o primeiro. eu sugeriria. jquery.min.js, jqueryPlugins, json2.js, meu código.
Bilal Murtaza
16

Recebi o mesmo erro por ter duas referências a versões diferentes do jQuery.

Na minha página mestra:

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

E também na página:

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

Tive esse problema recentemente com o plug-in de validação jQuery , usando o Squishit , obtendo também o erro js:

"undefined não é uma função"

Eu consertei alterando a referência ao arquivo jquery.validate.js não minimizado, em vez de 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

Eu acho que a versão reduzida de certos arquivos, quando mais compactados usando Squishit, por exemplo, pode em alguns casos não lidar com pontos-e-vírgulas ausentes e coisas do tipo, como @Dustin sugere, então você pode ter que experimentar com quais arquivos você pode compactar duplamente, e que você apenas deixa para o Squishit ou o que quer que esteja fazendo.

Ralph Lavelle
fonte
Usar a versão não minimizada foi apenas a passagem para mim - obrigado.
Paul Deen
Para mim, era o arquivo json2.min.js da versão 1.0.2 de um pacote NuGet que estava causando o problema. Troquei para o arquivo não-min e o arquivo combinado do Squishit funciona bem agora.
billoreid
6

Para aqueles que ainda não conseguiram consertar isso, fiz isso mudando meu 'this' para '$ (this)' ao usar jQuery.

POR EXEMPLO:

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

Fixo:

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

Eu tive o mesmo problema, quando nomeada erroneamente variável com o mesmo nome, como função.

Então, é isso:

isLive = isLive(data);

falhou, gerando a mensagem de erro mencionada de OP.

A solução para isso foi tão simples quanto alterar a linha acima para:

isItALive = isLive(data);

Não sei o quanto ajuda nessa situação, mas decidi colocar essa resposta para outras pessoas que buscam uma solução para problemas semelhantes.

Trejder
fonte
5

Sim, eu também corrigi-lo mudando nas bibliotecas js para o não minimizado.

Por exemplo, na tag, altere:

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

Para:

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

Saindo do 'min' como não reduzido.

Obrigado pela ideia.

Francisco alonso
fonte
3

Lembre-se: as funções Javascript são sensíveis a maiúsculas e minúsculas.

Tive um caso em que tenho certeza de que meu código seria executado sem problemas. Mesmo assim, obtive um erro e verifiquei o console Javascript do Google Chrome para verificar o que é.

Minha linha de erro é

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

E recebeu a mesma mensagem de erro:

Uncaught TypeError: undefined is not a function

Nada parece errado com o código acima, mas ele não estava funcionando. Resolvi o problema por quase uma hora e então comparei com meu outro código em execução. Meu erro é que ele foi definido como SetAttribute, o que deveria ser setAttribute.

Logan Wayne
fonte
2

Caso haja algum idiota por aí como eu, tive esse problema frustrante porque esqueci um simples

new

palavra-chave antes de instanciar um novo objeto.

CodyBugstein
fonte
1

Acabei de receber a mesma mensagem com o seguinte código (em IcedCoffeeScript):

f = (err,cb) ->
  cb null, true

await f defer err, res
console.log err if err  

Isso me pareceu um código ICS normal. Desdobrei a construção await-defer para CoffeeScript regular:

f (err,res) ->
  console.log err if err

O que realmente aconteceu foi que eu tentei passar 1 função de retorno de chamada (com 2 parâmetros) para funcionar fesperando dois parâmetros, efetivamente não configurados cbdentro f, os quais o compilador relatou corretamente undefined is not a function.

O erro aconteceu porque eu colei cegamente o código clichê do estilo de retorno de chamada. fnão precisa de um errparâmetro passado para ele, portanto, deve ser simplesmente:

f = (cb) ->
  cb null, true
f (err,res) ->
  console.log err if err

No caso geral, eu recomendo verificar novamente as assinaturas e invocações de função para aridades correspondentes. A pilha de chamadas na mensagem de erro deve ser capaz de fornecer dicas úteis.

Em seu caso especial, eu recomendo procurar por definições de função aparecendo duas vezes no arquivo mesclado, com assinaturas diferentes, ou atribuições a funções de retenção de variáveis ​​globais.

Jens Jensen
fonte
1

Certifique-se de comentar qualquer comentário. Às vezes, ao copiar e colar, você deixará de fora o "/ *!"

Além disso, quando você entrar no console, eles listarão seus erros e você deve fazer um de cada vez. Se você vir "Uncaught SyntaxError: Unexpected token *", isso pode significar que ele está lendo seu arquivo js e não está passando da primeira linha.

/ *! * jquery.tools 1.1.2 - A biblioteca de IU ausente para a Web * * [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/ * Arquivo gerado: Quarta, 07 de outubro 09:40:16 GMT 2009 * /

Tasha
fonte
0

Eu entendi isso quando acidentalmente passei muitos parâmetros para uma função jquery que esperava apenas um parâmetro de retorno de chamada.

Para outras soluções de problemas: certifique-se de verificar todas as chamadas de função jquery para parâmetros extras.

JSideris
fonte