TypeError Tidak Tertangkap: undefined bukanlah fungsi saat memuat jquery-min.js

104

Saya sedang membangun halaman web biasa yang mengharuskan saya memuat sekitar lima file CSS dan sepuluh file Javascript.

  • Saat memuatnya secara terpisah di halaman HTML, halaman web saya memuat dengan baik.
  • Sekarang untuk produksi, saya menggabungkan semua Javascript menjadi satu file, dalam urutan yang diperlukan, dan semua CSS ke file lain. Tetapi ketika saya mencoba menjalankan halaman web dengan file yang digabungkan, itu membuat kesalahan yang mengatakan:

    Uncaught TypeError: undefined is not a function

Di baris tempat jquery.min.js dimuat di file Javascript yang digabungkan.

Apa yang dapat saya lakukan untuk mengurangi ini? Saya ingin menggabungkan semua file dan mengecilkannya untuk produksi. Tolong bantu.


EDIT: Saya menggabungkan Javascript dan CSS dalam urutan saat mereka dimuat secara individual dan berfungsi dengan baik.

ghostCoder
sumber
5
bagaimana kita bisa tahu bagaimana undefinedjika Anda tidak punya kode untuk ditampilkan?
Joseph
undefined akan datang di jquery-1.6.1.min.js yang sedang dimuat. mungkin jquery tidak dimuat dengan benar atau sesuatu?
ghostCoder
menerima jawaban peringkat tinggi mungkin?
Allisone

Jawaban:

179

Dengan asumsi masalah ini masih belum terselesaikan, banyak file individual tidak mengakhiri kode mereka dengan titik koma. Kebanyakan skrip jQuery diakhiri dengan (jQuery)dan Anda harus memilikinya (jQuery);.

Sebagai file terpisah, skrip akan dimuat dengan baik tetapi sebagai satu file individual Anda memerlukan titik koma.

Dustin
sumber
18
+1. Saat menggabungkan kode JavaScript, Anda harus selalu menggabungkannya di titik koma. Terlalu banyak dari mereka yang masih valid, sedangkan untuk lebih sedikit menyebabkan kesalahan.
Bergi
9
Itu sangat sulit untuk di-debug. Terima kasih atas jawaban yang sangat efektif!
ghayes
5
Js Bootstrap adalah salah satu contohnya, rupanya. Terima kasih untuk ini! Itu benar-benar penggaruk mie.
Kevin Beal
Saya mencoba mengimpor API iframe youtube, dan itu tidak berakhir dengan titik koma, dan saya mendapatkan kesalahan ini. Saya tidak menggabungkannya dengan apa pun ... Saya memuatnya dengan jQuery.getScript (). Jadi ... Mungkinkah ini yang menyebabkan kesalahan saya? Atau apakah itu tidak masuk akal?
Daniel
1
Bagaimana kami mengatasi ini jika kami melihat kesalahan ini saat bekerja dengan perpustakaan? Saya mencoba menggunakan 2.3.2 / js / bootstrap.min.js dan /1.4.6/bootstrap-editable/js/bootstrap-editable.min.js
codeObserver
28

Anda mungkin harus memeriksa ulang urutan penggabungan file, seperti ini:

  1. jquery.min.js
  2. jquery-ui.js
  3. plugin pihak ketiga apa pun yang Anda muat
  4. JS kustom Anda
Bilal Murtaza
sumber
ini seperti ini hanya json2.js, jquery-1.6.1.min.js, jquery plugins, kode saya. itu dalam urutan ini.
ghostCoder
jika json2.js menggunakan fungsi jquery apa pun, maka jquery.min.js harus menjadi yang pertama. saya akan menyarankan. jquery.min.js, jqueryPlugins, json2.js, kode saya.
Bilal Murtaza
16

Saya mendapat kesalahan yang sama karena memiliki dua referensi ke versi jQuery yang berbeda.

Di halaman master saya:

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

Dan juga di halaman:

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

Saya mengalami masalah ini baru-baru ini dengan plug-in jQuery Validation , menggunakan Squishit , juga mendapatkan kesalahan js:

"undefined bukanlah sebuah fungsi"

Saya memperbaikinya dengan mengubah referensi ke file jquery.validate.js yang tidak diminimalkan, daripada 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

Saya pikir versi minified dari file tertentu, ketika dikompresi lebih lanjut menggunakan Squishit, misalnya, mungkin dalam beberapa kasus tidak berurusan dengan titik koma yang hilang dan sejenisnya, seperti yang disarankan @Dustin, jadi Anda mungkin harus bereksperimen dengan file mana yang Anda bisa kompres dua kali, dan yang Anda serahkan saja ke Squishit atau apa pun yang Anda bundelkan.

