防止退格键在 SharePoint 2010 和 IE 中导航回去



作为用户要求,我必须禁用退格键在历史记录中导航。我做了以下一段代码

   //Bind back nutton to prevent escaping the page with backspace
$j(document).unbind('keydown').bind('keydown', function (event) {
  var doPrevent = false;
  if (event.keyCode === 8) 
  {
      if(event.target == document.body){
          if(event.preventDefault()){ event.preventDefault(); }
          event.stopEvent();
          event.returnValue = false;
      }
  }
});

这在除IE7和IE8之外的所有浏览器中都能完美运行。我无法将输入类型绑定为例外,因为 SharePoint 中的内容编辑器允许修改元素div、段落等中的文本。该解决方案在 IE8 中不起作用,因为当没有具有焦点的控件时,event.target 返回鼠标悬停时的元素。

我建议对Machinegon的修复进行调整。 如果用户在文本类型的只读输入控件中单击退格键,代码还应防止默认行为。

if ((nodeName === "input" && event.target.type === "text") || 
     nodeName === "textarea") {
     doPrevent = event.target.readOnly;
}

我自己解决,案件结束。

编辑:在2012年使用SharePoint 2010和jquery 1.x工作,不确定今天。

//Bind back button to prevent escaping the page with backspace
$(document).unbind('keydown').bind('keydown', function (event) {
    if (event.keyCode === 8) 
    {
     var doPrevent = true;
     //Chrome, FF, Safari
     if(event.target == document.body){
      doPrevent = true;
     }
     //IE
     else
     {
      var nodeName = event.target.nodeName.toLowerCase();
      if((nodeName == "input" && event.target.type == "text") || nodeName == "textarea")
      {
       doPrevent = false;
      }
      var SPEditTabInstance = $(document).find("li[id='Ribbon.EditingTools']");
      if(SPEditTabInstance != "undefined" && SPEditTabInstance != null && $(SPEditTabInstance).children().length > 0){
       doPrevent = false;
      }
     }
     if(doPrevent)
     {
      //Chrome, FF, Safari
      if(event.preventDefault()){ event.preventDefault(); }
      //IE
      else
      {
       event.returnValue = false;
      }
     }
    }
});

试着回到创建需求的人,即从可用性的角度来看,打破所有浏览器无处不在的重要功能并不是一个特别好的想法。这样做的成本(包括向用户解释为什么他们的浏览器"不再工作"所花费的时间)将大大超过偶尔让后退按钮有点烦人的成本。

Machinegon的答案效果很好,我只是添加它以处理另一种情况。

如果输入框是 readonlydisabled ,并且如果您在它们上点击退格键,则它会转到上一页。因此,以下代码将用于处理这种情况:

//Bind back button to prevent escaping the page with backspace
$(document).unbind('keydown').bind('keydown', function(event) {
    if (event.keyCode === 8) {
        var doPrevent = true;
        //Chrome, FF, Safari
        if (event.target == document.body) {
            doPrevent = true;
        }
        //IE
        else {
            var nodeName = event.target.nodeName.toLowerCase();
            if (((nodeName == "input" && event.target.type == "text") || nodeName == "textarea") 
              && !event.target.disabled && !event.target.readOnly) {
                doPrevent = false;
            }
        }
        if (doPrevent) {
            //Chrome, FF, Safari
            if (event.preventDefault()) {
                event.preventDefault();
            }
            //IE
            else {
                event.returnValue = false;
            }
        }
    }
});

最新更新