【问题标题】:How can I disable text selection using shift without disabling all text selection?如何在不禁用所有文本选择的情况下使用 shift 禁用文本选择?
【发布时间】:2013-09-09 19:30:09
【问题描述】:

所以我知道这听起来像是重复的,但事实并非如此(或者,如果是,我能找到的所有答案都无法按照我需要的方式工作)。问题是这样的:

我正在使用 jQuery 在 HTML5 中编写,我需要制作一个网格,允许通过控制和移位进行多选。我有这个逻辑工作,但每当您按住 shift 键单击时,它都会选择网格中的文本。我想阻止这种选择,但这是这个问题与我发现的其他问题之间的关键区别:我希望选择文本在所有其他时间都有效。

重申:我想使用 shift WITHOUT 禁用文本选择,禁用指定元素的所有文本选择。有谁知道我该怎么做?

-- 编辑--
以下(在网格的构造函数中)为我解决了这个问题。正如回答者建议的那样,我声明了一个不可选择的类。

this.gridBody = $("#userGrid");
var handleKeydown = function(e)
{
  e = e || window.event;
  var keyPressed = e.keyCode || e.which;
  if (keyPressed == keys.shift) {
    e.data.gridBody.addClass("unselectable");
  }
};
var handleKeyup = function(e)
{
  e = e || window.event;
  var keyPressed = e.keyCode || e.which;
  if (keyPressed == keys.shift) {
    e.data.gridBody.removeClass("unselectable");
  }
};

$(document).on('keydown', this, handleKeydown);
$(document).on('keyup', this, handleKeyup);

【问题讨论】:

  • 可能重复here
  • 当我明确说明为什么这不是重复时,您没有阅读我上面的声明吗?
  • stackoverflow.com/a/54101500/2708249 在这里查看我的答案。
  • @RubanrajRavichandran 这是一个非常简洁的答案,但是您正在禁用所有轮班元素的选择,而我有兴趣禁用特定元素的选择。

标签: javascript jquery html css shift


【解决方案1】:

您可能会考虑另一种解决方案:您可以只清除文本选择,而不是通过监视 shift 键和切换可选择性来阻止文本选择。

window.getSelection().removeAllRanges();

我发现这更方便,因为它可以在您的点击处理程序中运行以“取消”默认行为。 Appears to work in IE 9+ and other modern browsers.

【讨论】:

  • 再一次,这在我的情况下没有用,因为我明确没有尝试禁用文本选择(实际上这是一个必需的用例),而是按住 shift 键时的文本选择。撤消选择会导致选择闪烁,并删除在网格中选择文本的能力。
  • 是的,我了解您的用例,并使用它来完成相同的操作。检查event.shiftKey 后,您删除点击处理程序中的选择。
【解决方案2】:

这将在文档上绑定一个事件,在该事件中它会在按下 DOWN Shift 时禁用文本选择

 document.onkeydown = function(e) {
  var keyPressed = e.keyCode;
  if (keyPressed == 16) { //thats the keycode for shift

    $('html').css({'-moz-user-select':'-moz-none',
       '-moz-user-select':'none',
       '-o-user-select':'none',
       '-khtml-user-select':'none',
       '-webkit-user-select':'none',
       '-ms-user-select':'none',
       'user-select':'none'
    }); //or you could pass these css rules into a class and add that class to html instead

    document.onkeyup = function() {
      //here you remove css rules that disable text selection
    }
  }
}

希望我对你有所帮助。

基于cmets

document.onkeydown = function(e) {
  var keyPressed = e.keyCode;
  if (keyPressed == 16) { //thats the keycode for shift

    $('html').addClass('unselectable'); //unselectable contains aforementioned css rules

    document.onkeyup = function() {
       $('html').removeClass('unselectable'); //and simply remove unselectable class making text selection availabe
    }
  }
}

【讨论】:

  • e = e ||窗口.事件; var keynum = e.keyCode || e.哪个;键码的后备
  • 这至少更接近了,您能否详细说明如何在不清除所有 CSS 的情况下“删除禁用文本选择的 css 规则”?
  • 我个人会声明一个类,例如使用上述 css 规则无法选择,并在 keyup 上简单地删除该类。
  • 对此代码的一个小修改处理了我的问题,用最终代码更新问题
猜你喜欢
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 2015-06-05
  • 2011-02-11
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多