2011-10-02 45 views
5

tôi sẽ ilustrate câu hỏi của tôi sử dụng một ví dụ:Bao gồm các file JS trong một file xhtml được bao gồm sử dụng ui: bao gồm

outerfile.xhtml:

<h:head> 
    <h:outputScript library="js" name="jquery-1.6.2.js" /> 
    <h:outputScript library="js" name="outer.js" /> 
</h:head> 

<h:body> 
    <h:panelGroup id="inner_panel"> 
     <ui:include src="innerfile.xhtml" /> 
    </h:panelGroup> 
</h:body> 

innerfile.xhtml:

<ui:composition ... > 
    <h:head> 
     <h:outputScript library="js" name="jquery-1.6.2.js" /> 
     <h:outputScript library="js" name="inner.js" /> 
    </h:head> 

    <h:body> 
     <h:panelGroup> 
      I Am Text in The Inner File! 
     </h:panelGroup> 
    </h:body> 
</ui:composition> 

Câu hỏi của tôi:

  1. Có ổn không lia js tệp trong tệp bên trong theo cách tôi đã làm?
  2. Tôi có cần (và tôi có nên) khai báo chung (jquery-1.6.2.js) một lần nữa trong tệp bên trong không?
  3. Điều gì sẽ xảy ra nếu tôi hủy kết xuất và hiển thị lại inner_panel bằng AJAX? Các tiêu đề được bao gồm bên trong có được tải lại không?

Trả lời

12

Bạn có thể khai báo tệp js trong tệp bên trong theo cách tôi đã làm không?

Không. Bạn cũng không được chỉ định <h:head> trong bao gồm. Điều này sẽ chỉ dẫn đến không hợp lệ HTML. Như bạn có ngay bây giờ sẽ cho kết quả:

<html> 
    <head> 
    <script></script> 
    </head> 
    <body> 
    <head> 
     <script></script> 
    </head> 
    <body> 
    </body> 
    </body> 
</html> 

(trang rightclick trong trình duyệt và làm View Source để xem nó cho mình, w3-validate nếu cần thiết)

Khắc phục sự cố phù hợp trong innerfile.xhtml:

<ui:composition ... > 
    <h:outputScript library="js" name="jquery-1.6.2.js" target="head" /> 
    <h:outputScript library="js" name="inner.js" target="head" /> 

    <h:panelGroup> 
     I Am Text in The Inner File! 
    </h:panelGroup> 
</ui:composition> 

Điều này sẽ dẫn đến HTML hợp lệ. Các tập lệnh được khai báo bởi <h:outputScript target="head"> sẽ chỉ kết thúc trong tự động <head>, nếu chưa được khai báo trước đó. Giống như trong HTML thực, chỉ nên có một<h:head><h:body> trong toàn bộ chế độ xem, bao gồm mọi mẫu và bao gồm tệp.


Tôi có cần (Và Tôi có nên) tuyên bố chung (jquery-1.6.2.js) một lần nữa trong các tập tin bên trong?

Không nếu tệp gốc đã được khai báo là <h:outputScript>. Nhưng redeclaring nó trong bao gồm không gây hại. Nó sẽ không được sao chép anyway nếu nó đã được tuyên bố trước đó.


gì xảy ra nếu tôi bỏ làm và tái render inner_panel sử dụng Ajax? Các tiêu đề được bao gồm bên trong có được tải lại không?

Điều này chỉ hoạt động nếu bạn không sử dụng target="head".Cho dù chúng sẽ được tải lại từ máy chủ, phụ thuộc vào việc nó đã được trình duyệt yêu cầu trước đó và đã có mặt và hợp lệ trong bộ nhớ cache của trình duyệt hay chưa. Nhưng về cơ bản, trình duyệt sẽ được nhắc lại để tải nó, vâng. Với Firebug bạn có thể dễ dàng xác định nó.

+0

Tnx. Theo dõi nhỏ - theo câu trả lời của bạn, nếu tôi tải trang khi te trang bên trong không được hiển thị và sau đó hiển thị trang bên trong, các tệp js bên trong sẽ bị thiếu. Đúng? – Ben

+0

Tôi không nói vậy. Họ sẽ được bao gồm. Trình duyệt sẽ được yêu cầu tải chúng. Nhưng cho dù nó được lấy từ bộ nhớ cache của trình duyệt hoặc trực tiếp từ máy chủ phụ thuộc vào các tiêu đề trên phản hồi JS và nếu nó đã có trong bộ nhớ cache của trình duyệt hay chưa. Nếu nó có thể lưu vào bộ nhớ cache và có trong bộ nhớ cache của trình duyệt, thì nó sẽ không được tải lại (vì trình duyệt đã có nó). Nếu không, nó thực sự sẽ được tải lại từ máy chủ. – BalusC

+0

Tôi thấy quan điểm của bạn, tôi làm rõ phần tái kết xuất. – BalusC

1

Cách đúng để viết nó là sử dụng target = "đầu" bên trong h của bạn: khai outputScript trên innerfile.xhtml:

<ui:composition ... > 
    <h:outputScript library="js" target="head" name="jquery-1.6.2.js" /> 
    <h:outputScript library="js" target="head" name="inner.js" /> 
    <h:panelGroup> 
     I Am Text in The Inner File! 
    </h:panelGroup> 
</ui:composition> 

Bằng cách đó tất cả các tờ khai nguồn lực của bạn sẽ được đặt bên trong bên ngoài. Nhiều khai báo của cùng một tài nguyên có cùng tên thư viện/tài nguyên sẽ không hiển thị cùng một khai báo nhiều lần, bởi vì trình kết xuất cho h: outputScript có một số mã phát hiện và bỏ qua các mục trùng lặp. Lưu ý những điều khác nhau nếu bạn trả về h: outputScript không tham chiếu đến tệp javascript.