2009-05-25 30 views
12

Tôi có một điều khiển người dùng (ascx), trong điều khiển người dùng này, tôi muốn sử dụng tệp .js.Làm cách nào để biết tệp javascript đã được đưa vào trang cấp cao nhất chưa?

Vì vậy, tôi bao gồm trên đầu trang của nó.

Mặt khác, đôi khi tôi sử dụng điều khiển người dùng này trong trang web mà tập lệnh này đã được tải trước đó.

Làm cách nào để tôi có thể khai báo và chỉ thực hiện khai báo nếu trang không chứa thẻ khác cho tập lệnh này?

+0

Có lý do tại sao bạn không thể chỉ bao gồm thư viện javascript trong tất cả các trang? – jfar

+4

jfar, Tôi có các trang web chỉ cần tệp javascript một trang cụ thể khi tôi hiển thị một điều khiển cụ thể, phần lớn thời gian kiểm soát đó sẽ không được sử dụng ở tất cả trên trang đó. Sẽ là lãng phí khi đưa javascript vào mỗi người dùng truy cập mọi trang trên trang web, đặc biệt nếu bro của họ wser nhấn mạnh vào yêu cầu tệp trên mỗi yêu cầu. –

+1

Lý do tôi không muốn bao gồm nó trong tất cả các trang là hiệu suất: Tôi không cần nó trong tất cả chúng. Neil, cảm ơn vì đã giải thích. – Shimmy

Trả lời

11

Khi bạn đang sử dụng asp.net, nó làm cho tinh thần để làm việc kiểm tra server-side như rằng sẽ là nơi bạn chọn thêm tham chiếu vào tệp javascript. Từ file ascx của bạn, bạn có thể đăng ký như sau:

this.Page.ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile); 

... từ trang của bạn, bạn chỉ cần gọi các đối tượng clientscript trực tiếp:

ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile); 

Các 'GlobalUniqueKey' có thể là bất kỳ chuỗi (I sử dụng url của tệp javascript cho quá này)

Nếu bạn cố gắng đăng ký một tập lệnh với cùng một chuỗi khóa, nó không làm gì cả. Vì vậy, nếu bạn gọi điều này trong trang của bạn, kiểm soát của bạn hoặc bất cứ nơi nào khác, bạn sẽ kết thúc với chỉ một tài liệu tham khảo trong trang của bạn. Lợi ích của việc này là bạn có thể có nhiều phiên bản điều khiển trên một trang và mặc dù tất cả chúng đều cố gắng đăng ký cùng một tập lệnh, nhưng nó chỉ được thực hiện tối đa một lần. Và không ai trong số họ cần phải lo lắng về kịch bản đã được đăng ký. Có một phương pháp 'IsClientScriptIncludeRegistered (stringkey)' mà bạn có thể sử dụng để xem tập lệnh đã được bao gồm trong khóa đó hay chưa nhưng có vẻ như không cần thiết để kiểm tra trước khi đăng ký như nhiều lần đăng ký không ném ngoại lệ hoặc gây ra bất kỳ lỗi nào khác. Thực hiện kiểm tra phía máy khách có nghĩa là, giả sử nhiều tham chiếu javascript được lưu trữ bởi trình duyệt (chúng có thể không có), bạn vẫn có nhiều thẻ và phần đầu của mỗi thẻ khiến javascript chạy. Nếu bạn có 20 trường hợp kiểm soát của mình trên một trang, bạn có thể gặp phải các vấn đề nghiêm trọng.

+0

không biết ASP, nhưng điều này có vẻ là một giải pháp đẹp hơn nhiều so với làm phía khách hàng như tôi đã làm. – mysomic

+2

Dựa trên câu trả lời của bạn, tôi xây dựng trên các thuộc tính boolean trang cơ bản "AttachJqery", "AttachEngine", vv và điều khiển attatchement vì vậy tôi không phải bị bẩn với mã. Tôi cũng có tùy chọn đặt mặc định. Nếu ví dụ anyonw cần vui lòng đăng, vui lòng nhận xét tại đây. – Shimmy

0

sử dụng giống như sau:

if(typeof myObjectOrFunctionDecalredInThisScript != 'undefined') { 
    // code goes here 
    var myObjectOrFunctionDecalredInThisScript = { }; 
} 

này kiểm tra nếu đối tượng hoặc chức năng của bạn đã tồn tại và do đó ngăn chặn khai báo lại.

6

