javascript - 如果子 ID 为 :focus,则可以添加/删除类

标签 javascript jquery

我将一个 div 设置为 contenteditable 并且可以编辑该 div 内的所有内容。现在,当我单击 div 时,我会自动添加一个选定的类(如果在我删除它并将其添加到新选择之前可见),我有下一步和前进按钮,因此如果我正在使用平板电脑或智能手机,我可以更改我的选择电话。

这就是我需要帮助的地方。

所以我选择了中间的 div,当我将光标移动到 #dynamic-storage 的另一个子级时,我遇到了删除所选类并将其添加到新子级的问题选择。 (不是示例中的跨度,因为它的父级是一个 div。这就是我想要选择的,因为此示例中的 div 是 #dynamic-storage 的子级(例如 #dynamic-storage > 格)

本文底部提供的代码片段不包含上面的屏幕截图和 fiddle 链接中提供的箭头或菜单栏,因为在给定的发布时间不需要该代码。我将这篇文章的重点放在为 #dynamic-storage 的子项处理 .selected 类的任务上。

enter image description here

$(document).ready(function() {
  // Select Elements
  var SelectElements = function() {
    $("#dynamic-storage").children().on("mouseup touchend", function() {
      if ( $(".selected").is(":visible") ) {
        $(".selected").removeClass("selected");
      }

      $(this).addClass("selected");
    });
  };
  // Clear Selection
  var ClearSelection = function() {
    $(".selected").removeClass("selected");
  };
  SelectElements();

  // Handles Hotkeys
  $(document).keyup(function(e) {
    // Up & Down Arrow Keys To Select/Deselect Element in Editable
    if (e.which === 38 || 40 )  {
      if ( $(".selected").is(":focus") ) {
        alert("correct");
      } else if ( $(".selected").is(":blur") ) {
        alert("incorrect");
      }
    }
  });

});
/* Body */
#dynamic-storage {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  z-index: 0;
  outline: 0;
}

#dynamic-storage .selected {
  outline: 2px dotted #69f;
}
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="IE=9" />
    <link type='text/css' rel='stylesheet' href="http://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/smoothness/jquery-ui.css" />
    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
  </head>
  <body>
    <div id="dynamic-storage" contenteditable="true">
      <div class="header" align="center">
        <h1>Welcome</h1>
        <h5>My name is Michael.</h5>
        <span>Hello world</span>
      </div>
      <div class="header selected" align="left">
        <h1>Welcome</h1>
        <h5>My name is Michael.</h5>
      </div>
      <div class="header" align="right">
        <h1>Welcome</h1>
        <h5>My name is Michael.</h5>
      </div>
    </div>
  </body>
</html>

fiddle :http://liveweave.com/uyz4VK
fiddle :http://jsbin.com/kujuxofeju/1/edit?html,js,output

最佳答案

具有属性 contenteditable='true' 的元素的所有内容都可以像在单个 文本区域中一样进行编辑。这就是为什么当您移动光标时 focus/blur 事件不会发生的原因。在带有 contenteditable='true' 的元素中的任何地方,您仍然在同一个文本区域中,没有离开或进入它。

这里的解决方案是处理类似于textarea的coursor定位。

要获取表示当前选择的对象,我们使用函数:

var getSelection;
if (window.getSelection) {
    // IE 9 and non-IE
    getSelection = function() {
        var sel = window.getSelection(), ranges = [];
        if (sel.rangeCount) {
            for (var i = 0, len = sel.rangeCount; i < len; ++i) {
                ranges.push(sel.getRangeAt(i));
            }
        }
        return ranges;
    };
} else if (document.selection && document.selection.createRange) {
    // IE <= 8
    getSelection = function() {
        var sel = document.selection;
        return (sel.type != "None") ? sel.createRange() : null;
    };
}

然后我们需要做接下来的操作:从#dynamic-storage的第一级 child 中删除类.selected,获取带有游标的元素,然后上DOM 找到最接近 #dynamic-storage 的父级以添加类 .selected:

// Handles Hotkeys
  $(document).keyup(function(e) {
    // Up & Down Arrow Keys To Select/Deselect Element in Editable
    if (e.which === 38 || 40 )  {
        $('#dynamic-storage > div').removeClass('selected');
        var selectedElem = getSelection()[0].commonAncestorContainer.parentElement;
        $(selectedElem).closest('#dynamic-storage > div').addClass('selected');
    }
  });

Here is the working fiddle

关于javascript - 如果子 ID 为 :focus,则可以添加/删除类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27770525/

相关文章:

javascript - 使组件在侧边菜单打开时不移动

jquery - Pete R 实现一页滚动

jquery - 来自 JQuery UI DatePicker 的自定义响应

javascript - 未捕获的类型错误 : Cannot read property 'length' of undefined in line chart with json data

javascript - 主题需要 RxJS6 asObservable()?

javascript - Jquery 掩码不适用于禁用然后启用的字段

javascript - 如何在动态创建和填充后设置文本框或下拉列表框的样式?

javascript - 使用 JQuery 收集表单数据并删除或隐藏表单字段

javascript - 如何使用 jQuery/Ajax 执行 MySQL 查询

jquery 移动复选框未被选中