pjax php,php整合pjax(pushstate+ajax)实现无刷新页面

article/2025/8/27 4:53:34

PJAX效果

通过url可以跟踪ajax的动态加载内容。这种技术尤其在two step view布局的视图中有很大的好处。无刷新加载页面,意味着响应速度和用户体验得到了极大的提升,在静态脚本和通用模块比较多的情况下,最大程度上节省了重用部分的开销。应用例子可以参考现在的google+、facebook和新版微博,同样是基于html5的pushState实现。g plus的表现最为明显,点击导航栏地址,箭头随目标移动,同时加载的页面淡入,效果很炫。

Dirty url 和 Clean url

在pjax出现之前,要实现页面的无刷新加载并通过url可以追踪,需要浏览器支持window.location.hash属性。通过判断url#锚后记录的地址来决定需要加载的内容,具体的构建方法是写一个hashchange的监视函数,当触发到hash改变时便判断加载内容。它的不足在于,对于低版本的浏览器例如ie6不支持hash,需要另外构建一个iframe来记录历史url实现前进和后退。最大的问题,便是#后生成的内容不会被搜索引擎索引到,google之前提供了解决方案,提倡使用#!把地址引导到一个?escape_fragment=url的请求地址中,我在twitter、facebook、人人、新浪微博和已经关闭了的豆瓣说中都看见曾经或正在使用这种hash bang。通过#!来实现无刷新加载的url,由于一般的方法不容易被搜索引擎收录(例如国内百度),称其为dirty url,相对而言,pjax能够使用clean url得到同样效果,并能很好地兼容各种浏览器,是现在最为适合的方法

使用PHP+jQuery实现PJAX

不需要从头编写基于pushState的javascript插件,因为jQuery已有项目把它开源出来,而且很轻易便能实现。目前我已经在开发中的项目里引入,而且很好地在原有的基础上兼容,何况新版微博的推广,我希望让观众看到,我用完之后是这个样子,你们用完之后也会是这个样子

开始前的准备:

3. PHP项目代码(方便分享,本文使用codeigniter和yaf框架演示,实际开发中大同小异)

一 前端实现

最最最基本需要先引入jquery库,在页头中引入脚本地址 (sina的cdn)

根据第二条中的项目插件,加入jq的pjax插件地址

接下来,我们来看看github上作者的说明,更直接,可以直接打开插件看代码。最简单的使用方法如下

$('#main').pjax('a')

上述语句表示,点击dom中的任何a标签,将会发起pjax请求并将内容替换到id为main的页面元素内

使用实在简单,而且jquery-pjax这个插件封装得很好,绝对可以按照你的喜好来定制(例如复制g plus的效果),下面是一个整合以上步骤的基本html示例代码

$(document).ready(function(){

$("#main").pjax("a");

});

替换的内容

最终的目的,就是点击地址为/test1和/test2的a标签时,通过ajax返回的结果将id为main的div内的文字替换为相应的地址内容,url自动更新,同时页面不会重新载入。下面开始实现后端要处理的内容

二.PHP端的实现

php端需要处理的任务主要是两件:1.实现layout视图布局  2.判断pjax过来的请求

layout使每个视图的输出都是在一个公用模版之上。

CI的实现:

写一个自定义的layout library文件:

/*

*

* --------------------------------------------------------------------

* 视图布局类

* --------------------------------------------------------------------

*

* @author ekin.cen

*

*/

class Layout{

public $obj;

public $disable_layout = FALSE;

protected $_layout;

protected $_layout_dir = 'layout';

protected $_template_dir = 'templates';

protected $_data = array();

public function __construct()

{

$this->obj = &get_instance();

}

public function set_layout($layout)

{

$this->_layout = $layout;

return $this;

}

public function set_layout_dir($dirname)

{

$this->_layout_dir = $dirname;

return $this;

}

public function set_template_dir($dirname)

{

$this->_template_dir = $dirname;

return $this;

}

public function view($view, $data = NULL, $return = FALSE)

{

$view = $this->_template_dir . DIRECTORY_SEPARATOR . $view;

$this->_layout = $this->_layout_dir . DIRECTORY_SEPARATOR . $this->_layout;

if ($this->_data)

{

$data = $data ? array_merge($this->_data, $data) : $this->_data;

}

if ($this->disable_layout)

{

echo $this->obj->load->view($view, $data, TRUE);

}

else

{

$data = array('TEMPLATE_CONTENT' => $this->obj->load->view($view, $data, TRUE));

$this->obj->load->view($this->_layout,$data,$return);

}

}

public function assign($key, $value = null)

{

$data = is_array($key) ? $key : array($key => $value);

$this->_data = array_merge($data, $this->_data);

return $this;

}

}

