如何检查,所选文本是否加粗(contenteditable)

时间:2017-03-28 08:29:02

标签: javascript jquery html

我正在使用html内置contenteditable功能实现自定义文本编辑器。我需要知道用户何时在文本编辑器上选择了文本是否为粗体。

这是我现在所拥有的:

HTML

<button onclick="boldit()">B</button>
<div id="editor" contenteditable="true" class="email-body">
    This is an <strong>editable</strong> paragraph.
</div>

的Javascript

function boldit(){
 document.execCommand('bold');
}

3 个答案:

答案 0 :(得分:3)

可靠的方法是遍历检查getComputedStyle的父树。

我假设你已经选择了元素。

function isBold(_element) {
  var element = _element;
  while (element) {
    var style = getComputedStyle(element).fontWeight;
    if (Number(fontWeight) > 400 || fontWeight === 'bold' || fontWeight === 'bolder') {
      return true;
    }
    element = element.parentNode;
  }
  return false;
}

答案 1 :(得分:2)

jQuery(function($) {
    $('.embolden').click(function(){
        if(selectionIsBold()){
          alert('bold');
        }
        else {
          alert('not bold');
        }
    });
});

function selectionIsBold() {
    var isBold = false;
    if (document.queryCommandState) {
        isBold = document.queryCommandState("bold");
    }
    return isBold;
}
.bold {
    font-weight: bold;
}
<div contenteditable="true" class="textEditor">Some <span class="bold">random </span>text.</div>
<a href="#" class="embolden">Is Bold Text</a>
<script
  src="https://code.jquery.com/jquery-3.2.1.min.js"
  integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
  crossorigin="anonymous"></script>

突出显示文字并点击链接。

答案 2 :(得分:0)

只需调用 isSelectionBold() :)

Demo on CodePen

function isSelectionBold() {
  var sel;
  if (window.getSelection) { 
    sel = window.getSelection(); 
  } 
  else if (document.getSelection) { 
    sel = document.getSelection(); 
  }
  
    var raw_html = getSelectionAsHtml();
  
  // This is if nothing is selected
  if(raw_html==="") return false;

  var tempDiv = document.createElement('div');
  tempDiv.innerHTML = raw_html;
    
  var is_bold_nodes = []
    for (var node of tempDiv.childNodes) {
    var tags = [node.nodeName.toLowerCase()];
        
    // This covers selection that are inside bolded characters
    while(tags.includes("#text")) {
      var start_tag = sel.anchorNode.parentNode.nodeName.toLowerCase();
      var end_tag = sel.focusNode.parentNode.nodeName.toLowerCase();
      
            tags = [start_tag, end_tag]
    }

        is_bold_nodes.push(containsOnly(['strong', 'b'], tags));
    }
    
    return (! is_bold_nodes.includes(false))
}

function getSelectionAsHtml() {
    var html = "";
    if (typeof window.getSelection != "undefined") {
        var sel = window.getSelection();
        if (sel.rangeCount) {
            var container = document.createElement("div");
            for (var i = 0, len = sel.rangeCount; i < len; ++i) {
                container.appendChild(sel.getRangeAt(i).cloneContents());
            }
            html = container.innerHTML;
        }
    } else if (typeof document.selection != "undefined") {
        if (document.selection.type == "Text") {
            html = document.selection.createRange().htmlText;
        }
    }
    return html;
}

function containsOnly(array1, array2){
  return !array2.some(elem => !array1.includes(elem))
}