在浏览器后退按钮处理哈希 URL 更改为 SAPUI5/OpenUI5

On Browser Back button handling of Hash URL change for SAPUI5/OpenUI5

我们将 SAPUI5 Shell 放置在 index.xhtml 页面内的 div 处。当用户修改我们应用程序中的数据时,用户可以执行 3 种类型的操作以离开应用程序:

  1. 在我们的应用程序中按下取消按钮
  2. 在浏览器地址栏中输入其他一些 URL
  3. 按浏览器栏中的后退按钮。

我们的 SAPUI5/Openui5 应用程序使用路由概念 (sap.ui.core.routing.Router),因此该应用程序具有 'HASH URL'。

对于 1 和 2,我们进行了以下更改并且有效(基于 Mozilla 推荐)

window.onbeforeunload = function(e) {
  var dialogText = 'Dialog text here';
  e.returnValue = dialogText;
  return dialogText;
};

Mozilla 推荐 - https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload

但是对于 pt.3 - 当用户按下返回按钮时,哈希值 URL 会发生变化。根据 Whosebug 上的其他讨论,使用浏览器历史记录或禁用浏览器后退按钮不适用于 Browser/Web World。

有没有办法在按下浏览器后退按钮时执行以下操作:

  1. 显示弹出窗口,让用户可以选择留下或离开(通知页面更改将会丢失)
  2. 如果用户选择留下,则 URL 将保留,包括 'HASH URL' 部分。

实现此目的的一种可能方法是禁用从 Hasher 插件调度已更改的事件,并自行处理 hashchange 事件以向用户提示确认消息。您需要确保仅当您的用户处于相关编辑视图时才执行此操作,然后 re-enable 一旦用户单击取消、保存或确认导航离开后的标准逻辑。

粗略的例子如下...

onInit: function() {
  this._hashHandler = (function(){
    var sCurrentHash;

    var fnHandleHashChange =function(e){
        var sOldHash = e.oldURL.substr(e.oldURL.search("#")+1);
        var sNewHash = e.newURL.substr(e.newURL.search("#")+1);

        if(sCurrentHash!==sOldHash){
            return;
        }

        if(confirm("Are you sure you want to navigate away?")){
            window.removeEventListener("hashchange",fnHandleHashChange);
            window.hasher.setHash(sOldHash.substr(1));
            window.hasher.changed.active=true;
            window.hasher.setHash(sNewHash.substr(1));
        } else {
            window.hasher.setHash(sOldHash.substr(1));
        }
    }

    return {
        startManualHashChangeHandling: function() {
            sCurrentHash = window.location.hash.substr(1);
            window.hasher.changed.active=false;
            window.addEventListener("hashchange",fnHandleHashChange);
        },
        stopManualHashChangeHandling: function() {
            window.hasher.changed.active=true;
            window.removeEventListener("hashchange",fnHandleHashChange);
        }
    };
  }());
}

...因此,无论何时您想要防止用户在未经确认的情况下导航(例如在 onEdit 或 onRouteMatched 方法中),您都可以调用...

this._hashHandler.startManualHashChangeHandling();

...然后禁用手动哈希更改处理(例如在您的 onCancel 或 onSave 成功方法中)...

this._hashHandler.stopManualHashChangeHandling();