2010-05-07 35 views
9

Tôi đang cố gắng chọn tất cả các thẻ <script type="text/html"> trong một trang. Tôi sử dụng các thẻ <script> để lưu trữ các mẫu HTML, tương tự như how John Resig does it. Đối với một số lý do, selector jquery sau dường như không được chọn bất cứ điều gì:vấn đề bộ chọn jquery với thẻ tập lệnh

$("script[type*=html]").each(function() { 
    alert("Found script "+this.id); 
}); 

đánh dấu này nằm trong BODY của tài liệu HTML:

<body> 
    <script id="filter-search" type="text/html"> 
     <dt>Search</dt> 
     <dd><input type="text"/></dd> 
    </script> 
</body> 

Tôi cũng đã cố gắng đưa nó vào phần đầu của tài liệu HTML và nó vẫn không được tìm thấy. Không có cảnh báo nào được hiển thị.

Nếu tôi thay đổi mã của tôi như thế này:

$("script[type*=javascript]").each(function() { 
    alert("Found script "+this.id); 
}); 

Sau đó nó tìm thấy chỉ các script trong các HEAD có một src đến một tập tin bên ngoài. Không tìm thấy tập lệnh trong trang thực tế. Ví dụ, những điều sau đây ĐẦU:

<head> 
    <script type="text/javascript" src="jquery.js" id="jquery"></script> 
    <script type="text/javascript" src="jquery-ui.js" id="ui"></script> 
    <script type="text/javascript" id="custom"> 
     $(document).ready(function() { 
      $("script[type*=javascript]").each(function() { 
       alert("Found script "+this.id); 
      });   
      $("script[type*=html]").each(function() { 
       alert("Found TEMPLATE script "+this.id); 
      });   
     }); 
    </script> 
    <script id="filter-test" type="text/html"> 
     <dt>Test</dt> 
    </script> 
</head> 
<body> 
    <script id="filter-search" type="text/html"> 
     <dt>Search</dt> 
     <dd><input type="text"/></dd> 
    </script> 
</body> 

tôi nhận được cảnh báo sau đây:

  • Tìm thấy kịch bản jquery
  • Tìm thấy kịch bản ui

Các customfilter-test script trong HEAD không được chọn, cũng không phải là tập lệnh filter-search trong thẻ body.

Đây có phải là hành vi mong đợi không? Tại sao cai nay không hoạt động? Tôi có thể làm việc xung quanh nó, nhưng nó là gây phiền nhiễu mà nó không hoạt động.

EDIT: Hóa ra điều này thực sự hoạt động tốt bằng ví dụ trên. Trong tình huống của tôi, mã jquery nằm trong một mô-đun Javascript bên ngoài, và nó chắc chắn không hoạt động. Khi tôi chuyển mã vào một thẻ tập lệnh trên trang chính nó đã hoạt động. Tôi vẫn chưa tìm ra lý do tại sao nó sẽ không hoạt động trong các tập tin bên ngoài, nhưng sẽ báo cáo lại ở đây nếu tôi nhận được xung quanh để giải quyết nó tại một số điểm.

+0

Nếu tôi chạy tập lệnh của bạn với jQuery 1.4.2 trên chrome, tất cả id mong muốn được thông báo – jAndy

+0

@tauren Gần đây tôi đã gặp sự cố tương tự. Xin vui lòng bạn có thể thử một thử nghiệm: thay đổi văn bản/html để cái gì khác (đề nghị văn bản/mẫu) và xem nếu điều này sau đó làm việc với kịch bản bên ngoài của bạn ... – UpTheCreek

Trả lời

2

Bạn đang sử dụng trình duyệt nào? Kịch bản này hoạt động tốt đối với tôi trong Chrome, Firefox và IE6, đem lại cho tôi những cảnh báo:

  • Tìm thấy kịch bản jquery
  • Tìm thấy kịch bản ui
  • Tìm thấy kịch bản tùy chỉnh
  • Tìm thấy MẪU kịch bản bộ lọc kiểm tra
  • Đã tìm thấy bộ lọc dạng tập lệnh TEMPLATE
+0

Tôi đã có nó làm việc quá khi tôi đặt mã ngay vào một jquery sẵn sàng đóng cửa trong chính HTML. Tôi đã thử nghiệm mã chạy từ bên trong một mô-đun javascript bên ngoài đã được nhập thay vì chính xác tập lệnh trong câu hỏi của tôi. Vẫn không hiểu tại sao nó không hoạt động khi chạy từ một mô-đun tập lệnh bên ngoài. Tôi sẽ phải nhìn vào đó nhiều hơn đôi khi. Nhưng ít nhất nó hoạt động từ một kịch bản cục bộ. Cảm ơn bạn đã thử nghiệm nó! – Tauren

1

Sự cố bạn gặp phải với tập lệnh bên ngoài có thể do thứ tự tải. Để tối đa hóa khả năng phản hồi, trình duyệt bắt đầu tải và thực thi các tập lệnh khi chúng gặp phải trong trang, trước khi trang được tải xuống và phân tích cú pháp hoàn chỉnh. Vì vậy, nếu bạn có một tập lệnh được liên kết trong phần tử đầu, nó có thể sẽ không thể truy cập các phần của DOM được chỉ định sâu hơn trên trang, như các thẻ tập lệnh tùy chỉnh của bạn.

Hai giải pháp khả thi:

  • Sắp xếp lại các thẻ script để các thẻ tùy chỉnh đến trước các kịch bản mà sử dụng chúng.
  • Gói các tập lệnh của bạn bằng thứ gì đó đang chờ DOM tải (chẳng hạn như jQuery $() shortcut).
Các vấn đề liên quan