js history對象 手機物理返回鍵

來源:互聯網
上載者:User

標籤:owa   href   預設值   允許   代碼   stat   描述   es2017   指令碼   

有興趣的可以瞭解下history對象,不感興趣也可以直接跳到手機物理返回鍵監聽部分

******************【history對象】有length屬性,go()/back()/forward()跳轉方法****************************

我們要瞭解瀏覽器的history對象, history對象儲存著使用者上網的記錄,從視窗被開啟的那一刻算起;history.length屬性儲存著記錄的URL數量。初始時,該值為1。如果當前視窗先後訪問了三個網址,history.length屬性等於3;history對象提供了一系列方法,允許在瀏覽曆史之間移動,包括go()、back()和forward()。

【go()】方法可以在使用者的記錄中任意跳轉。這個方法接收一個參數,表示向後或向前跳轉的頁面數的一個整數值。

go(負整數):表示向後跳轉(類似於後退按鈕)

go(正整數):表示向前跳轉(類似於前進按鈕)

樣本:

  

go()方法無參數時,相當於history.go(0),可以重新整理當前頁面

樣本:

  

【back()】

back()方法用於模仿瀏覽器的後退按鈕,相當於history.go(-1)

【forward()】

forward()方法用於模仿瀏覽器的前進按鈕,相當於history.go(1)

樣本:

  

如果移動的位置超出了訪問曆史的邊界,以上三個方法並不報錯,而是靜默失敗

【注意】使用記錄時,頁面通常從瀏覽器緩衝之中載入,而不是重新要求伺服器發送新的網頁

 

********************監聽手機物理返回鍵************************************

樣本:

A頁面跳到B頁面,監聽B頁面返回鍵,並做相應操作,那麼就可以在B頁面javascript指令碼寫如下監聽事件

pushHistory();

function pushHistory(){  //剛一進到B頁面就往history記錄pushstate一個url

  var state = {
    title:"title",  //可以傳空值""

    url:"#"};

  window.history.pushState(state,"title","#");

}

window.addEventListener("popstate",function(e){  //只要B頁面按下手機物理返回鍵,就會被監聽到

  //該幹嘛幹嘛

  WeixinJSBridge.invoke(‘closeWindow‘,{},function(res){});  //js代碼關閉端當前網頁

  //window.location = "http://www.baidu.com";  //跳轉到百度頁面

},false);

或者

$(function(){
  window.history.pushState("","","#");
})
window.addEventListener("popstate",function(e){
  //該幹嘛幹嘛
})

以上代碼就搞定監聽手機物理返回鍵並作處理,下面有興趣的可以瞭解

 

大家都知道在瀏覽器頁面中,可以在不知道實際URL的情況下實現後退和前進,但是由於安全方面的考慮,開發人員無法得到使用者瀏覽器的URL也沒辦法修改history裡已有的url連結;

HTML5為history對象添加了兩個新方法,history.pushState()和history.replaceState(),用來在瀏覽曆史中添加和修改記錄(兩個方法使用方法都一樣,不同的是pushState會改變history對象length屬性,而replaceState不會)。

pushState(相當於進棧)可以往history裡增加url連結,popState(相當於出棧)事件監測從history棧裡彈出url。既然有提供popstate事件監測,那麼我們就可以對popState進行監聽。

【注意】

popState事件當同一個文檔的history發生變化時,就會觸發popState事件;

需要注意的是,僅僅pushState和replaceState不會觸發該事件,只有使用者點擊瀏覽器的前進、後退按鈕才會觸發,或者使用javascript調用go()/back()/forward()才會觸發;另外該事件僅針對同一個文檔有效,如果瀏覽器曆史的切換,導致載入不同的文檔,也不會觸發該事件。

 

//無重新整理頁面切換:使用到如下API

【history.state】:當前url對應的狀態資訊

如果當前url不是通過pushState或者replaceState產生的,那麼history.state就為null;

【history.pushState(state, title, url)】:將當前的url和history.state加入到history中,並用新的state和URL替換當前。不會造成頁面重新整理;

state:與要跳轉的URL對應的狀態資訊

title:傳Null 字元就可以

