Javascript 防止在Sharepoint 2010和IE中导航回退格按钮

Javascript 防止在Sharepoint 2010和IE中导航回退格按钮,javascript,internet-explorer,sharepoint-2010,Javascript,Internet Explorer,Sharepoint 2010,根据用户要求,我必须禁用backspace按钮,使其无法在历史记录中返回。我编写了以下代码 //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

根据用户要求,我必须禁用backspace按钮,使其无法在历史记录中返回。我编写了以下代码

   //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在没有具有焦点的控件时返回鼠标上方的元素

从可用性的角度来看,试着回到创建需求的人那里,打破所有浏览器普遍存在的重要功能并不是一个特别好的主意。这样做的成本(包括向用户解释他们的浏览器“不再工作”的原因所花费的时间)将大大超过让后退按钮偶尔有点烦人的成本。

我自己解决,案例结案

编辑:在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的修复进行调整。如果用户在文本类型的只读输入控件中单击backspace键,代码还应防止出现默认行为

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

Machineegon的答案很好,我只是补充一下来处理另一个案子

如果输入框是
只读的
禁用的
,并且如果在它们上单击backspace,则会转到上一页。因此,以下代码将用于处理该场景:

//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;
            }
        }
    }
});

需求直接来自于客户,向他们解释为什么我们不应该实现他们想要的功能就像和石头说话一样。我怀疑将要使用此应用程序的用户甚至不知道浏览器中是否存在此back函数。我很遗憾,我仍然认为值得一试,让客户端相信您的技术判断。@Zubar您可以将jquery($)重新绑定到任何您喜欢的位置$j在本例中,使用了冲突变量,并在2012年与sharepoint 2010一起使用。“今天可能不行了。”@Zubair和SP2010?如果稍加修改,上面的代码可能会起作用。对于2013年或更高版本,它根本不起作用。您知道是否有最新的代码可以使用吗?