Ralph Lavelle
sumber
Menggunakan versi unminified hanyalah tiket untuk saya - terima kasih.
Paul Deen
Bagi saya itu adalah file json2.min.js dari versi 1.0.2 dari paket NuGet yang menyebabkan masalah. Saya mengalihkannya ke file non-min dan file gabungan Squishit berfungsi dengan baik sekarang.
billoreid
6

Bagi mereka di luar sana yang masih tidak bisa memperbaiki ini, saya melakukannya dengan mengubah 'ini' saya menjadi '$ (ini)' saat menggunakan jQuery.

MISALNYA:

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

Tetap:

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

Saya mengalami masalah yang sama, ketika salah menamai variabel dengan nama yang sama, sebagai fungsi.

Jadi ini:

isLive = isLive(data);

gagal, menghasilkan pesan kesalahan yang disebutkan OP.

Perbaiki ini sesederhana mengubah baris di atas menjadi:

isItALive = isLive(data);

Saya tidak tahu, seberapa membantu dalam situasi ini, tetapi saya memutuskan untuk memberikan jawaban ini untuk orang lain yang mencari solusi untuk masalah serupa.

trejder
sumber
5

Ya, saya juga memperbaikinya mengubah di perpustakaan js menjadi yang tidak diminimalkan.

Misalnya, di tag, ubah:

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

Untuk:

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

Menghentikan 'min' sebagai tidak diminimalkan.

Terima kasih untuk idenya.

Francisco Alonso
sumber
3

Ingat: Fungsi Javascript bersifat CASE SENSITIVE.

Saya memiliki kasus di mana saya cukup yakin bahwa kode saya akan berjalan dengan lancar. Tapi tetap saja, ada kesalahan dan saya memeriksa konsol Javascript Google Chrome untuk memeriksa apa itu.

Baris kesalahan saya adalah

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

Dan mendapat pesan kesalahan yang sama:

Uncaught TypeError: undefined is not a function

Sepertinya tidak ada yang salah dengan kode di atas tetapi tidak berjalan. Saya memecahkan masalah selama hampir satu jam dan kemudian membandingkannya dengan kode saya yang sedang berjalan. Kesalahan saya adalah bahwa itu telah diatur ke SetAttribute, yang seharusnya setAttribute.

Logan Wayne
sumber
2

Seandainya ada orang bodoh di luar sana seperti saya, saya mengalami masalah yang membuat frustrasi ini karena saya lupa yang sederhana

new

kata kunci sebelum membuat instance objek baru.

CodyBugstein
sumber
1

Saya baru saja mendapat pesan yang sama dengan kode berikut (di IcedCoffeeScript):

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

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

Bagi saya ini seperti kode ICS biasa. Saya membuka konstruksi await-defer ke CoffeeScript biasa:

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

Apa yang benar-benar terjadi adalah bahwa saya mencoba melewatkan 1 fungsi panggilan balik (dengan 2 parameter) untuk berfungsi fmengharapkan dua parameter, secara efektif tidak diatur cbdi dalam f, yang dilaporkan oleh kompilator dengan benar sebagaiundefined is not a function .

Kesalahan terjadi karena saya secara membabi buta menempelkan kode boilerplate gaya panggilan balik. ftidak memerlukan errparameter yang dilewatkan ke dalamnya, jadi seharusnya:

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

Dalam kasus umum, saya akan merekomendasikan untuk memeriksa ulang tanda tangan fungsi dan pemanggilan untuk mencocokkan arities. Tumpukan panggilan dalam pesan kesalahan harus dapat memberikan petunjuk yang berguna.

Dalam kasus khusus Anda, saya sarankan untuk mencari definisi fungsi yang muncul dua kali dalam file gabungan, dengan tanda tangan berbeda, atau tugas ke variabel global yang memegang fungsi.

Jens Jensen
sumber
1

Pastikan Anda telah mengomentari setiap komentar. Terkadang saat menyalin dan menempel, Anda tidak akan melihat "/ *!"

Juga ketika Anda masuk ke konsol, mereka akan mencantumkan kesalahan Anda dan Anda harus mengambilnya satu per satu. Jika Anda melihat "SyntaxError Tidak Tertangkap: Token tak terduga *" Itu mungkin berarti ia sedang membaca file js Anda dan tidak melewati baris pertama.

/ *! * jquery.tools 1.1.2 - Pustaka UI yang hilang untuk 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] * * Hak Cipta (c) 2009 Tero Piirainen * http://flowplayer.org/tools/ * File dibuat: Rabu 07 Okt 09:40:16 GMT 2009 * /

Tasha
sumber
0

Saya mendapatkan ini ketika saya secara tidak sengaja melewatkan terlalu banyak parameter ke dalam fungsi jquery yang hanya mengharapkan satu parameter callback.

Untuk pemecahan masalah lainnya: pastikan Anda memeriksa semua panggilan fungsi jquery Anda untuk parameter tambahan.

JSideris
sumber