url:要跳轉到的地址,不能跨域(跨域會報錯)

【history.replaceState】:用新的state和URL替換當前的,不會造成頁面重新整理;

state:與要跳轉的URL對應的狀態資訊

title:傳Null 字元就可以

url:要跳轉到的地址,不能跨域(跨域會報錯)

【window.onpopstate】

history.go和history.back(包括使用者按瀏覽器曆史前進後退按鈕)觸發,並且頁面無刷的時候(由於使用pushState修改了history)會觸發popstate事件,事件發生時瀏覽器會從history中取出URL和對應的state對象替換當

前的URL和history.state。通過event.state也可以擷取history.state。

 

往返緩衝

預設情況下,瀏覽器會在當前會話(session)快取頁面面,當使用者點擊“前進”或[上一頁] 按鈕時,瀏覽器就會從緩衝中載入頁面;瀏覽器有一個特性叫“往返緩衝”(back-forward cache或bfcache),可以在使用者使用瀏覽器的“後退”和“前進”按鈕時加快頁面的轉換速度。這個緩衝中不僅儲存著頁面資料,還儲存了DOM和javascript的狀態;實際上是將整個頁面都儲存在了記憶體裡。如果頁面位於bfcache中,那麼再次開啟該頁面時就不會觸發load事件

 

addEventListener()方法,事件監聽(removeEventListener()方法移除設定的監聽事件)

文法:element.addEventListener(event,function,useCapture);

參數:

  element:文檔節點、document、window 或 XMLHttpRequest

  event:事件類型,如"click" 或 "mousedown"

  function:事件觸發後調用的函數或者是實現了EventListener介面

  useCapture:布爾值,用於描述事件是冒泡還是捕獲,參數可選,預設false(冒泡)

注意:event不要使用 "on" 首碼。 例如,使用 "click" ,而不是使用 "onclick"

樣本: 

element.addEventListener("click", function(){ alert("Hello World!"); });
等效
element.addEventListener("click", myFunction);
function myFunction() {
   alert ("Hello World!");
}
向window對象添加事件
window.addEventListener("resize", function(){
  document.getElementById("demo").innerHTML = sometext;
});

事件冒泡還是捕獲?
事件傳遞方式有兩種:冒泡、捕獲、
事件傳遞定義了元素觸發的順序,如果你將 <p> 元素插入到 <div> 元素中,使用者點擊 <p> 元素, 哪個元素的 "click" 事件先被觸發呢?
 冒泡 中,內部元素的事件會先被觸發,然後再觸發外部元素,即: <p> 元素的點擊事件先觸發,然後會觸發 <div> 元素的點擊事件。
在 捕獲 中,外部元素的事件會先被觸發,然後才會觸發內部元素的事件,即: <div> 元素的點擊事件先觸發 ,然後再觸發 <p> 元素的點擊事件。
addEventListener() 方法可以指定 "useCapture" 參數來設定傳遞類型:
addEventListener(eventfunctionuseCapture);
預設值 false, 即冒泡傳遞,當值為 true 時, 事件使用捕獲傳遞。
樣本:
document.getElementById("myDiv").addEventListener("click", myFunction, true);
【removeEventListener()方法】
element.removeEventListener("mousemove", myFunction);
【瀏覽器安全色處理】
var x = document.getElementById("myBtn");if (x.addEventListener) { // 所有主流瀏覽器,除了 IE 8 及更早版本 x.addEventListener("click", myFunction);} else if (x.attachEvent) { // IE 8 及更早版本 x.attachEvent("onclick", myFunction);} 
IE 8 及更早 IE 版本,Opera 7.0及其更早版本不支援 addEventListener() 和 removeEventListener() 方法。
但是,對於這類瀏覽器版本可以使用 detachEvent() 方法來移除事件控制代碼:
element.attachEvent(event, function);element.detachEvent(event, function);

*****************************

 //手機端彈窗

$.pop.showAlert({
  content: "提示的資訊",

  yes:function(){  //點確定之後執行的事件
    window.location.href = "http://www.baidu.com";   //跳轉到百度頁面
    }
});

js history對象 手機物理返回鍵

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.