使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题

一、问题分析

对于后台系统,相比大家都有所印象,知道其中的布局结构,如图:

使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题

在这种布局中我们需要将header,sidebar,footer分开,而且对于中间部分的content内容需要动态变化,即根据不同菜单定位到不同页面,而整体布局不会变化

这种布局结构对于单纯的HTML不具备这种嵌入各部分内容的能力,所以就需要我们自己来寻找或者解决这种问题,由于jquery的兼容性和使用广度比较不错,这里

使用jquery的load方法来处理这种页面布局框架。

二、load方法详解

1.定义
$(selector).load(URL,data,callback);

必需的 URL 参数规定您希望加载的 URL。

可选的 data 参数规定与请求一同发送的查询字符串键/值对集合。

可选的 callback 参数是 load() 方法完成后所执行的函数名称。

2.示例

  • 也可以把 jQuery 选择器添加到 URL 参数。

 下面的例子把 "demo_test.txt" 文件中 的元素的内容,加载到指定的 <div> 元素中:

    $("#div1").load("demo_test.txt #p1");
  • 可选的 callback 参数规定当 load() 方法完成后所要允许的回调函数。回调函数可以设置不同的

$("#div1").load("demo_test.txt",function(responseTxt,statusTxt,xhr){
    if(statusTxt=="success")
      alert("外部内容加载成功!");
    if(statusTxt=="error")
      alert("Error: "+xhr.status+": "+xhr.statusText);
  });

三、布局框架load的使用

1.问题

网上很多人在使用load方法加载动态页面的时候遇到一个普遍的问题,就是在被加载页面中的JavaScript代码失效,这是因为load加载的外部文件会把Script部分删除掉,所以被加载页面中调用该页面的JavaScript的时候就会出现xxxfunction未定义。

2.解决

  • 对于header,sidebar,footer这种只包含静态HTML代码的部分直接使用load加载
  • 对应中间content变化的内容,一般都会包含对应的JavaScript代码,使用自定义的load方法(如下代码),在使用jquery.load()方法加载对应的内容的同时,使用load的回调方法处理JavaScript的加载,将被加载页面的JavaScript代码加载到布局页面的<div ></div>中这样每次load()的时候content的内容都会被覆盖,所以也不必担心重复加载的问题。这样就完美解决被加载页面js失效的问题。具体代码如下所示:

四、代码示例

布局页面:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <!-- Tell the browser to be responsive to screen width -->
        <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
        <!-- Bootstrap 3.3.6 -->
        <link  href="../resources/bootstrap/css/bootstrap.min.css">
       
    </head>

    <body class="hold-transition skin-blue-light sidebar-mini" onload="onload();">
        <div class="wrapper">
            
            <div >
            
            </div>
            
            <!-- Left side column. contains the logo and sidebar -->
            <div >
            
            </div>

            <!-- Content Wrapper. Contains page content -->
            <div  class="content-wrapper clearfix">
                <!-- Content Header (Page header) -->
                
                
            </div>
            <!-- /.content-wrapper -->

            <div >
            
            </div>
            
            <!-- Add the sidebar's background. This div must be placed
       immediately after the control sidebar -->
            <div class="control-sidebar-bg"></div>

        </div>
        <!-- ./wrapper -->

        <!-- jQuery 2.2.3 -->
        <script src="../resources/plugins/jQuery/jquery-2.2.3.min.js"></script>
        <!-- Bootstrap 3.3.6 -->
        <script src="../resources/bootstrap/js/bootstrap.min.js"></script>
        
        <!--左侧菜单-->
        <script src="../resources/dist/js/common/global.js"></script>
        <script src="../resources/dist/js/menu/menuTemplate.js"></script>
        <script src="../resources/dist/js/menu/menu.js"></script>
    </body>
