網站很多功能都怕遇到user點選瀏覽器的返回上一頁功能,例如前一頁有某功能是需要購過js計算後顯示在容器中的結果數值,像是2*500=1000之類的算式,如果user點選送出後又返回上一頁,input中的數值還會保留,但容器的數值卻歸零(需要觸發計算),如果user又從送出一次表單那寫入的數值一定不正確,最好的解決方法就是當usre返回上一頁後瀏覽器自動更新頁面(同F5),經過許多嘗試後以下方法確實可以解決問題。
假設當前網址為 http://localhost/xoops/modules/test/index.php?op=storedvalue
如果只針對IE事情就簡單了,完全不需要動用到PHP,只需要在樣板貼上
<script type="text/javascript">
if (!!(window.history && history.pushState)){
var $time = (+new Date());
history.pushState({page: 1}, 'title 1', "?op=storedvalue&back="+$time+"");
history.state
}
</script>
這樣進入到http://localhost/xoops/modules/test/index.php?op=storedvalue
JS會以時間戳產生back變數值,例如
http://localhost/xoops/modules/test/index.php?op=storedvalue&back=1524612144000
當USER點選返回上一頁時間戳數值會改變,實際上也等於不同的頁面,頁面會更新,但很不幸的,這方法對於Google Chrome瀏覽器一點用都沒有,完全不會刷新頁面...................所以為了能夠讓Google Chrome瀏覽器返回上一頁頁也能自動更新頁面,只好動用到PHP的$_SESSION功能。
方法如下:
在PHP檔案輸出time()時間戳格式
$xoopsTpl->assign( "back" , $_SESSION['back']=time('Y-m-d H:i:s').'000');
這樣在SMARTY樣板就會產生一個<{$back}>變數其數值就是time();
然後再貼上以下的JS語法
//判斷 $_SESSION['back]時間戳與JS的new Date()是否相符,如不相符表示USER使用了瀏覽器返回上一頁功能,觸發自動更新頁面
<script type="text/javascript">
var $time = Date.parse( new Date()); //時間格式
if($time != '<{$back}>' ){
location.reload();
}
</script>
這樣就沒問題了,當USER點選返回上一頁,JS的new Date()會更新為最新時間,但$_SESSION['back]還是之前的時間,所以就會觸發更新頁面。
終於解決這頭痛的問題了,IE跟Google瀏覽器都正常,FF則沒這問題!!有需要的朋友參考看看!!
//2018-4-27更新
經過實際上線測試發現PHP的time()跟JS的new Date()有8000毫秒的時間差,所以上面的方法在本地端用是可行的,但上傳到WEB端就會出問題,只好再增加一個自訂秒差的數值來對應,方法如下:
<script type="text/javascript">
//返回上一頁自動新頁面
var $time = Date.parse( new Date()); //時間格式
var $phptime= <{$back}>;
var $deviation=8000; //自訂誤差值
if(($time+$deviation) <= $phptime){
var $timeerror=$phptime-$time; //PHP跟JS秒差
var $timevar=$time+$timeerror;
}else{
var $timevar=$time;
}
if($timevar != $phptime ){
location.reload();
}
</script>
這樣就沒問題了,真是難搞的東西..............!!!V_V
//2018-4-28更新
所以說事情總是沒那麼簡單的,上面的方法用自訂的誤差值,那只是我端電腦與客戶端伺服器的連線秒差,如果換成其他位置的電腦連線秒差又不一樣了,會導致一直重複更新或是不會自動剛新,為了解決這問題只好又增加了ajax的程式架構,東拼西湊總算搞定了,我端客戶端他端連線使用瀏覽器的返回上一頁自動更新功能都正常,真是爆肝阿,方法如下:
php端
//只要取時間值即可
$xoopsTpl->assign( "back" , time('Y-m-d H:i:s').'000');
//樣板js端
<script type="text/javascript">
//返回上一頁自動新頁面
$(document).ready(function() {
var $phptime= <{$back}>;
//ajax寫入
$read=deviationunction($deviation=$phptime,$operating='read'); //讀
if($read <= $phptime || $read==undefined){
var $deviationres=deviationunction($deviation=$phptime,$operating='writing'); //寫入
}else{
deviationunction($deviation='',$operating='updated'); //清空
location.reload();
}
//送出按鈕更新時間
$(".btn").click(function() {
//呼叫函數
var $deviationres=deviationunction($deviation='',$operating='sendout'); //更新
假設當前網址為 http://localhost/xoops/modules/test/index.php?op=storedvalue
如果只針對IE事情就簡單了,完全不需要動用到PHP,只需要在樣板貼上
<script type="text/javascript">
if (!!(window.history && history.pushState)){
var $time = (+new Date());
history.pushState({page: 1}, 'title 1', "?op=storedvalue&back="+$time+"");
history.state
}
</script>
這樣進入到http://localhost/xoops/modules/test/index.php?op=storedvalue
JS會以時間戳產生back變數值,例如
http://localhost/xoops/modules/test/index.php?op=storedvalue&back=1524612144000
當USER點選返回上一頁時間戳數值會改變,實際上也等於不同的頁面,頁面會更新,但很不幸的,這方法對於Google Chrome瀏覽器一點用都沒有,完全不會刷新頁面...................所以為了能夠讓Google Chrome瀏覽器返回上一頁頁也能自動更新頁面,只好動用到PHP的$_SESSION功能。
方法如下:
在PHP檔案輸出time()時間戳格式
$xoopsTpl->assign( "back" , $_SESSION['back']=time('Y-m-d H:i:s').'000');
這樣在SMARTY樣板就會產生一個<{$back}>變數其數值就是time();
然後再貼上以下的JS語法
//判斷 $_SESSION['back]時間戳與JS的new Date()是否相符,如不相符表示USER使用了瀏覽器返回上一頁功能,觸發自動更新頁面
<script type="text/javascript">
var $time = Date.parse( new Date()); //時間格式
if($time != '<{$back}>' ){
location.reload();
}
</script>
這樣就沒問題了,當USER點選返回上一頁,JS的new Date()會更新為最新時間,但$_SESSION['back]還是之前的時間,所以就會觸發更新頁面。
終於解決這頭痛的問題了,IE跟Google瀏覽器都正常,FF則沒這問題!!有需要的朋友參考看看!!
//2018-4-27更新
經過實際上線測試發現PHP的time()跟JS的new Date()有8000毫秒的時間差,所以上面的方法在本地端用是可行的,但上傳到WEB端就會出問題,只好再增加一個自訂秒差的數值來對應,方法如下:
<script type="text/javascript">
//返回上一頁自動新頁面
var $time = Date.parse( new Date()); //時間格式
var $phptime= <{$back}>;
var $deviation=8000; //自訂誤差值
if(($time+$deviation) <= $phptime){
var $timeerror=$phptime-$time; //PHP跟JS秒差
var $timevar=$time+$timeerror;
}else{
var $timevar=$time;
}
if($timevar != $phptime ){
location.reload();
}
</script>
這樣就沒問題了,真是難搞的東西..............!!!V_V
//2018-4-28更新
所以說事情總是沒那麼簡單的,上面的方法用自訂的誤差值,那只是我端電腦與客戶端伺服器的連線秒差,如果換成其他位置的電腦連線秒差又不一樣了,會導致一直重複更新或是不會自動剛新,為了解決這問題只好又增加了ajax的程式架構,東拼西湊總算搞定了,我端客戶端他端連線使用瀏覽器的返回上一頁自動更新功能都正常,真是爆肝阿,方法如下:
php端
//只要取時間值即可
$xoopsTpl->assign( "back" , time('Y-m-d H:i:s').'000');
//樣板js端
<script type="text/javascript">
//返回上一頁自動新頁面
$(document).ready(function() {
var $phptime= <{$back}>;
//ajax寫入
$read=deviationunction($deviation=$phptime,$operating='read'); //讀
if($read <= $phptime || $read==undefined){
var $deviationres=deviationunction($deviation=$phptime,$operating='writing'); //寫入
}else{
deviationunction($deviation='',$operating='updated'); //清空
location.reload();
}
//送出按鈕更新時間
$(".btn").click(function() {
//呼叫函數
var $deviationres=deviationunction($deviation='',$operating='sendout'); //更新
});
function deviationunction($deviation,$operating){
$.ajax({
url: '<{$xoops_url}>/modules/neillibrary/ajax.php',
type: 'POST',
dataType: 'json', //設為json
async: false, //設為false
data: { id: 1,
dbid: $deviation,
operating: $operating
},
success: function(response) {
$deviationres=response; //回傳result數值
},
error: function() {
console.log('ajax error!');
}
})
return $deviationres;
}
});
</script>
另外再ajax.php加上以下設定
$id=(empty($_REQUEST['id']))?"":$_REQUEST['id'];
$dbid=(empty($_REQUEST['dbid']))?"":$_REQUEST['dbid'];
$operating=(empty($_REQUEST['operating']))?"":$_REQUEST['operating'];
if($id==1){
if($operating=='read'){
if(empty($_SESSION['deviation']) or (time('Y-m-d H:i:s').'000') > $_SESSION['deviation']){
$result=$_SESSION['deviation'];
}else{
$result=time('Y-m-d H:i:s').'000';
}
}
if($operating=='writing'){
$_SESSION['deviation']=$dbid;
}
if($operating=='updated'){
$_SESSION['deviation']='';
}
if($operating=='sendout'){
$_SESSION['deviation']=time('Y-m-d H:i:s').'000';
}
echo $result;
}
這樣100%沒問題,真他媽的累阿!!!
教學撰寫:徐嘉裕 Neil hsu
function deviationunction($deviation,$operating){
$.ajax({
url: '<{$xoops_url}>/modules/neillibrary/ajax.php',
type: 'POST',
dataType: 'json', //設為json
async: false, //設為false
data: { id: 1,
dbid: $deviation,
operating: $operating
},
success: function(response) {
$deviationres=response; //回傳result數值
},
error: function() {
console.log('ajax error!');
}
})
return $deviationres;
}
});
</script>
另外再ajax.php加上以下設定
$id=(empty($_REQUEST['id']))?"":$_REQUEST['id'];
$dbid=(empty($_REQUEST['dbid']))?"":$_REQUEST['dbid'];
$operating=(empty($_REQUEST['operating']))?"":$_REQUEST['operating'];
if($id==1){
if($operating=='read'){
if(empty($_SESSION['deviation']) or (time('Y-m-d H:i:s').'000') > $_SESSION['deviation']){
$result=$_SESSION['deviation'];
}else{
$result=time('Y-m-d H:i:s').'000';
}
}
if($operating=='writing'){
$_SESSION['deviation']=$dbid;
}
if($operating=='updated'){
$_SESSION['deviation']='';
}
if($operating=='sendout'){
$_SESSION['deviation']=time('Y-m-d H:i:s').'000';
}
echo $result;
}
這樣100%沒問題,真他媽的累阿!!!
教學撰寫:徐嘉裕 Neil hsu
留言
張貼留言