在多个页面使用同一个HTML片段的代码


Posted in Javascript onMarch 04, 2011

问题描述
有一个比较复杂的HTML片段(A),如果把这个HTML片段嵌入到其他页面中(B,C,D....)。
问题的关键是在HTML片段中有大量的JavaScript逻辑需要处理,比如说分页,点击事件响应等。

对于这个问题,我们用一个简单的例子来说明:
“页面上有一个按钮,点击此按钮引入一个HTML片段,此HTML片段中有分页按钮。”

1. 使用IFrame
主页面,点击一个按钮向页面引入一个IFrame:

    <script type="text/javascript">
        $(function() {
            $("#clickToInsert").click(function() {
                $("#placeholder").html('<iframe src="iframe.htm"></iframe>');
            });
        });
    </script>
    <input type="button" id="clickToInsert" value="Insert HTML" />
    <div id="placeholder">
    </div>
    IFrame页面,模拟分页的情况: 
    <script type="text/javascript">
        $(function() {
            var parent = $("#complex_page_segment");
            $(".previous", parent).click(function() {
                $(".content", parent).html("Previous Page Content");
            });
            $(".next", parent).click(function() {
                $(".content", parent).html("Next Page Content");
            });
        });
    </script>
    <div id="complex_page_segment">
        <input type="button" value="Previous Page" class="previous" />
        <input type="button" value="Next Page" class="next" />
        <div class="content">
            Page Content</div>
    </div>

2. AJAX返回页面片段,并注册事件
注:我们通过textarea来模拟返回的HTML片段。

    <script type="text/javascript">
        $(function() {
            $("#clickToInsert").click(function() {
                $("#placeholder").html($("#clone").val());
                var parent = $("#complex_page_segment");
                $(".previous", parent).click(function() {
                    $(".content", parent).html("Previous Page Content");
                });
                $(".next", parent).click(function() {
                    $(".content", parent).html("Next Page Content");
                });
            });
        });
    </script>
    <input type="button" id="clickToInsert" value="Insert HTML" />
    <div id="placeholder">
    </div>
    <textarea id="clone" style="display: none;">
    <div id="complex_page_segment">
        <input type="button" value="Previous Page" class="previous" />
        <input type="button" value="Next Page" class="next" />
        <div class="content">Page Content</div>
    </div>
    </textarea>

由于我们需要在多个页面引用同一个HTML片段,这种方法导致大量事情处理被重复性的拷贝粘贴,明显我们需要将公共的方法提取出来。

3. AJAX返回页面片段,并调用页面片段中的函数注册事件

    <script type="text/javascript">
        $(function() {
            $("#clickToInsert").click(function() {
                $("#placeholder").html($("#clone").val());
                init_complex_page_segment();
            });
        });
    </script>
    <input type="button" id="clickToInsert" value="Insert HTML" />
    <div id="placeholder">
    </div>
    <textarea id="clone" style="display: none;">
    <script type="text/javascript">
        function init_complex_page_segment() {
            var parent = $("#complex_page_segment");
            $(".previous", parent).click(function() {
                $(".content", parent).html("Previous Page Content");
            });
            $(".next", parent).click(function() {
                $(".content", parent).html("Next Page Content");
            });
        }
    </script>
    <div id="complex_page_segment">
        <input type="button" value="Previous Page" class="previous" />
        <input type="button" value="Next Page" class="next" />
        <div class="content">Page Content</div>
    </div>
    </textarea>

其实我们可以更进一步,完全没必要手工调用这个函数,而是可以在返回的HTML片段中让其自动执行。

4. AJAX返回页面片段,其事件自动注册

    <script type="text/javascript">
        $(function() {
            $("#clickToInsert").click(function() {
                $("#placeholder").html($("#clone").val());
            });
        });
    </script>
    <input type="button" id="clickToInsert" value="Insert HTML" />
    <div id="placeholder">
    </div>
    <textarea id="clone" style="display: none;">
    <script type="text/javascript">
        $(function() {
            var parent = $("#complex_page_segment");
            $(".previous", parent).click(function() {
                $(".content", parent).html("Previous Page Content");
            });
            $(".next", parent).click(function() {
                $(".content", parent).html("Next Page Content");
            });
        });
    </script>
    <div id="complex_page_segment">
        <input type="button" value="Previous Page" class="previous" />
        <input type="button" value="Next Page" class="next" />
        <div class="content">Page Content</div>
    </div>
    </textarea>

最后一种方法和第一种IFrame的方式是我们所推荐的。
下载源代码
Javascript 相关文章推荐
用jquery统计子菜单的条数示例代码
Oct 18 Javascript
详解JavaScript函数
Dec 01 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
Dec 01 Javascript
jquery点击展示与隐藏更多内容
Dec 03 Javascript
两种简单的跨域方法(jsonp、php)
Jan 02 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
Nov 08 Javascript
vue中keep-alive组件的入门使用教程
Jun 06 Javascript
Emberjs 通过 axios 下载文件的方法
Sep 03 Javascript
如何通过javaScript去除字符串两端的空白字符
Feb 06 Javascript
微信小程序利用for循环解决内容变更问题
Mar 05 Javascript
JavaScript实现轮播图效果
Oct 30 Javascript
vue的webcamjs集成方式
Nov 16 Javascript
如何确保JavaScript的执行顺序 之实战篇
Mar 03 #Javascript
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
Mar 03 #Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
Mar 03 #Javascript
jQuery 操作option的实现代码
Mar 03 #Javascript
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
Mar 03 #Javascript
jquery中实现简单的tabs插件功能的代码
Mar 02 #Javascript
基于jQuery的简单的列表导航菜单
Mar 02 #Javascript
You might like
模板引擎正则表达式调试小技巧
2011/07/20 PHP
使用PHP破解防盗链图片的一个简单方法
2014/06/07 PHP
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
2015/04/08 PHP
解决Laravel 不能创建 migration 的问题
2019/10/09 PHP
Ext JS Grid在IE6 下宽度的问题解决方法
2009/02/15 Javascript
JQuery入门—编写一个简单的JQuery应用案例
2013/01/03 Javascript
jQuery中after的两种用法实例
2013/07/03 Javascript
JavaScript实现Base64编码转换
2016/04/23 Javascript
浅析Bootstrap组件之面板组件
2016/05/04 Javascript
jQuery Chart图表制作组件Highcharts用法详解
2016/06/01 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
Javascript动画效果(1)
2016/10/11 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
vue 多入口文件搭建 vue多页面搭建的实例讲解
2018/03/12 Javascript
去掉vue 中的代码规范检测两种方法(Eslint验证)
2018/03/21 Javascript
微信小程序自定义键盘 内部虚拟支付
2018/12/20 Javascript
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
Python3.6 Schedule模块定时任务(实例讲解)
2017/11/09 Python
人脸识别经典算法一 特征脸方法(Eigenface)
2018/03/13 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
2018/05/10 Python
下载官网python并安装的步骤详解
2019/10/12 Python
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
python中使用input()函数获取用户输入值方式
2020/05/03 Python
python使用QQ邮箱实现自动发送邮件
2020/06/22 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
某个公司的Java笔面试题
2016/03/11 面试题
《乞巧》教学反思
2014/02/27 职场文书
团日活动总结怎么写
2014/06/25 职场文书
新教师培训心得体会
2014/09/02 职场文书
旅游项目合作意向书
2015/05/08 职场文书
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers
python 遍历磁盘目录的三种方法
2021/04/02 Python