在多个页面使用同一个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 相关文章推荐
js 判断 enter 事件
Feb 12 Javascript
javascript for循环设法提高性能
Feb 24 Javascript
javascript中callee与caller的用法和应用场景
Dec 08 Javascript
理清apply(),call()的区别和关系
Aug 14 Javascript
Javascript 浮点运算的问题分析与解决方法
Aug 27 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
Sep 12 Javascript
纯javascript模仿微信打飞机小游戏
Aug 20 Javascript
微信小程序 开发之顶部导航栏实例代码
Feb 23 Javascript
浅谈js获取ModelAndView值的问题
Mar 28 Javascript
用Node编写RESTful API接口的示例代码
Jul 04 Javascript
vue实现双向绑定和依赖收集遇到的坑
Nov 29 Javascript
vue实现全匹配搜索列表内容
Sep 26 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
如何隐藏你的.php文件
2007/01/04 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
利用PHP生成静态html页面的原理
2016/09/30 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
定义select的边框颜色
2008/04/28 Javascript
javascript 单例/单体模式(Singleton)
2011/04/07 Javascript
js 延迟加载 改变JS的位置加快网页加载速度
2012/12/11 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
js实现简单的购物车有图有代码
2014/05/26 Javascript
jquery选择器需要注意的问题
2014/11/26 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
浅谈javascript中onbeforeunload与onunload事件
2015/12/10 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
JS实现数组的增删改查操作示例
2018/08/29 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
如何通过shell脚本自动生成vue文件详解
2019/09/10 Javascript
生成无限制的微信小程序码的示例代码
2019/09/20 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
Django项目后台不挂断运行的方法
2019/08/31 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
python标识符命名规范原理解析
2020/01/10 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
详解pandas中iloc, loc和ix的区别和联系
2020/03/09 Python
pip安装tensorflow的坑的解决
2020/04/19 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
Python grpc超时机制代码示例
2020/09/14 Python
phpquery中文手册
2021/03/18 PHP
Sofmap官网:日本著名的数码电器专卖店
2017/05/19 全球购物
社区学习雷锋活动总结
2014/04/25 职场文书
医院护士工作检讨书
2014/10/26 职场文书
2014年售票员工作总结
2014/11/19 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python