Uncaught TypeError: undefined không phải là một hàm khi tải jquery-min.js


104

Tôi đang xây dựng một trang web bình thường yêu cầu tôi tải khoảng năm tệp CSS và mười tệp Javascript.

  • Khi tải riêng chúng trong trang HTML, trang web của tôi tải tốt.
  • Bây giờ để sản xuất, tôi đã nối tất cả Javascript vào một tệp duy nhất, theo thứ tự cần thiết và tất cả CSS vào một tệp khác. Nhưng khi tôi cố gắng chạy trang web với các tệp được nối, nó sẽ báo lỗi:

    Uncaught TypeError: undefined is not a function

Trên dòng mà jquery.min.js đang được tải trong tệp Javascript được nối.

Tôi có thể làm gì để giảm thiểu điều này? Tôi muốn nối tất cả các tệp và rút gọn chúng để sản xuất. Xin vui lòng giúp đỡ.


CHỈNH SỬA: Tôi đã hợp nhất Javascript và CSS theo thứ tự khi chúng được tải riêng lẻ và đang hoạt động tốt.


5
làm thế nào chúng tôi có thể biết những gì là undefinednếu bạn không có mã để hiển thị?
Joseph

undefined sẽ xuất hiện trong jquery-1.6.1.min.js mà tôi đang tải. có thể jquery không được tải đúng cách hay gì đó?
ghostCoder

chấp nhận câu trả lời xếp hạng cao có thể?
Allisone

Câu trả lời:


179

Giả sử sự cố này vẫn chưa được giải quyết, nhiều tệp riêng lẻ không kết thúc mã của chúng bằng dấu chấm phẩy. Hầu hết các tập lệnh jQuery đều kết thúc bằng (jQuery)và bạn cần phải có (jQuery);.

Khi các tệp riêng biệt, tập lệnh sẽ tải tốt nhưng với một tệp riêng lẻ, bạn cần dấu chấm phẩy.


18
+1. Khi nối mã JavaScript, bạn luôn nên nối chúng trên dấu chấm phẩy. Quá nhiều trong số chúng vẫn còn hiệu lực, trong khi để ít dẫn đến lỗi hơn.
Bergi

9
Đó là cực kỳ khó khăn để gỡ lỗi. Cảm ơn vì một câu trả lời thực sự hiệu quả!
ghayes

5
Bootstrap's js rõ ràng là một trong những ví dụ như vậy. Cảm ơn vì điều đó! Đó là một đồ cào mì thực sự.
Kevin Beal

Tôi đang cố nhập API iframe của youtube và nó không kết thúc bằng dấu chấm phẩy và tôi gặp lỗi này. Tôi không nối nó với bất cứ thứ gì ... Tôi đang tải nó bằng jQuery.getScript (). Vì vậy ... Đây có thể là những gì gây ra lỗi của tôi? Hay điều đó không có ý nghĩa?
Daniel

1
Làm cách nào để giải quyết vấn đề này nếu chúng tôi gặp lỗi này khi làm việc với thư viện? Tôi đang cố gắng sử dụng 2.3.2 / js / bootstrap.min.js và /1.4.6/bootstrap-editable/js/bootstrap-editable.min.js
codeObserver

28

Bạn có thể phải kiểm tra lại thứ tự mà bạn đang hợp nhất các tệp, nó sẽ giống như:

  1. jquery.min.js
  2. jquery-ui.js
  3. bất kỳ plugin của bên thứ ba nào bạn đang tải
  4. JS tùy chỉnh của bạn

nó giống như thế này chỉ json2.js, jquery-1.6.1.min.js, jquery plugin, mã của tôi. nó theo thứ tự này.
ghostCoder

nếu json2.js đang sử dụng bất kỳ hàm jquery nào, thì jquery.min.js phải là hàm đầu tiên. tôi sẽ đề nghị. jquery.min.js, jqueryPlugins, json2.js, mã của tôi.
Bilal Murtaza


16

Tôi gặp cùng một lỗi do có hai tham chiếu đến các phiên bản jQuery khác nhau.

Trong trang chủ của tôi:

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

Và cũng trên trang:

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

7

Gần đây tôi đã gặp sự cố này với trình cắm jQuery Validation , sử dụng Squishit , cũng gặp lỗi js:

"undefined không phải là một hàm"

Tôi đã sửa nó bằng cách thay đổi tham chiếu đến tệp jquery.validate.js chưa được hợp nhất, thay vì 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

Tôi nghĩ rằng phiên bản rút gọn của một số tệp nhất định, khi được nén thêm bằng Squishit, chẳng hạn, trong một số trường hợp, có thể không xử lý được thiếu dấu chấm phẩy và những thứ tương tự, như @Dustin đề xuất, vì vậy bạn có thể phải thử nghiệm với tệp nào bạn có thể nén gấp đôi, và bạn chỉ cần để lại cho Squishit hoặc bất cứ thứ gì bạn đang đóng gói.


Sử dụng phiên bản chưa được xác minh chỉ là tấm vé cho tôi - cảm ơn.
Paul Deen

