JQuery - $ không được xác định


486

Tôi có một sự kiện nhấp chuột đơn giản

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

và một tham chiếu jquery được xác định trong site.master

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

Tôi đã kiểm tra xem tập lệnh đang được giải quyết chính xác chưa, tôi có thể xem phần đánh dấu và xem tập lệnh trực tiếp trong fireorms, vì vậy tôi phải được tìm thấy. Tuy nhiên, tôi vẫn nhận được:

$ không được xác định

và không có tác phẩm jquery nào. Tôi cũng đã thử các biến thể khác nhau của điều này như $ (tài liệu). Đã và jQuery, v.v.

Đó là một ứng dụng MVC 2 trên .net 3.5, tôi chắc chắn rằng tôi đang thực sự dày đặc, mọi nơi trên google đều nói rằng để kiểm tra tệp được tham chiếu chính xác, tôi đã kiểm tra và kiểm tra lại, xin vui lòng tư vấn! : /


6
Bạn có thực sự thấy jquery-1.3.2.js được yêu cầu và tải mã phản hồi HTTP200 không, nếu bạn kiểm tra tải trang bằng công cụ Fiddler?
ngây thơ

18
kịch bản của bạn đang thực thi trước khi jquery?
Surya

2
Bạn có thể xem nguồn và nhấp vào liên kết js. Có vẻ như jquery của bạn không được tải trên trang. Thử màn hình Bảng điều khiển Fireorms để xem lỗi Hãy thử ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js trong thẻ script của bạn
nemke

2
Là tập lệnh của bạn bắn trước khi nguồn jquery được tải?
Dave Bacher

1
@ Surya / Dave, tôi đã về nhà ngay bây giờ, vì vậy tôi sẽ kiểm tra lại vào ngày mai, và quay lại và đăng bài, nhưng tôi nghĩ đó có lẽ là vấn đề, / thật ngượng ngùng!
Paul Creasey

Câu trả lời:


560

Lỗi đó chỉ có thể được gây ra bởi một trong ba điều sau:

  1. Tệp JavaScript của bạn không được tải đúng cách vào trang của bạn
  2. Bạn có một phiên bản tinh vi của jQuery. Điều này có thể xảy ra do ai đó đã chỉnh sửa tệp lõi hoặc plugin có thể đã ghi đè biến $.
  3. Bạn có JavaScript chạy trước khi trang được tải đầy đủ và như vậy, trước khi jQuery được tải đầy đủ.

Trước hết, đảm bảo, kịch bản nào được gọi đúng, nó sẽ trông như thế nào

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

và không nên có thuộc tính async hoặc defer .

Sau đó, bạn nên kiểm tra bảng điều khiển mạng Fireorms để xem liệu tập tin có thực sự được tải đúng cách hay không. Nếu không, nó sẽ được tô sáng màu đỏ và sẽ nói "404" bên cạnh nó. Nếu tệp đang tải đúng cách, điều đó có nghĩa là vấn đề là số 2.

Đảm bảo rằng tất cả mã javascript của jQuery đang được chạy bên trong một khối mã, chẳng hạn như:

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

Điều này sẽ đảm bảo rằng mã của bạn đang được tải sau khi jQuery được khởi tạo.

Một điều cuối cùng cần kiểm tra là đảm bảo rằng bạn không tải bất kỳ plugin nào trước khi tải jQuery. Các plugin mở rộng đối tượng "$", vì vậy nếu bạn tải một plugin trước khi tải lõi jQuery, thì bạn sẽ gặp lỗi bạn mô tả.

Lưu ý: Nếu bạn đang tải mã không yêu cầu jQuery để chạy, thì không cần phải đặt bên trong trình xử lý sẵn sàng của jQuery. Mã đó có thể được phân tách bằng cách sử dụng document.readyState.


182
Về khối mã của bạn, $(document)sẽ không hoạt động trừ khi bạn có thẻ script bao gồm jQuery trước câu lệnh đó ...
PatrikAkerstrand

