【问题标题】:Need to change the p::selection and p::-moz-selection background dynamically using javascript需要使用 javascript 动态更改 p::selection 和 p::-moz-selection 背景
【发布时间】:2020-10-03 00:34:36
【问题描述】:

我正在创建文本荧光笔,但我想使用 javascript 将 p::selection 和 p::-moz-selection 属性设置为突出显示的选择颜色 我尝试了很多东西,但没有得到解决方案。我的意思是当我选择段落文本时,选择颜色应该动态地根据我当前选择的颜色。

    function highlightSelection(colour) {
        if (colour == '') {
            colour = '#CB7342';
        }
        var range, sel;

        if (window.getSelection) {

            try {
                if (!document.execCommand("BackColor", false, colour)) {
                    makeEditableAndHighlight(colour);
                }
            } catch (ex) {
                makeEditableAndHighlight(colour)
            }
        } else if (document.selection && document.selection.createRange) {
            // IE <= 8 case
            range = document.selection.createRange();
            range.execCommand("BackColor", false, colour);
        }
    }

    function makeEditableAndHighlight(colour) {
        var range, sel = window.getSelection();
        if (sel.rangeCount && sel.getRangeAt) {
            range = sel.getRangeAt(0);
            /*  oldtxt.push(chosenText());
              oldtxtString = oldtxt.join(' ');
              $("#selectedPoem").text(oldtxtString);*/
        }
        document.designMode = "on";
        if (range) {
            sel.removeAllRanges();
            sel.addRange(range);
        }

        if (!document.execCommand("HiliteColor", false, colour)) {

            document.execCommand("BackColor", false, colour);
        }
        document.designMode = "off";
    }
<div id="text" class="selectionContent"  ontouchend="highlightSelection(document.getElementById('chooseColor').value)", onmouseup="highlightSelection(document.getElementById('chooseColor').value)">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Duis at tellus at urna condimentum mattis pellentesque. Aliquam vestibulum morbi blandit cursus risus at. Quis risus sed vulputate odio ut.</p>
<p>Sollicitudin aliquam ultrices sagittis orci a scelerisque. Dignissim enim sit amet venenatis urna cursus eget. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Orci sagittis eu volutpat odio facilisis mauris sit amet massa. Eget arcu dictum varius duis at consectetur lorem donec. Pharetra convallis posuere morbi leo urna molestie at elementum eu.<p>
<p>Cras fermentum odio eu feugiat pretium nibh ipsum. Molestie at elementum eu facilisis sed odio. Odio aenean sed adipiscing diam. Eros in cursus turpis massa tincidunt dui ut ornare. Faucibus interdum posuere lorem ipsum dolor sit. Turpis egestas integer eget aliquet nibh. Adipiscing commodo elit at imperdiet. Et malesuada fames ac turpis egestas maecenas pharetra convallis. Pellentesque dignissim enim sit amet venenatis urna cursus.</p>

</div>

【问题讨论】:

  • 如果你添加缺少的元素,例如&lt;input id="chooseColor" type="color" &gt;你的代码很好jsfiddle.net/1kc3Lrm4有什么问题?
  • @TemaniAfif 感谢您的回复,但我的问题是关于 ::selection 颜色动态变化,因为您在选择文本后向我展示了背景,但是当我们当时选择文本时我想要默认情况下是蓝色的,我想动态设置/更改蓝色

标签: javascript html css


【解决方案1】:

考虑 CSS 变量来调整颜色:

document.querySelector('#chooseColor').addEventListener('input', function(evt) {
  document.querySelector('#text').style.setProperty("--c", this.value)
});

function highlightSelection(colour) {
  if (colour == '') {
    colour = '#CB7342';
  }
  var range, sel;
  if (window.getSelection) {

    try {
      if (!document.execCommand("BackColor", false, colour)) {
        makeEditableAndHighlight(colour);
      }
    } catch (ex) {
      makeEditableAndHighlight(colour)
    }
  } else if (document.selection && document.selection.createRange) {
    // IE <= 8 case
    range = document.selection.createRange();
    range.execCommand("BackColor", false, colour);
  }
}

function makeEditableAndHighlight(colour) {
  var range, sel = window.getSelection();
  if (sel.rangeCount && sel.getRangeAt) {
    range = sel.getRangeAt(0);
    /*  oldtxt.push(chosenText());
      oldtxtString = oldtxt.join(' ');
      $("#selectedPoem").text(oldtxtString);*/
  }
  document.designMode = "on";
  if (range) {
    sel.removeAllRanges();
    sel.addRange(range);
  }

  if (!document.execCommand("HiliteColor", false, colour)) {

    document.execCommand("BackColor", false, colour);
  }
  document.designMode = "off";
}
*::selection {
  background: var(--c);
}
<input id="chooseColor" type="color">
<div id="text" class="selectionContent" ontouchend="highlightSelection(document.getElementById('chooseColor').value)" , onmouseup="highlightSelection(document.getElementById('chooseColor').value)">
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus. Duis at tellus at urna condimentum mattis pellentesque.
    Aliquam vestibulum morbi blandit cursus risus at. Quis risus sed vulputate odio ut.</p>
  <p>Sollicitudin aliquam ultrices sagittis orci a scelerisque. Dignissim enim sit amet venenatis urna cursus eget. Ornare suspendisse sed nisi lacus sed viverra tellus in hac. Orci sagittis eu volutpat odio facilisis mauris sit amet massa. Eget arcu dictum
    varius duis at consectetur lorem donec. Pharetra convallis posuere morbi leo urna molestie at elementum eu.
  </p>
  <p>Cras fermentum odio eu feugiat pretium nibh ipsum. Molestie at elementum eu facilisis sed odio. Odio aenean sed adipiscing diam. Eros in cursus turpis massa tincidunt dui ut ornare. Faucibus interdum posuere lorem ipsum dolor sit. Turpis egestas integer
    eget aliquet nibh. Adipiscing commodo elit at imperdiet. Et malesuada fames ac turpis egestas maecenas pharetra convallis. Pellentesque dignissim enim sit amet venenatis urna cursus.</p>

</div>

相关:How to update placeholder color using Javascript?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2016-02-29
    相关资源
    最近更新 更多