Đối với tôi, đó là tệp json2.min.js từ phiên bản 1.0.2 của gói NuGet gây ra sự cố. Tôi đã chuyển nó sang tệp không min và tệp kết hợp Squishit hiện hoạt động tốt.
billoreid

6

Đối với những người vẫn không thể sửa lỗi này, tôi đã làm như vậy bằng cách thay đổi 'this' thành '$ (this)' khi sử dụng jQuery.

VÍ DỤ:

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

Đã sửa:

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

5

Tôi đã gặp phải vấn đề tương tự, khi bị đặt tên nhầm biến với tên giống như hàm.

Vì vậy, điều này:

isLive = isLive(data);

không thành công, tạo thông báo lỗi đã đề cập của OP.

Khắc phục điều này rất đơn giản bằng cách thay đổi dòng trên thành:

isItALive = isLive(data);

Tôi không biết, nó giúp ích được bao nhiêu trong tình huống này, nhưng tôi quyết định đặt câu trả lời này cho những người khác đang tìm kiếm giải pháp cho những vấn đề tương tự.


5

Có, tôi cũng đã sửa nó thay đổi trong thư viện js thành không hợp nhất.

Ví dụ: trong thẻ, hãy thay đổi:

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

Đối với:

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

Trích dẫn 'min' là không được xác định.

Cảm ơn vì ý tưởng.


3

Hãy nhớ rằng: Các hàm trong Javascript là CASE SENSITIVE.

Tôi đã gặp một trường hợp mà tôi khá chắc chắn rằng mã của mình sẽ chạy trơn tru. Nhưng vẫn xảy ra lỗi và tôi đã kiểm tra bảng điều khiển Javascript của Google Chrome để kiểm tra xem nó là gì.

Dòng lỗi của tôi là

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

Và nhận được thông báo lỗi tương tự:

Uncaught TypeError: undefined is not a function

Có vẻ như không có gì sai với mã trên nhưng nó không chạy. Tôi khắc phục sự cố trong gần một giờ và sau đó so sánh nó với mã đang chạy khác của tôi. Lỗi của tôi là nó đã được đặt thành SetAttribute, điều này nên được setAttribute.


2

Trong trường hợp có bất kỳ kẻ ngu ngốc nào ngoài kia như tôi, tôi đã gặp phải vấn đề khó chịu này vì tôi đã quên một điều đơn giản

new

từ khóa trước khi khởi tạo một đối tượng mới.


1

Tôi vừa gặp thông báo tương tự với mã sau (trong IcedCoffeeScript):

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

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

Điều này đối với tôi dường như giống như mã ICS thông thường. Tôi đã mở cấu trúc chờ đợi hoãn lại sang CoffeeScript thông thường:

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

Điều thực sự đã xảy ra là tôi đã cố gắng chuyển 1 hàm gọi lại (với 2 tham số) để hoạt động với fmong đợi hai tham số, hiệu quả không thiết lập cbbên trong f, mà trình biên dịch đã báo cáo chính xác làundefined is not a function .

Lỗi đã xảy ra vì tôi đã dán một cách mù quáng mã bảng soạn sẵn kiểu gọi lại. fkhông cần một errtham số được truyền vào nó, do đó chỉ nên là:

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

Trong trường hợp chung, tôi khuyên bạn nên kiểm tra kỹ các chữ ký và lời gọi hàm để tìm các tổ chức từ thiện phù hợp. Ngăn xếp cuộc gọi trong thông báo lỗi sẽ có thể cung cấp các gợi ý hữu ích.

Trong trường hợp đặc biệt của bạn, tôi khuyên bạn nên tìm kiếm các định nghĩa hàm xuất hiện hai lần trong tệp đã hợp nhất, với các chữ ký khác nhau hoặc các phép gán cho các hàm chứa biến toàn cục.


1

Đảm bảo rằng bạn đã bình luận ra bất kỳ bài bình luận nào. Đôi khi khi sao chép và dán bạn sẽ bỏ qua dấu "/ *!"

Ngoài ra, khi bạn vào bảng điều khiển, họ sẽ liệt kê các lỗi của bạn và bạn nên xử lý từng lỗi một. Nếu bạn thấy "Lỗi cú pháp chưa được thông báo: Mã thông báo không mong muốn *", điều đó có thể có nghĩa là nó đang đọc tệp js của bạn và nó không vượt qua dòng đầu tiên.

/ *! * jquery.tools 1.1.2 - Thư viện giao diện người dùng bị thiếu cho 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] * * Bản quyền (c) 2009 Tero Piirainen * http://flowplayer.org/tools/ * Tệp được tạo: Thứ Tư ngày 07 tháng 10 09:40:16 GMT 2009 * /


0

Tôi nhận được điều này khi tôi vô tình truyền quá nhiều tham số vào một hàm jquery chỉ mong đợi một tham số gọi lại.

Đối với những cách khắc phục sự cố khác: hãy đảm bảo bạn kiểm tra tất cả các lệnh gọi hàm jquery của mình để biết thêm các tham số.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.