2013-05-16 20 views
5

我想在所有使用JavaScript的瀏覽器中禁用撤銷和重做。我想這樣做,因爲我們的應用程序有它自己的撤消和重做歷史內置。在瀏覽器中禁用撤銷和重做

我已經可以處理按鍵來通過鍵盤輸入禁用撤消和重做,但我想禁用菜單項。 (標準菜單和右鍵菜單)

這可能嗎?即使只在某些瀏覽器中可能,它也會比沒有更好。

+1

我就知道會來檢測磁場的變化,並檢查它不是由鍵盤輸入,剪切/粘貼,或自己的腳本引起的,則認爲它是撤消的唯一方法/重做功能,這樣做。據我所知,沒有工作事件處理程序來捕獲撤消/重做事件,所以(如果你真的需要它),這可能是唯一的選擇。 –

回答

2

你可以做的一件事是攔截popstate事件。不幸的是我不認爲它可以被取消,所以你必須通過添加一個虛擬狀態來撤消它。

以下代碼阻止我在Chrome和FF上按下按鈕。隨意在其他瀏覽器上測試它。

window.setTimeout(function(){ 
    window.history.pushState({}, '', '#'); 
    window.addEventListener("popstate", function() { 
    window.history.pushState({}, '', '#'); 
    }); 
},1000); 

請務必根據自己的歷史情況更改您的代碼。 還可以考慮使用HTML5 History API而不是自己的歷史實現。

https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history

+0

我不相信這個問題是關於改變歷史狀態的問題,而是涉及到contentEditable元素中的撤銷/重做。 – IliasT

0

它使用瀏覽器的API是不可能的。但是有幾種方法可以檢測或處理方法。網址散列是處理回退或轉發事件的一種方式。但是瀏覽器不支持用戶安全。您可以搜索JavaScript網址散列腳本,但不要忘記與html5瀏覽器兼容的腳本。

3

我知道這是舊的,但對於其他人很好奇,這對我很有用。

$(window).bind('keydown', function(evt) { 
    if((evt.ctrlKey || evt.metaKey) && String.fromCharCode(evt.which).toLowerCase() == 'z') { 
    evt.preventDefault(); 
    } 
}); 
+1

這是否真的「禁用菜單項目(標準菜單和右鍵單擊菜單)」?即它是否阻止鼠標右鍵單擊上下文菜單中的「撤消」選項? – Zeek

+0

是的,你也可能想禁用上下文菜單。不過,我仍然好奇,當用戶導航到應用程序菜單的「編輯」 - >「撤消」選項時,如何停止傳播事件? – IliasT