3
Tôi muốn nói thêm rằng tôi có cùng một vấn đề với OP và vấn đề của tôi là việc sử dụng https với thư viện của jquery không hoạt động tốt như vậy.
Mike Cheel

20
(hàm ($) {}) (jQuery);
JackMahoney

2
@Patrik: Xem câu trả lời của tôi cho một giải pháp bằng cách sử dụng phần tập lệnh trong dạng xem. Cách này jquery sẽ được tải trước và $ được xác định đúng.
angensesen

1
Kiểm tra xem bạn có async trên tập lệnh không, đó là nguyên nhân gây ra sự cố trong trường hợp của tôi.
Anders

207

Nó có thể là bạn có thẻ script của bạn được gọi trước khi kịch bản jquery được gọi.

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

Kết quả này là $ không được xác định

Đặt jquery.js trước thẻ script của bạn và nó sẽ hoạt động;) như vậy:

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

1
Đây là một phản ứng tuyệt vời. Tôi đã thử nó và nó làm việc cho tôi. Tôi đang sử dụng VS 2013 và ASP.net. Bạn có biết làm thế nào tôi có thể tải javascript trước khi trang tải tự động trong asp.net không hoặc tôi có phải tham chiếu javascript theo cách này trong tất cả các tệp của mình không?
Pat

Để thêm vào câu trả lời của bạn. Trong ASP.net, bạn có thể truy cập Shared_Layout.cshtml `<head> </ head>`
Pat

@pat và đảm bảo bạn viết mã của mình bên trong @section Scriptsthẻ
Marc

Vui lòng cập nhật câu trả lời để sử dụng HTTPS và xem xét việc sử dụng SPI devdocs.io/html/attribut#integrity-attribution
Josh Habdas

66

Trước tiên, bạn cần đảm bảo rằng tập lệnh jQuery đã được tải. Điều này có thể là từ CDN hoặc địa phương trên trang web của bạn. Nếu bạn không tải cái này trước khi thử sử dụng jQuery, nó sẽ cho bạn biết rằng jQuery không được xác định.

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

Điều này có thể nằm ở phần ĐẦU hoặc ở phần cuối trang, chỉ cần đảm bảo bạn tải nó trước khi bạn cố gắng gọi bất kỳ nội dung jQuery nào khác.

Sau đó, bạn cần sử dụng một trong hai giải pháp dưới đây

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

hoặc là

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