/* End of file */

将以上文件命名未Layout.php放在application/libraries文件夹中,并在autoload文件中加入:

$autoload['libraries'] = array('layout');

调用时,在一般的controller中输出视图的方法

$this->load->view(TEMPLATE_PATH,$data);

变成:

$this->layout->view(TEMPLATE_PATH,$data);

以上Layout文件中视图模版的输出路径默认在 /view/templates/,layout模版对应的位置为/view/layout/ ,在/view/layout中新建一个模版文件(layout_test.php), 代码如下:

$(document).ready(function(){

$("#main").pjax("a");

});

test1test2

=$LAYOUT_CONTENT;?>

上面只是将html模版中要替换的内容变成了我们控制器需要输出的视图模版内容($LAYOUT_CONTENT)。

到目前为止已经可以在CI中使用layout,剩下的就是在前端控制器中判断请求类型,如果存在$_SERVER['HTTP_X_PJAX']类型,就不输出layout,直接返回组件的渲染内容。

使用自定义的控制器,在application/core文件夹中新建文件 MY_Controller(默认的前缀根据配置定义),添加如下代码:

/*

*

* @author ekin.cen

*

*/

class MY_Controller extends CI_Controller

{

//默认的layout模版

protected $_layout = 'layout_test';

public function __construct()

{

parent::__construct();

$this->_initialize();

}

protected function _initialize()

{

//如设置了autoload文件,则此步省略

$this->_set_layout();

// check if is pjax request

if (array_key_exists('HTTP_X_PJAX', $_SERVER) && $_SERVER['HTTP_X_PJAX'])

{

$this->layout->disable_layout = true;

}

}

protected function _set_layout()

{

$this->load->library('layout');

$this->layout->set_layout($this->_layout);

}

}

/* End of file MY_Controller.php */

到此为止,已经准备好并能测试效果了 :)

编写两个测试控制器test1和test2, 通过layout方法输出视图

class Test1 extends MY_Controller{

public function index(){

$this->layout->view('test1');

}

}

打开浏览器查看网络请求状态

deaf90030f3d4d0cd170cbde1181ecbd.png

上图是点击地址为“/test”的a标签后得到的pjax请求,说明整合成功

--------------------------------------

jquery-pjax使用中需要注意的事项:

1.返回的模版内容不能为纯文本,需要用html标签包裹

2.插件的使用方法,详情参考github的项目说明,更新后使用方法或有不同

3.对于不支持pushstate的低版本浏览器,pjax插件会自动判断并使用传统的页面加载模式

4.当一个页面的pjax请求时间超过设定时间时,会使用刷新来加载,需要调整插件内的相关参数


http://chatgpt.dhexx.cn/article/C28RVlyl.shtml

相关文章

html5 pjax,pjax——页面无刷新跳转

pjax虽然不是什么新的技术,然而本人是最近才发现这个比较牛叉的技术。下面是对pjax的介绍: pjax是在HTML5里面引用的新技术,是对ajax pushState的封装,是实现无刷新ajax加载并解决浏览器前进和后退问题的一个开源实现。同时支持了…

java pjax_(转)PJAX的实现与应用

一、前言 web发展经历了一个漫长的周期,最开始很多人认为Javascript这们语言是前端开发的累赘,是个鸡肋,那个时候人们还享受着从一个a链接蹦到另一个页面的web神奇魔术。后来随着JavaScript的不断更新换代,他的功能不仅仅是为网页…

html5 pjax,关于PJAX局部刷新

前言部分 本教程最先来自鬼少博客,后论坛有人补充搜索和评论,然后又被各种转载,转完甚至还有阉割现象,导致会出现各种问题,于是,我这里再重发一次。虽然注释很清楚,但是,还有很多人看不懂&#…

java pjax_pjax简单实例

ajax缺点是破坏了浏览器的前进后退,因为ajax的请求不会留在历史记录中。pjax就不一样了,pjax被解释成ajaxpushState的封装,因为它把ajax的请求写入历史记录,并反映在地址栏,这样用户就能愉快地使用前进后退了。pjax有好…

Typecho开启全站Pjax

原文地址:Typecho开启全站Pjax 前言 因为上次更新后加入民音乐插件,但是有个问题就是在页面跳转的时候由于页面已经刷新了,所以音乐就不会继续播放了,就想着去引入Pjax来解决这个问题,同时引入pjax后比较直观的改变就…

pjax使用小结

