如何为可以多次加载的ajax页面处理只加载一次js
How to handle loading js only once for ajax page that can be loaded multiple times
我有一个带有容器的索引页面,我将通过ajax请求获得的内容加载到该容器中。这些子页面可以包含特定于它们的js,只需要加载一次。我希望实现以下目标:
如果子页面是第一次加载的,它会加载javascript,但如果是第二次或第n次加载,则不应加载javascript(因为它已经在内存中了)。
我可以通过一些变量来实现这一点,并在执行之前检查其值,但我在这里要问的是,是否有一种经过多种测试和使用的正确方法。如果这很重要的话,我会使用MVC3和jQuery。
这里有一个小助手,我正是为了这个目的而使用的:
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")
在你描述的场景中,这可能是一种治疗——尝试和(希望不是)错误。
你试过YepNope这样的东西吗?
对于这类任务来说,这是最好的事情之一。
用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>
每次加载表单时,我的控制台都会显示脚本的get请求,但我已经确认该请求只在第一次加载时到达服务器。
您必须使用缓存清单。
更多信息,请点击此处: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;
}
}
从这里回答。
您可以制作一个小脚本来检查页面上是否存在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
}
};
更新:
无论何时包含文件,都可以使用此功能:
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;
}
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- jQuery在页面加载时分配点击事件处理程序
- Jquery函数无法处理动态加载的内容(不是绑定函数)
- Chrome 扩展程序会等待设置加载到事件处理程序中
- JavaFX WebView 弹出处理程序未尝试加载页面
- 从脚本后加载的处理程序追加数据
- 等待图标,用于通过 ashx 处理程序在浏览器中加载 pdf
- 角度:处理重新加载页面和用户身份验证
- InnerHTML创建问题,没有't加载顺序正确,可能存在处理问题
- 使用.ech()绑定页面加载上的处理程序,并使用jQuery.clone(true,true)采用它们
- 如果用户由于第二个处理程序中的对话框而停留在页面上,则跳过加载前处理程序
- 我没有'我不了解require.js是如何处理加载路径的.每次定义模块时是否需要使用require.config
- 正在处理未加载的js草图
- 如何为将通过AJAX加载的元素声明事件处理程序
- 如何在导出 excel 时显示加载(处理)
- 加载处理程序上的事件参数
- 为什么我没有得到一个加载处理程序
- 为什么我的加载处理程序不起作用
- 设置页面加载处理时间
- 使用iron-ajax、iron-list和通过iron-scroll-threshold加载处理大型JSON文件