xin lưu ý rằng nhiều lần $ (tài liệu). yet (function () {// code tại đây}); sẽ không làm việc.


1
"jQuery không được xác định". Nó tồn tại sau khi tải trang tuy nhiên.
Paul Totzke

Không chắc đây là câu hỏi hay câu lệnh, nhưng, tôi sẽ kiểm tra bạn thực hiện cuộc gọi cho tập lệnh jQuery trước khi bạn thử sử dụng nó. Có vẻ như bạn tải nó ở phần chân trang và gọi mọi thứ cao hơn trên trang.
Andrew Killen

Xin lỗi, tôi nghĩ rằng đây là một kỹ thuật mà bạn có thể sử dụng các tập lệnh theo bất kỳ thứ tự nào. Có, tôi đã sử dụng phần này trong phần thân theo kiểu MVC. mycode.js thì jQuery.js là 2 thứ cuối cùng trên trang.
Paul Totzke

Đừng lo lắng Paul, tôi đã chỉnh sửa giải pháp để bao gồm 'bạn phải ... tải trước'. :)
Andrew Killen

Điều này có khắc phục được sự cố "Tập lệnh của tôi theo đúng thứ tự nhưng tập lệnh được tải theo thứ tự khác". Tôi nhớ đã làm một cái gì đó như thế này vào 4 năm trước nhưng tôi không thể nhớ nó đã giải quyết vấn đề gì.
Paul Totzke

50

Nếu cuộc gọi plugin jQuery bên cạnh </body>và tập lệnh của bạn được tải trước đó, bạn nên làm cho mã của mình chạy sau window.onloadsự kiện, như sau:

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

`

vì vậy, mã của bạn sẽ chỉ chạy sau khi tải cửa sổ, khi tất cả các tài sản đã được tải. Trong đó, jQuery ($ ) sẽ được xác định.

Nếu bạn sử dụng nó:

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

`

những $là chưa được xác định vào thời điểm này, bởi vì nó được gọi trước khi jQuery được nạp, và kịch bản của bạn sẽ thất bại trên dòng đầu tiên trên console.


Nói chung là một ý tưởng tồi để buộc vào window.unload. Nó thực sự sẽ là sự kiện duy nhất chạy !!!
Rudi Strydom

Lưu ý: Hãy nhớ rằng bạn chỉ có thể gán một hàm window.onload, nếu bạn gán một hàm khác cho nó, thì hàm trước sẽ không được thực thi.
Bruno Peres

28

Tôi chỉ làm điều tương tự và thấy rằng tôi có rất nhiều

type="text/javacsript"

Vì vậy, họ đã tải, nhưng không có gợi ý thêm về lý do tại sao nó không hoạt động. Không cần phải nói, đúng chính tả đã sửa nó.


Người điều hành lưu ý : lỗi đánh máy trong bài này là có chủ ý , để minh họa một điểm. Xin vui lòng không chỉnh sửa bài viết để xóa chính xác điều này.
Martijn Pieters

23

Sử dụng một phần script trong khung nhìn và bố trí tổng thể.

Đặt tất cả các tập lệnh của bạn được xác định trong chế độ xem của bạn bên trong phần Tập lệnh của chế độ xem. Bằng cách này, bạn có thể tải bố cục chính sau khi tất cả các tập lệnh khác đã được tải. Đây là thiết lập mặc định khi bắt đầu một dự án web MVC5 mới. Không chắc chắn về các phiên bản trước.

Lượt xem / 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>
}

Lượt xem / Chia sẻ / _Layout.cshtml

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

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

Lưu ý cách phần script được hiển thị cuối cùng trong tệp bố cục chính.


2
Lưu ý: Xem phần không được hỗ trợ trong chế độ xem một phần theo thiết kế.
Adam Naylor

Đây là những gì tôi phải làm để sửa lỗi .... và tôi nên biết rõ hơn về việc sử dụng @Scripts ở nơi đầu tiên nhưng quên nó cho đến khi tôi tìm cách khắc phục.
Caverman

12

hãy chắc chắn rằng bạn thực sự tải jquery đây không phải là jquery - đó là ui!

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

Đây là một nguồn kịch bản chính xác cho jquery:

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

11

Như đã nêu ở trên, nó xảy ra do xung đột của biến $.

Tôi đã giải quyết vấn đề này bằng cách đặt trước một biến thứ cấp cho jQuery mà không có xung đột.

var $j = jQuery.noConflict();

và sau đó sử dụng nó ở bất cứ đâu

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

biết thêm chi tiết có thể được tìm thấy ở đây


8

Điều đó có nghĩa là thư viện jQuery của bạn chưa được tải.

Bạn có thể di chuyển mã của mình sau khi kéo thư viện jQuery.

hoặc bạn có thể sử dụng một cái gì đó như thế này

window.onload = function(){
  // Your code here
};  

Điều này kích hoạt sau khi DOM đã được tải, nhưng không phải khi các điều khiển, javascript và các chương trình khác đang chạy trong nền đã được tải. Một sự chậm trễ thời gian sẽ cần phải được sử dụng để làm việc này.
Fandango68


5

Sau một số thử nghiệm tôi đã tìm thấy một giải pháp nhanh chóng, bạn có thể thêm vào đầu trang chỉ mục của mình:

<script>
$=jQuery;
</script>

nó hoạt động rất tốt :)


4
Câu hỏi là: $ không được xác định, không?
Mimouni

Uncaught ReferenceError: jQuery không được xác định
Simon Schnell

Bạn đã đặt nó ngay bên dưới nhập thư viện jQuery chưa?
Mike Warren