Bạn có thể làm một trong hai điều phía khách hàng ...

  1. Kiểm tra dom cho thẻ script tương ứng với javascript nộp muốn của bạn để kiểm tra
  2. thử nghiệm một biến hoặc chức năng bạn biết có/sẽ được xác định trong tệp javascript cho không xác định.

Dưới đây là một chức năng JS nhanh chóng trong đó sử dụng JQuery để làm những gì bạn cần:

function requireOnce(url) {  
    if (!$("script[src='" + url + "']").length) { 
     $('head').append("<script type='text/javascript' src='" + url + "'></script>"); 
    } 
} 
+0

Cảm ơn. Tôi sử dụng jQuery, điều đó sẽ rất khó chịu. Cảm ơn tất cả những người trả lời, tôi chắc chắn sẽ sử dụng chúng trong tương lai. – Shimmy

+3

Một vấn đề là, nếu chính jQuery là kịch bản tôi muốn kiểm tra :) – Shimmy

0
var storePath = []; 
function include(path){ 
if(!storePath[path]){ 
    storePath[path]= true; 
    var e = document.createElement("script"); 
    e.src = path; 
    e.type = "text/javascript"; 
    document.getElementsByTagName("head")[0].appendChild(e); 
    return false; 
} } 

sử dụng này trong chính trang và gọi hàm bao gồm với lập luận javascript tên file

0

Như bạn muốn bao gồm javascript trên một trang của trang web của bạn mà thôi.
Nếu bạn sử dụng Asp.net (4.0) thì rất dễ dàng.
Chỉ cần bao gồm mã sau

<script type="text/javascript" scr="filepath and name here"></script> 

trong ContentPlaceHolder của trang nội dung.

0

@Shimmy Tôi đang xem xét điều này sau một thời gian dài nhưng có lẽ nó vẫn có thể hữu ích hoặc ít nhất giúp người khác đến từ phía sau. Để kiểm tra xem jquery đã được tải chưa, hãy làm điều này

<script>window.jQuery || document.write('<script src="js/libs/jquery-1.x.x.min.js"><\/script>')</script> 

Đừng bỏ lỡ ký tự thoát trong thẻ đóng tập lệnh trong câu lệnh document.write.

@mysomic, tại sao tôi không nghĩ về điều đó. thumbs up

PS: Tôi đã có thể yêu thích để viết quyền này dưới dòng nơi @Shimmy đã viết rằng jQuery chính nó là kịch bản ông muốn tải. Nhưng không biết làm thế nào để viết nó ở đó. không thể thấy câu trả lời hoặc bất kỳ liên kết tương tự nào. Điều này nghe có vẻ ngu ngốc nhưng có lẽ tôi đang thiếu một cái gì đó. Xin hãy chỉ ra, bất kỳ ai?

-1

Nếu bạn cần từ phía máy chủ và Page.ClientScript.RegisterClientScriptInclude sẽ không hoạt động cho bạn trong trường hợp tập lệnh được bao gồm bởi một số cách khác thì Page.ClientScript.RegisterClientScript (ví dụ: page.Header.Controls.Add (..), bạn có thể sử dụng một cái gì đó như thế này:

static public void AddJsFileToHeadIfNotExists(Page page, string jsRelativePath) 
{ 
     foreach (Control ctrl in page.Header.Controls) 
     { 
      if (ctrl is HtmlLink) 
      { 
       if ((ctrl as HtmlLink).Href.ToLower().Contains(jsRelativePath.ToLower())) return; 
      } 
      if (ctrl is LiteralControl || ctrl is Literal) 
      { 
       if ((ctrl as ITextControl).Text.ToLower().Contains(jsRelativePath.ToLower())) return; 
      } 
      if (ctrl is HtmlControl) 
      { 
       if ((ctrl as HtmlControl).Attributes["src"] != null) 
        if ((ctrl as HtmlControl).Attributes["src"].ToLower().Contains(jsRelativePath.ToLower())) return; 
      } 
     } 

     HtmlGenericControl Include = new HtmlGenericControl("script"); 
     Include.Attributes.Add("type", "text/javascript"); 
     Include.Attributes.Add("src", page.ResolveUrl(jsRelativePath)); 
     page.Header.Controls.Add(Include); 
    } 
+0

Quá nhiều ctrl đúc là HtmlLink, sau đó ctrl là liên kết Html. Hãy xem xét: var lnk = ctrl dưới dạng HtmlLink; nếu ctrl! = null. Lưu một diễn viên. – Roland

Các vấn đề liên quan