<script>

 //加载页面布局的header,sidebar,footer的内容
 $("#header").load("inc/header.html");
 $("#sidebar").load("inc/sidebar.html");
 $("#footer").load("inc/footer.html");
 
 /*
 *加载变换内容,主要url参数为dom对象,并且该dom中的url放在href中,
 *调用方式如:<span onclick="javascript:load(this);" href="/backstage/website/test.html">测试</span>
 *注意:1.该dom对象最好不要用a标签,因为点击a标签会进入href指定的页面
 *      2.要加载的内容要用  标注,因为load中指明了加载页面中指定的id为content下的内容
 *    3.对应页面的JavaScript写在content下
 */
 function load(url, data){
     //alert($(url).attr("href"));
     $.ajaxSetup({cache: false });
     $("#content").load($(url).attr("href")+ " #content ", data, function(result){
         //alert(result);
         //将被加载页的JavaScript加载到本页执行
         $result = $(result); 
         $result.find("script").appendTo('#content');
     });

 }
</script>
</html>

被加载页面:

<div >
    <div>测试二</div>
    <span onclick="javascript:load(this);" href="/backstage/website/test.html">测试</span>
    <a href="javascript:test();">测试</a>
    <script>
        function test(){
            alert("测试二页面");
        }
    </script>
    <script>
        function test2(){
            alert("ceshi");
        }
    </script>
</div>

效果截图:

使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题

更多相关文章
  • 比如获取被load页面的所有a的集合,类似$("a")? 可以的.不过需要在回调中处理.像这样 $(selector).load('url',function(){ //此时加载的html已经在页面上了.在这里可以通过选择器获取加载后的dom }) 不知道是不是你想要的效果 第一 ...
  • jquery Ajax的load方法及实例
    jQuery 的 load() 方法通过 AJAX 请求从服务器加载数据,并把返回的数据放置到指定的元素中.ajax() 方法通过 HTTP 请求加载远程数据,该方法是 jQuery 底层 AJAX 实现.jquery中的load方法:(1).前面没有jquery.修饰,可以推断出他是一个普通的非全 ...
  • 图片懒加载imglazylod之jquery.lazy.load.js的使用说明介绍及在移动端的兼容
    首先申明,jQueryLazyLoad在手机上是存在兼容性问题的而且官网下载的jqueryLazyLoad.js还没有效果,这里我从一个博客里面找了另一个js文件https://raw.githubusercontent.com/tuupola/jquery_lazyload/master/jque ...
  • on()函数用于为指定元素的一个或多个事件绑定事件处理函数了,从jQuery 1.7开始,on()函数提供了绑定事件处理程序所需的所有功能,用于统一取代以前的bind(). delegate(). live()等事件函数了,下面一起来看几个jquery on() 方法绑定动态元素的例子即使是执行on ...
  • ajax我们在没有jquery插件之前都是使用原生的ajax了,但有了jquery插件之后我们就直接使用了jquery ajax了,下面我们一起来看看js与jquery ajax使用方法及对比分析吧.这篇博文,是我不知道什么是ajax到熟练运用ajax的一个历程.一,最原始的方式来运用ajax &l ...
  • 下面我给大家整理css/JS/jquery三种方法去掉链接虚线框,希望本文章能给各位同学带来帮助哦.css: 兼容性很差. 代码如下 a:focus,input:focus {outline:none;} 在 Firefox 里可以用 -moz-outline:none; 或者 outline:no ...
  • get和load方式是根据id取得一个记录 下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来. 1.从返回结果上对比: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常 get方法检索不到的话会返回null 2 ...
  • 本介绍了关于jquery中的not方法,这是一个关于jQuery过滤选择器方法有需要使用的同学可以参考一下本文章.jQuery(':not(selector)')在jQuery的早期版本中,:not()筛选器只支持简单的选择器,说明我们传入到:not这个filter中的selector可以任意复杂, ...
  • promise是一个动画事件了,我们可以利用它来创建很多各种动画效果了,下面小编为各位介绍jQuery 动画 promise()方法使用例子jQuery 的 show.hide 方法大家都好熟悉的,也知道它可以接受一个回调函数,用于动画完成后执行.比如:$('.js-sam').hide('slow ...
一周排行