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.


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.


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

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

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.


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

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.


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.


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.


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.


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.


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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.