4

Tôi đã nhận được thông báo lỗi tương tự khi tôi viết sai chính tả tham chiếu jQuery và thay vì type="text/javascript"tôi gõ "... javascirpt". ;)


Eureka! Tôi đã có của tôi như type="text/css". Cảm ơn vì đã cứu tinh thần của tôi!
Jeriko

Tôi ngớ ngẩn và đã có type="javascript". Đã lãng phí 30 phút tìm thấy nó.
thợ xây

4

Có vẻ như jQuery không tải đúng cách. Bạn đang sử dụng nguồn / phiên bản nào?

Ngoài ra, nó có thể là xung đột không gian tên, vì vậy hãy thử sử dụng jQuery một cách rõ ràng thay vì sử dụng $. Nếu điều đó hoạt động, bạn có thể muốn sử dụng noConflictđể đảm bảo mã khác đang sử dụng $không bị hỏng.


3

Lỗi đó có nghĩa là jQuery chưa được tải trên trang. Sử dụng $(document).ready(...)hoặc bất kỳ biến thể nào của chúng sẽ không tốt, như $hàm jQuery.

Sử dụng window.onloadnên làm việc ở đây. Lưu ý rằng chỉ có một chức năng có thể được chỉ định window.onload. Để tránh mất logic tải trọng ban đầu, bạn có thể trang trí chức năng ban đầu như vậy:

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

Điều này sẽ thực thi chức năng ban đầu được gán cho window.onload, và sau đó sẽ thực thi // YOUR JQUERY.

Xem https://en.wikipedia.org/wiki/Decorator_potype để biết thêm chi tiết về mẫu trang trí.


2

Tôi sử dụng Url.Content và không bao giờ có vấn đề.

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

2

Trong giải pháp được đề cập - "Một điều cuối cùng cần kiểm tra là đảm bảo rằng bạn không tải bất kỳ plugin nào trước khi tải jQuery. Các plugin mở rộng đối tượng" $ ", vì vậy nếu bạn tải một plugin trước khi tải lõi jQuery, thì bạn Tôi sẽ nhận được lỗi bạn mô tả. "

Để tránh điều này -

Nhiều thư viện JavaScript sử dụng $ làm hàm hoặc tên biến, giống như jQuery. Trong trường hợp của jQuery, $ chỉ là bí danh cho jQuery, vì vậy tất cả các chức năng đều có sẵn mà không cần sử dụng $. Nếu chúng ta cần sử dụng một thư viện JavaScript khác cùng với jQuery, chúng ta có thể trả lại quyền kiểm soát $ trở lại thư viện khác bằng lệnh gọi đến $ .noConflict ():


1

Tôi đã có vấn đề này một lần mà không có lý do rõ ràng. Nó đã xảy ra cục bộ trong khi tôi đang chạy qua máy chủ phát triển aspnet. Nó đã hoạt động và tôi hoàn nguyên mọi thứ về trạng thái trước đây nó vẫn hoạt động và nó vẫn không hoạt động. Tôi đã xem xét trình gỡ lỗi chrome và jquery-1.7.1.min.js đã tải mà không gặp vấn đề gì. Tất cả đều rất khó hiểu. Tôi vẫn không biết vấn đề là gì nhưng đóng trình duyệt, đóng máy chủ phát triển và sau đó thử lại sắp xếp nó ra.


1

Chỉ cần đặt url jquery trên đầu mã jquery của bạn

như thế này--

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

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

1

Tôi gặp vấn đề tương tự và đó là do tham chiếu của tôi đến jQuery.js không có trong thẻ. Khi tôi chuyển nó, mọi thứ bắt đầu hoạt động.

Anthony


1
  1. Kiểm tra đường dẫn chính xác của tập tin jquery của bạn được bao gồm.

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

nếu bạn thêm phần này vào cuối trang, vui lòng gọi hàm JS bên dưới phần khai báo này.

  1. Kiểm tra bằng cách sử dụng kiểm tra mã này,

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

