hexo-theme-fluid icon indicating copy to clipboard operation
hexo-theme-fluid copied to clipboard

Pjax支持

Open ekworp opened this issue 4 years ago • 22 comments

script.ejs页头加入

<% if(theme.pjax.enable){ %>
  <%- js_ex(theme.static_prefix.pjax, 'pjax.min.js') %>
  <%- js_ex(theme.static_prefix.nprocess, 'nprogress.min.js') %>
  <%- css_ex(theme.static_prefix.nprocess, 'nprogress.min.css') %>
<% } %>

static_prefix.yml文件最后加两行

pjax: https://cdn.jsdelivr.net/npm/pjax@latest/
nprocess: https://cdn.bootcss.com/nprogress/0.2.0/

主题配置文件加入,true或是false反正得有

pjax:
	enable: true

百度统计啥的 http://www.qingzz.cn/sort/ajax 这里有点解决方法 next主题是加个script加个pjax参解决的

<% if(theme.web_analytics.baidu) { %>
  <!-- Baidu Analytics -->
    <script defer pjax>

大家也可以找点别的方法 还有我用的daovoice 评论系统大家可以想想办法,我暂时不会用 下面是main.js加入的内容 我看main.js不错,在/source/js里面,然后自己再找点别的资料优化下 在最上面加入

pjax_init();
//初始化pjax
function pjax_init(){
    document.addEventListener('pjax:send', function() {
        NProgress.start();
    });
    document.addEventListener('pjax:complete', function() {
        NProgress.done();
    });
    document.addEventListener('pjax:error', function() {
    });
    document.addEventListener('pjax:success', function() {
    	//需要重建的js 从next主题复制来的 
	    document.querySelectorAll('script[pjax], #pjax script').forEach(element => {
	    var code = element.text || element.textContent || element.innerHTML || '';
	    var parent = element.parentNode;
	    parent.removeChild(element);
	    var script = document.createElement('script');
	    if (element.id) {
	      script.id = element.id;
	    }
	    if (element.className) {
	      script.className = element.className;
	    }
	    if (element.type) {
	      script.type = element.type;
	    }
	    if (element.src) {
	      script.src = element.src;
	      // Force synchronous loading of peripheral JS.
	      script.async = false;
	    }
	    if (element.getAttribute('pjax') !== null) {
	      script.setAttribute('pjax', '');
	    }
	    if (code !== '') {
	      script.appendChild(document.createTextNode(code));
	    }
	    parent.appendChild(script);
	  });
    });
	document.addEventListener('DOMContentLoaded', function() {
        var pjax = new Pjax({
    	elements: 'a[href]:not([href^="#"]):not([href="javascript:void(0)"])',
    	selectors: ["#pjax-container","title",".view"],
    	//三个分别是容器 标题 头图
		debug: true
	});
	pjax._handleResponse = pjax.handleResponse;
	pjax.handleResponse = function(responseText, request, href, options) {
		//就简单过滤一下就行
		if((href.indexOf("%E6%9C%88")!=-1)||(href.indexOf("/live")!=-1)&&!init1){
				init1=true;//标记已经被加载
				Promise.all([
					//引入外部js 从fghrsh的live2d复制来的
					loadExternalResource("https://cdn.bootcss.com/dplayer/1.25.0/DPlayer.min.css", "css"),
					loadExternalResource("/ytyz2020/js/hls.min.js", "js"),
					loadExternalResource("https://cdn.bootcss.com/dplayer/1.25.0/DPlayer.min.js", "js")
				]).then(() => {
					pjax._handleResponse(responseText, request, href, options);
				});
				//这里可以引入一些可以后加载的
				loadExternalResource("//cdn.jsdelivr.net/npm/[email protected]/dist/realtime-browser.min.js", "js");
				loadExternalResource("//cdn.jsdelivr.net/npm/[email protected]/dist/av-min.js", "js");
		}else{
	 	   pjax._handleResponse(responseText, request, href, options);
		}
		//有播放器需要销毁 可以自己写点别的需要处理的东西
		if(typeof dplayers != "undefined") 
    		for(i in dplayers)
				dplayers[i].destroy();
	}
});
}
var init1=false;//js标记防止重复加载以此类推
/*
没有加载live2d的去掉注释
// 封装异步加载资源的方法
function loadExternalResource(url, type) {
	return new Promise((resolve, reject) => {
		let tag;
		if (type === "css") {
			tag = document.createElement("link");
			tag.rel = "stylesheet";
			tag.href = url;
		} else if (type === "js") {
			tag = document.createElement("script");
			tag.src = url;
		}
		if (tag) {
			tag.onload = () => resolve(url);
			tag.onerror = () => reject(url);
			document.head.appendChild(tag);
		}
	});
}

总之 自由发挥吧,不要干复制,看看代码

ekworp avatar Mar 27 '20 11:03 ekworp

感谢建议,这个留着 v1 重构后再讨论吧。

0x2E avatar Mar 28 '20 01:03 0x2E

适配还有点困难呐 先搁着吧

ekworp avatar Mar 28 '20 02:03 ekworp

不行啊切换不了页面

CRRRRRAAAZY avatar Aug 02 '20 09:08 CRRRRRAAAZY

~好消息,dev分支已经更新了 pjax,欢迎体验测试,以便能更快地上线到正式版~

zkqiang avatar Oct 19 '20 04:10 zkqiang

elements: 'a:not([target="_blank"])',中添加data-fancybox可以解决点击大图后重新加载的问题 elements: 'a:not([target="_blank"]),data-fancybox',

onuns avatar Oct 23 '20 15:10 onuns

elements: 'a:not([target="_blank"])',中添加data-fancybox可以解决点击大图后重新加载的问题 elements: 'a:not([target="_blank"]),data-fancybox',

我没有复现出重新加载,另外是不是应该为 :not([data-fancybox])

zkqiang avatar Oct 24 '20 05:10 zkqiang

很遗憾,pjax并不成功

归其原因,是由于目前的页面代码结构,不适合 pjax 在切换界面做到局部加载

已经将代码回退了,下次有空再搞

zkqiang avatar Oct 24 '20 08:10 zkqiang

啥时候能成功呀. 成功我就准备换主题了. 👀

Hime-Hina avatar Dec 23 '20 17:12 Hime-Hina

啥时候能成功呀. 成功我就准备换主题了. 👀

看看我的https://aolog.cn

onuns avatar Dec 23 '20 23:12 onuns

坐等

whymesay avatar Jan 17 '21 12:01 whymesay

坐等,成功了我播放器就能人性一点了

zzzzz167 avatar Feb 22 '21 00:02 zzzzz167

坐等大佬✌🏻

jamexhuang avatar Mar 10 '21 08:03 jamexhuang

蹲一个

A1ca7raz avatar May 31 '21 08:05 A1ca7raz

等波适配

Atonioy avatar Jun 03 '21 01:06 Atonioy

https://nalocal.github.io

自個兒搗鼓了下,算是搞出了pjax,打字效果啦Markdown之類的都還行。 缺點是目前變得不支援懶載入,左右側欄的內容還需要修復一下 猜測網頁追蹤也會有點問題,這部分還要測試

p.s.events不知道怎麼整才可以每次重載

20210929更 懶加載跟目錄與其他小功能大致修復 不過做為主體的Fluid物件無法重載是硬傷,許多功能必須在pjax底下實現重載 如果要實現pjax,其結果會有點接近於客製

因為自己也是初學,老實說不確定思路正不正確,期待往後有大佬指點了

20220119更 https://nalocal.github.io/2021/11/16/fluidThemeShare/

因為想嘗試其他theme,將fluid的配置分享出來 文章發佈幾個月,目前已有網友自行移植成功,歡迎需要pjax的使用者取用

Mr-Smilin avatar Sep 27 '21 08:09 Mr-Smilin

致所有关注该 issue 的朋友:

关于为什么都 2022 年了 Fluid 依然没有加入 pjax 功能,原因是当初在我以为完成了 pjax 时候,发现我还是太年轻,并没有达到 pjax 真正用途,Fluid 不同页面的结构是有区别的,比如文章页面有侧边栏是单独一套结构,与其他页面对比会发现各种宽度的适配是有区别的,导致无法满足 pjax 局部加载的需求,另外也会导致类似 https://github.com/fluid-dev/hexo-theme-fluid/issues/442 这种问题。

我也看到有几位朋友试图去改造,但很遗憾这些改法都只是去适配现有的 js,让一些 js 比如音乐播放器在翻页时不会被刷新,但这并不是我想要的效果,这样为了某个小功能去引入另一个大功能的堆砌方式,违背了 Fluid “简洁”的设计初衷(事实上 Fluid 对比最初的版本反而是“瘦身”的,舍弃了很多臃肿的引入),这也是当初我放弃 Pjax 的原因。

想满足必须把所有页面重新设计并重写一次,然后再去加入 Pjax,改完还会产生一连串的适配 BUG。这个大工程就目前我一个人维护的情况下,我的精力和动力都是无法满足的(为了维护 Fluid 我的博客都已经停更),因此该 issue 还会继续处于无限搁置状态,希望各位理解。

如有需求可尝试通过上面朋友发的方法去魔改,下个版本我也会放出一些功能让大家可以更“无侵入式”完成自定义修改。

zkqiang avatar Feb 04 '22 08:02 zkqiang

https://jin-yuhan.github.io/ 这个博客搞定了,但是作者没出教程

thomas-art avatar Jul 13 '22 10:07 thomas-art

https://jin-yuhan.github.io/ 这个博客搞定了,但是作者没出教程

我是这个博客的作者。我的实现方法就是统一 page 和 post 的页面布局,然后再重写 Fluid 的 js 代码。由于工作量有点大,不方便出教程。

stalomeow avatar Sep 03 '22 09:09 stalomeow

关于2023年 Fluid 依然没有加入 pjax 功能这件事

asplun avatar Apr 24 '23 07:04 asplun

关于2024年 Fluid 依然没有加入 pjax 功能这件事

ustcwwy avatar Dec 30 '23 09:12 ustcwwy

Fluid什么时候支持pjax啊?

wkk-dev avatar Feb 19 '24 11:02 wkk-dev

关于4年了 Fluid 依然没有加入 pjax 功能这件事

zzzzz167 avatar Feb 19 '24 11:02 zzzzz167