2012-02-14 30 views
1

我有索引頁與容器用AJAX請求獲得我加載內容Ajax頁面。這些子頁面可以包含特定於js的js,這些js只需要加載一次。我想實現以下目標:
如果子頁面加載它加載的JavaScript,但如果是第二次或第n個時間,然後JavaScript的不應該被加載(因爲它已經在內存中)在第一時間。如何處理加載JS只有一次可以裝入多次

我能做到這一點與一些變量並在執行前檢查它的價值,但我在這裏問是否有這樣做的正確,測試和使用,通過一對多的方式。如果這很重要,我正在使用MVC3和jQuery。

回答

-2

here答案。

你可以做小的腳本,以檢查是否jQuery是出現在頁面上,且僅當不存在,加載它:

// 'load-jquery.js' 
window.onload = function() { 
    if (window.jQuery === undefined) { 
    var script = document.createElement('script'); 
    script.src = 'path/to/jquery.min.js'; 
    document.getElementsByTagName('head')[0].appendChild(script); // load jQuery 
    } 
}; 

UPDATE:

您可以使用此功能時您包含文件:

var included_files = new Array(); 

function include_once(script_filename) { 
    if (!in_array(script_filename, included_files)) { 
     included_files[included_files.length] = script_filename; 
     include_dom(script_filename); 
    } 
} 

function in_array(needle, haystack) { 
    for (var i = 0; i < haystack.length; i++) { 
     if (haystack[i] == needle) { 
      return true; 
     } 
    } 
    return false; 

} 
+1

這隻會檢查jQuery。他需要知道任何JavaScript文件 – Henesnarfel 2012-02-14 14:36:36

+0

如果我是正確的,這將檢查jQuery。加載jQuery是因爲我在加載頁面時加載它。當我加載子頁面時,我加載了一些其他內容,也使用jQuery(但不一定)。我想檢查* * js是否加載。 – 2012-02-14 14:37:06

+0

我不確定,但某些瀏覽器可能不接受將元素添加到頭部。 – rcdmk 2012-02-14 14:39:39

0

在加載使用AJAX的內容的網頁中的JavaScript代碼,使用動態生成<SCRIPT>元件加載特定頁面的JavaScript。然後,您可以通過給它一個唯一的ID並嘗試在DOM中找到它來檢測該元素的存在,以避免加載它兩次。或者,設置全局JavaScript變量。

var scriptLoaded=false; 

function loadContent() { 
    loadPageWithAJAX(); 
    if(!scriptLoaded) { 
     var script = document.createElement('SCRIPT'); 
     script.setAttribute("type","text/javascript") 
     script.setAttribute("src", 'path/to/page-specific.js'); 
     document.getElementsByTagName('head')[0].appendChild(script); 
     scriptLoaded=true; 
    } 
} 
1

你試過類似YepNope的東西嗎?

這是對這種類型的任務的最好的事情之一。

3

這裏有一個小幫手,我使用的正是這個目的:

public static MvcHtmlString Script(this HtmlHelper html, string path) 
{ 
    var filePath = VirtualPathUtility.ToAbsolute(path); 
    HttpContextBase context = html.ViewContext.HttpContext; 
    // don't add the file if it's already there 
    if (context.Items.Contains(filePath)) 
     return MvcHtmlString.Create(""); 
    return MvcHtmlString.Create(
     string.Format("<script type=\"text/javascript\" src=\"{0}\"></script>", filePath)); 
} 

用法:

@Html.Script("~/calendar.js") 

這可能工作的情況下,你描述一種享受 - 試驗和(希望不是)錯誤。

1

用jQuery.ajax緩存腳本似乎適用於我。

來源:http://api.jquery.com/jQuery.getScript/

jQuery.cachedScript = function(url, options) { 
    // allow user to set any option except for dataType, cache, and url 
    options = $.extend(options || {}, { 
     dataType: "script", 
     cache: true, 
     url: url 
    }); 
    // Use $.ajax() since it is more flexible than $.getScript 
    // Return the jqXHR object so we can chain callbacks 
    return jQuery.ajax(options); 
}; 

// Usage 
$.cachedScript("ajax/test.js").done(function(script, textStatus) { 
    console.log(textStatus); 
}); 

例如,我有一個表格視圖中的DOM的地方使用一些自定義的javascript:

<script type="text/javascript"> 
    $.cachedScript("/js/my_form_script.js"); 
</script> 
<form action="/Ajax/saveSomething" method="POST"> 
    ...   
</form> 

每個窗體被加載時,我的控制檯顯示腳本的獲取請求,但我已經確認請求僅在第一次加載時遇到服務器。