Sự thanh bình!


0

Chúng tôi có cùng một vấn đề .... nhưng vô tình tôi đã kiểm tra thuộc tính thư mục và đặt một cái gì đó ...

Bạn phải kiểm tra các thuộc tính của từng thư mục mà bạn đang truy cập ..

  1. nhấp chuột phải vào thư mục
  2. tab 'quyền'
  3. đặt quyền truy cập thư mục: OWNER: tạo và xóa tệp NHÓM: truy cập tệp OTHERS: truy cập tệp

Tôi hy vọng rằng đây là giải pháp ......


0

Khi sử dụng jQuery trong asp.net, nếu bạn đang sử dụng trang chính và bạn đang tải tệp nguồn jquery ở đó, hãy đảm bảo bạn có nội dung tiêu đề sau tất cả các tham chiếu tập lệnh jquery.

Tôi gặp vấn đề khi bất kỳ trang nào sử dụng trang chính đó sẽ trả về '$ không được xác định' đơn giản vì thứ tự không chính xác làm cho mã phía máy khách chạy trước khi đối tượng jquery được tạo. Vì vậy, hãy chắc chắn rằng bạn có:

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

Bằng cách đó, mã sẽ chạy theo thứ tự và bạn sẽ có thể chạy mã jQuery trên các trang con.


0

Trong trường hợp của tôi, tôi đã trỏ đến Google lưu trữ JQuery. Nó được bao gồm đúng, nhưng tôi đã ở trên trang HTTPS và gọi nó qua HTTP. Khi tôi đã khắc phục sự cố (hoặc cho phép nội dung không an toàn), nó sẽ được kích hoạt ngay.


0

Tôi đã có vấn đề tương tự và không thể tìm ra nguyên nhân gây ra nó. Gần đây tôi đã chuyển đổi các tệp HTML của mình từ tiếng Nhật sang UTF-8, nhưng tôi không làm gì với các tệp script. Bằng cách nào đó jquery-1.10.2.min.js bị hỏng trong quá trình này (tôi vẫn không biết làm thế nào). Thay thế jquery-1.10.2.min.js bằng bản gốc đã sửa nó.


0

có vẻ như nếu bạn định vị các tệp jquery.js của mình trong cùng một thư mục hoặc trong một số thư mục con có tệp html của bạn, thì vấn đề Firebird đã được giải quyết. vd hi vọng điêu nay co ich.


0

Tôi có cùng một vấn đề và không có trường hợp nào giải quyết cho tôi vấn đề. Điều duy nhất phù hợp với tôi, đó là tập tin Site.master, tiếp theo:

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

Với src = "<% = ResolveUrl (" ") ... tải của jQuery trong Trang nội dung là chính xác.


0

Tôi đã có một vấn đề rất giống nhau. Trong ứng dụng C # MVC của tôi, JQuery đã không được công nhận. Tôi cần di chuyển @ Sc Script.Render ("~ / bundles / jquery") từ cuối tệp _Layout.cshtml của tôi sang phần đầu của phần. Ngoài ra, hãy chắc chắn rằng bạn đã lấy Jquery dưới dạng gói Nuget nếu bạn đang sử dụng studio hình ảnh!

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

0

Có một cách để làm cho nó tự động tải javascript trước khi phần còn lại của mã chạy.

Đi vào Views \ Shared_Layout.html và thêm các mục sau

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

0

nếu scriptthẻ có deferthuộc tính, nó hiển thị lỗi

Uncaught ReferenceError: $ không được xác định

và phải xóa thuộc tính deferkhỏi scriptthẻ


0

Đây là vấn đề phổ biến để giải quyết vấn đề này, bạn phải kiểm tra một số điểm

  1. Bao gồm Thư viện Jquery chính
  2. Kiểm tra vấn đề trình duyệt chéo
  3. Thêm thư viện trên TOP của mã jquery
  4. Kiểm tra CDN có thể bị chặn.

Chi tiết đầy đủ được đưa ra trong blog này bấm vào đây

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.