作为用户要求,我必须禁用退格键在历史记录中导航。我做了以下一段代码
//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的答案效果很好,我只是添加它以处理另一种情况。
如果输入框是 readonly
或 disabled
,并且如果您在它们上点击退格键,则它会转到上一页。因此,以下代码将用于处理这种情况:
//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;
}
}
}
});