美文网首页程序员
TP5实现Ajax获取页面并渲染

TP5实现Ajax获取页面并渲染

作者: YEYU2001 | 来源:发表于2019-03-19 15:08 被阅读2次

    利用Thinkphp 5 的MVC模式很容易实现HTML页面的模块分割,利用Ajax技术就可以实现部分页面的异步刷新,从而实现Web级APP——主页面的框架、CSS样式、Javascript文件等只载入一次;根据用户的实际需求随时载入所需文件到本地——比如Body页面中的<section id="content"></section>中。

    但是通过Ajax获取的页面通过操作DOM更新到页面时,加载部分的页面无任何CSS样式,通过百度搜索了很长时间,虽然方法很多,但是都无法解决!

    最后终于找到了根源:通过jQuery的.html()很难解决,但通过Javascript的innerHTML操作DOM无需任何操作即可渲染页面!

    document.getElementById(location).innerHTML = data; // 必须使用原生的innerHTML
    

    整个Thinkphp 5.1下实现Ajax异步刷新页面并渲染是需要两步即可:

    第一步:创建Javascript函数便于重复利用

    /**
     * 动态加载页面并渲染
     * @param  {文本} url      请求的地址 "{:url('admin/Leave/history2')}"
     * @param  {文本} location 需要加载页面的位置id值(如<section id="content">)
     * -----------------------------------------------------------------------------
     * 注意:
     *     1. Html页面A标签的onclick必须采用以下格式:
     *        onclick='loadAjaxHTML("{:url('admin/Leave/history2')}","content");'
     *     2. 思路:直接利用MVC的View部分——Thinkphp5的 return $this->fetch()取回页面
     *        好处是中间可以用任意的对页面进行赋值和分配,在后端不需要任何的修改
     *     3. 意味着通过TP5实现Ajax动态加载页面做到不刷新的APP级别Web应用的可实现性!
     * -----------------------------------------------------------------------------
     */
    function loadAjaxHTML(url,location){
        //设置默认参数
        var location = arguments[1] ? arguments[1] : 'content';     // 加载位置id
        // 采用JQuery的Get方法得到页面
        $.get(url, function(data) {
            // 必须使用原生的innerHTML才能不丢失CSS样式
            document.getElementById(location).innerHTML = data;
            // showMsg("页面加载完毕");
        });
    }
    

    第二步:前端代码修改href="#"值后添加onclick事件

    <a href="#" onclick='loadAjaxHTML("{:url('admin/Leave/index')}");'>事假</a>
    

    后端的PHP代码无需做出任何修改,在控制器中查询数据并分配到页面中,然后一起发送到页面!

    <?php
    namespace app\admin\controller;
    use app\admin\model\Leave as LeaveModel;
    use think\Controller;
    use think\Db;
    use think\facade\Request;
    
    class Leave extends Valid {
        //输出页面
        public function index() {
            // 查询数据
            $list = LeaveModel::where(['status' => [1, 2]])->all();
            $this->assign('list', $list);
            //输出页面
            return $this->fetch();
        }
    }
    
    TP5实现Ajax获取页面并渲染

    相关文章

      网友评论

        本文标题:TP5实现Ajax获取页面并渲染

        本文链接:https://www.haomeiwen.com/subject/oiogmqtx.html