javascript - Jquery加载方法与子页面外部脚本冲突当前脚本
问题描述
我有一个带有仪表板菜单和主要内容部分的免费模板。我希望当用户单击菜单链接时,子页面将被加载到主要内容部分。由于一些问题,我不想用户嵌入标签或 iframe,所以我尝试了 Jquery 加载方法和 $.ajax。问题是菜单包含 2 个外部脚本(bootstrap 和 jquery);加载子页面时,他们不理解菜单的脚本。但是,如果我将 2 个更多相同的脚本标签添加到子页面或使用 $.getScript(),则加载的子页面但 jquery.js 和 bootstrap.js 似乎发生冲突并且以错误的方式工作。
主要代码
<html>
<head>// Some css link</head>
<body>
<!-- Menu -->
<div class="menu">
<ul class="list">
<li class="header">MAIN NAVIGATION</li>
<li class="active">
<a href="index.html">
<i class="material-icons">home</i>
<span>Home</span>
</a>
</li>
<li>
<a href="javascript:void(0);" onclick="setPage('child.jsp')">
<i class="material-icons">text_fields</i>
<span>Child page</span>
</a>
</li>
</ul>
</div>
<section class="content" id="main-content">
</section>
<!-- Jquery Core Js -->
<script src="plugins/jquery/jquery.min.js"></script>
<!--Bootstrap Core Js-->
<script src="plugins/bootstrap/js/bootstrap.js"></script>
<!-- Select Plugin Js -->
<script src="plugins/bootstrap-select/js/bootstrap-select.js"></script>
<script>
function setPage(page) {
$.ajax({
url: page,
}).done(function (data) {
$("#main-content").html(data);
// $.getScript("plugins/jquery/jquery.min.js");
// $.getScript("plugins/bootstrap/js/bootstrap.js");
// $.getScript("plugins/bootstrap-select/js/bootstrap-select.js");
// $.getScript("plugins/jquery-countto/jquery.countTo.js")
});
}
</script>
</body>
子代码
<div class="info-box bg-pink hover-expand-effect">
<div class="icon">
<i class="material-icons">playlist_add_check</i>
</div>
<div class="content">
<div class="text">NEW TASKS</div>
<div class="number count-to" data-from="0" data-to="125" data-speed="15" data-fresh-interval="20"></div>
</div>
</div>
如果我在没有 $.getScript 的情况下运行,子页面加载到部分但只有内容和 css,js 不起作用。如果我使用 $.getScript 运行(或将外部脚本放在子页面中),则使用 js 加载的子页面但 jquery 和 bootstrapsjs 会出现一些意外动画错误。
非常感谢你们。
解决方案
一旦页面上有 jQuery(和引导程序),就无需重新添加它们。获取包含脚本的内容将在页面上执行。请注意,我在菜单中添加了一个类,并在加载时执行。
在这里,我使用 jQuery “伪造” ajax Deferred
- jQuery.ajax()
返回一个 deferred,所以它真的可以是一个很好的伪造品。
请注意,我注释掉了console.log()
以使此示例更清晰,但您可以取消注释以查看它们以查看每个步骤的内容。
注意只是为了清楚 jQuery
$.getScript(myurl);
是一个别名
$.ajax({
url: myurl,
dataType: "script",
success: success
});
所以,鉴于我也为独立脚本添加了一个假的 ajax。
// this is fake ajax content
var ccode = '<div class="info-box bg-pink hover-expand-effect"><div class="icon"><i class="material-icons">playlist_add_check</i></div><div class="content"><div class="text">NEW TASKS</div><div class="number count-to" data-from="0" data-to="125" data-speed="15" data-fresh-interval="20"></div></div></div><scr';
ccode += 'ipt>$(".menu").addClass("showAction")</scr';
ccode += 'ipt>';
// this is fake script content
var fakeScript = '<scr' + 'ipt>$("#main-content").addClass("showScriptLoaded")</scr';
fakeScript += 'ipt>';
// this is fake script content
var otherFakeScript = '<scr' + 'ipt>console.log("proof"+$(".goodchild").text());$(".goodchild").append(" says Howdy!");</scr';
otherFakeScript += 'ipt>';
// just for the demo, think of this as ajax
function getFakeAjax(deferred) {
//console.log('in fake ajax');
deferred.then(function(data) {
//console.log('fake stuff then');
return data;
})
.done(function(data) {
//console.log('fake ajax data', data);
$("#main-content").html(data);
// kick off fakescript load
var def2 = $.Deferred(getFakeScript);
// pass that fake ajax object
def2.resolve(fakeScript);
})
.fail(function() {});
}
// just for the demo, think of this as getScript
function getFakeScript(deferred2) {
//console.log('in fake ajax');
deferred2.then(function(data) {
//console.log('fake stuff then');
return data;
})
.done(function(data) {
if (jQuery) {
// jQuery is loaded
alert("Yeah! well duh we just used it");
} else {
// jQuery is not loaded
alert("Doesn't Work");
}
//console.log('fake ajazx script', data);
$(data).appendTo("#main-content");
})
.fail(function() {});
}
function setPage(page) {
//console.log('setPage', page);
// I used the fake for this
// $.ajax({
// url: page,
// }).done(function(data) {
// $("#main-content").html(data);
// });
// call the fake the ajax
var def = $.Deferred(getFakeAjax);
// fax ajax done (second one)
def.done(function(data) {
// pretend our server is slow to load first script
// 4 seconds later kick off second fakescript load
setTimeout(function() {
var def2 = $.Deferred(getFakeScript);
// pass that fake ajax object
def2.resolve(otherFakeScript);
}, 4000);
})
// pass that fake ajax object
def.resolve(ccode);
}
.showAction {
border: solid lime 2px;
}
.showScriptLoaded {
border: solid red 2px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap-theme.css" rel="stylesheet" />
<body>
<div class="menu">
<ul class="list">
<li class="header">MAIN NAVIGATION</li>
<li class="active">
<a href="index.html">
<i class="material-icons">home</i>
<span>Home</span>
</a>
</li>
<li>
<a href="javascript:void(0);" onclick="setPage('child.jsp')">
<i class="material-icons">text_fields</i>
<span class="goodchild">Child page</span>
</a>
</li>
</ul>
</div>
<section class="content" id="main-content">get content here
</section>
</body>
推荐阅读
- python - 我正在尝试通过 Python 中的 ZEEP 客户端调用 SOAP API,但出现 SSL 错误
- mysql - 将数据库mysql工作台与android studio连接时,用户'root'@'laptop-xxx'(使用密码:是)的访问被拒绝。我可以知道是什么问题吗
- javascript - 尝试访问此 ref 将失败。你的意思是使用 React.forwardRef()
- reactjs - 反应按钮颜色不变
- python - 用于 CNN 实施的 shuffle 小批量中的关键错误
- html - 如何仅为标题添加另一个背景图像或颜色?
- mongodb - MongoDB中的GroupBy并从集合中获取所有值
- python - django 不渲染第一个
- javascript - Javascript/D3 - 绘制雷达图
- angular - 为 Angular 设置 Http 标头以修复 401 REST API 身份验证错误