我有索引頁與容器用AJAX請求獲得我加載內容Ajax頁面。這些子頁面可以包含特定於js的js,這些js只需要加載一次。我想實現以下目標:
如果子頁面加載它加載的JavaScript,但如果是第二次或第n個時間,然後JavaScript的不應該被加載(因爲它已經在內存中)在第一時間。如何處理加載JS只有一次可以裝入多次
我能做到這一點與一些變量並在執行前檢查它的價值,但我在這裏問是否有這樣做的正確,測試和使用,通過一對多的方式。如果這很重要,我正在使用MVC3和jQuery。
我有索引頁與容器用AJAX請求獲得我加載內容Ajax頁面。這些子頁面可以包含特定於js的js,這些js只需要加載一次。我想實現以下目標:
如果子頁面加載它加載的JavaScript,但如果是第二次或第n個時間,然後JavaScript的不應該被加載(因爲它已經在內存中)在第一時間。如何處理加載JS只有一次可以裝入多次
我能做到這一點與一些變量並在執行前檢查它的價值,但我在這裏問是否有這樣做的正確,測試和使用,通過一對多的方式。如果這很重要,我正在使用MVC3和jQuery。
從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;
}
您必須使用緩存清單。
從這裏的更多信息:https://developer.mozilla.org/en/Using_Application_Cache
的想法是明確地告訴哪些文件緩存爲您的應用程序的瀏覽器。
在加載使用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;
}
}
你試過類似YepNope的東西嗎?
這是對這種類型的任務的最好的事情之一。
這裏有一個小幫手,我使用的正是這個目的:
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")
這可能工作的情況下,你描述一種享受 - 試驗和(希望不是)錯誤。
用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>
每個窗體被加載時,我的控制檯顯示腳本的獲取請求,但我已經確認請求僅在第一次加載時遇到服務器。
這隻會檢查jQuery。他需要知道任何JavaScript文件 – Henesnarfel 2012-02-14 14:36:36
如果我是正確的,這將檢查jQuery。加載jQuery是因爲我在加載頁面時加載它。當我加載子頁面時,我加載了一些其他內容,也使用jQuery(但不一定)。我想檢查* * js是否加載。 – 2012-02-14 14:37:06
我不確定,但某些瀏覽器可能不接受將元素添加到頭部。 – rcdmk 2012-02-14 14:39:39