前言 上周看到一篇文章在分析简书 我的主页 页面 3 个 tab 页切换的 bug,起先以为是寻常的样式 bug 而已没怎么在意,后来在文章中看到 pjax 这个术语,长得和 ajax 有点像,遂去了解了下。 简介 虽然传统的 ajax 方式可以异步无刷新…

网站访问速度优化之pjax

pjax 是 ajax 和 pushState 的结合,它是一个 jQuery 插件。它通过 ajax 从服务器端获取 HTML 文件,在页面中用获取到的HTML替换指定容器元素中的内容。然后使用 pushState 技术更新浏览器地址栏中的当前地址,并且保持了真实的地址、网页标题&…

idea热更新

配置idea热更新 第一步:下载插件 JRebel idea-file-settings-plugins搜JRebel 点击installed下载 我这里已经下载好。 第二步:配置GUID 点击jrebel Activation,开始配置 第一行是服务器地址:https://jrebel.qekang.com/{GUID} G…

webpack和vue热更新

目录 webpack一些概念介绍 webpack热更新流程 1. 启动阶段 ①->②->A->B 2. 更新阶段 ①->②->③->④ vue的组件热更新模块 总结 提到热更新,首先我们要有一个概念:Vue有热更新模块,而webpack也有它的HRM模块&#x…

JAVA实现代码热更新

JAVA实现代码热更新 引言类加载器实现热更新思路多种多样的加载来源SPI服务发现机制 完整代码类加载器共享空间机制Tomcat如何实现JSP的热更新Spring反向访问用户程序类问题补充细节推荐资源 引言 本文将带领大家利用Java的类加载器加SPI服务发现机制实现一个简易的代码热更新…

cordova打包app热更新问题

定义: 基于 cordova 框架能将web应用 (js, html, css, 图片等) 打包成 App。当 App 在终端上安装后,不需要重新下载app,实现内壳更新。 原理:1.在项目根目录的config.xml文件中添加指向服务器的地址 2.在www目录中添加chcp.json配…

【热更新】游戏热更新方案

游戏热更新方案 热更新演化热更新方案【1】 进程切换1.1 利用fork、exec切换1.2 利用网关切换1.3 微服务- 进程切换注意要点 【2】 动态库替换【3】 脚本语言热更新热更新探究最简单的实现热更的方法最简单的实现热更的方法的局限性热更新全局替换模块方法的局限性 工程实现1. …

Addressable热更新

文章目录 前提配置代码实现 前提配置 (1)勾选AddressableAssetSettings设置的Disable Catalog Update On Startup选项 (2)相应的热更戏资源分组配置(注:此文采用的是动态资源更新) Can Change …

Nacos配置热更新的4种方式、读取项目配置文件的多种方式,@value,@RefreshScope,@NacosConfigurationProperties

nacos实现配置文件的热更新,服务不用重启即可读取到nacos配置中心修改发布后的最新值,spring,springboot项目读取本地配置文件的各种方式;文章中介绍了一下注解的使用:NacosConfigurationProperties,NacosP…

Unity 热更新技术 | (一) 热更新的基本概念原理及主流热更新方案介绍

🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 &…

JAVA热更新

引言 知识储备先看这篇文章:JAVA Instrument 在这个案例中我们会利用Instrument机制实现一个简单的热更新案例。 总体来说,步骤如下: 创建一个带premain方法的jar包。这个方法定时检测某个文件然后进行热更新。命令行启动业务类时使用参数…

热更新 深度解析

APP热更新方案 为什么要做热更新 当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就会忙得焦头烂额:重新打包App、测试、向各个应用市场和渠道换包、提示用户升级、用户下载、覆盖安装。 重点是还会有原来的版本遗留…

webpack热更新

什么是模热更新?有什么优点 模块热更新是webpack的一个功能,它可以使得代码修改之后,不用刷新浏览器就可以更新。 在应用过程中替换添加删出模块,无需重新加载整个页面,是高级版的自动刷新浏览器。 优点&#xff1a…

electron 热更新

1. electron自带的整体更新方式 (全量更新) 这种方式为electron官方的升级更新方式,主要是通过主进程中的autoUpdater模块进行检测升级更新的,此方式也是大家常见的大多数electron应用程序的更新方式。 检测到新版本后从服务器拉…

uniApp实现热更新

热更新 热更新是开发中常见且常用的一种软件版本控制的方式,在uniapp进行使用热更新将软件实现更新操作 思路: 服务器中存储着最新版本号,前端进行查询可以在首次进入应用时进行请求版本号进行一个匹对如果版本号一致则不提示,反之则提示进行…