在Safari上,Range = document.getSelection().getRangeAt(0)无法使用。

4

我网站上有一个功能,当点击电子邮件地址时会复制该地址。在Chrome上它运行得很完美,但在Safari上无法选择文本。有什么办法可以让它在Safari上也能正常工作吗?

enter image description here

这是一个带有相应代码的fiddle: https://jsfiddle.net/zsoltszilvai/odbxze9j/12/

function myFunction3() {
  var copyText = document.getElementById("myInput3"),
  range = document.getSelection().getRangeAt(0),
  tooltip = document.getElementById("myTooltip3");

  range.selectNode(copyText);
  document.execCommand("Copy");
  tooltip.innerHTML = "Copied";
}

function outFunc3() {
  var tooltip = document.getElementById("myTooltip3");
  tooltip.innerHTML = "Click to copy";
}

我想要的是将电子邮件地址复制到剪贴板。它不一定要被选中。所以也许我可以直接在js中指定而不是选择和复制“myInput3”的文本? - Zsolt Szilvai
1个回答

9

<!DOCTYPE html>
<html>

<body>
  <style media="screen">
    .tooltip {
      position: relative;
      display: inline-block;
    }
    
    .tooltip:hover {
      border-bottom: dotted 1px grey;
      cursor: pointer;
    }
    
    .tooltip .tooltiptext {
      visibility: hidden;
      font-size: 18px;
      width: 120px;
      background-color: black;
      color: white;
      text-align: center;
      border-radius: 2px;
      padding: 8px;
      position: absolute;
      z-index: 1;
      bottom: 150%;
      left: 50%;
      margin-left: -60px;
      opacity: 0;
      transition: opacity 0.3s;
    }
    
    .tooltip .tooltiptext::after {
      content: "";
      position: absolute;
      top: 100%;
      left: 50%;
      margin-left: -5px;
      border-width: 5px;
      border-style: solid;
      border-color: #555 transparent transparent transparent;
    }
    
    .tooltip:hover .tooltiptext {
      visibility: visible;
      opacity: 1;
    }
  </style>


  <html>

  <body>

    <h1>
      Hello there
    </h1>

    <p>Write me an email to <span class="tooltip"><span onclick="myFunction3()" onmouseout="outFunc3()" id="myInput3">hello@johndoe.com</span> <span class="tooltiptext" id="myTooltip3">Click to copy</span> </span> or just contact me on social media.</p>

  </body>

  </html>

  <script type="text/javascript">
    function myFunction3() {
      var copyText = document.getElementById("myInput3");
      var range = document.createRange();
      selectText('myInput3')

      tooltip = document.getElementById("myTooltip3");

      document.execCommand("Copy");
      tooltip.innerHTML = "Copied";
    }

    function outFunc3() {
      var tooltip = document.getElementById("myTooltip3");
      tooltip.innerHTML = "Click to copy";
    }

    function selectText(element) {
      var text = document.getElementById(element);
      if (document.body.createTextRange) {
        var range = document.body.createTextRange();
        range.moveToElementText(text);
        range.select();
      } else if (window.getSelection) {
        var selection = window.getSelection();
        var range = document.createRange();
        range.selectNodeContents(text);
        selection.removeAllRanges();
        selection.addRange(range);
      } else {
        alert("none");
      }
    }
  </script>

</body>

</html>

不同的浏览器可能有不同的选择内容方法,所以我在这里编写了一个selectText方法,并且我可以在Safari上正常工作。

我在MDN上找不到createTextRange。可能在撰写时它还处于实验阶段? - wegry
1
createTextRange 仅支持 IE 浏览器,其他浏览器应使用 createRange。@wegry - sugars

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接