0

我正在尝试复制 Tynt.com 提供的服务,该服务在复制时将一些文本附加到用户的选择中。我知道用户并不特别喜欢这样,但每当用户从他们的网站复制某些内容时,客户要求附加 URL 和版权声明。

在当前的浏览器中,我可以通过创建一个 DOM 元素、添加选定的文本、附加版权文本然后选择新节点来做到这一点:

var newSelection = document.createElement( 'div' );
newSelection.style.cssText = "height: 1px; width: 1px; overflow: hidden;";

if( window.getSelection )
{
   var selection = window.getSelection( );
   if( selection.getRangeAt )
   {
      var range = selection.getRangeAt( 0 );

      newSelection.appendChild( range.cloneContents( ) );
      appendCopyright( );

      document.body.appendChild( newSelection );
      selection.selectAllChildren( newSelection );
      // ... remove element, return selection
   }
}

在 IE9 中,声明中出现了这个错误selection.selectAllChildren( newSelection ),我能够弄清楚这是因为newSelection由于上面第二行中应用的样式而被有效地“隐藏”在了视口中。

注释掉是可行的,但显然新节点会显示给最终用户。这似乎在 IE 的更高版本中得到了解决,但我无法想出一个对 IE9(我需要支持的浏览器)来说足够的解决方法。

我尝试了多种替代方法,例如设置visibility: hidden;、将其定位到屏幕外以及尝试一些替代选择功能,但它们都存在不同的问题。

IE抛出的错误是:SCRIPT16389: Unspecified error.

4

2 回答 2

1

有趣的。我以前没有遇到过。您是否尝试过使用 IE < 11 的其他选择/TextRange API?不知道它是否会起作用,但值得一试:

document.body.appendChild( newSelection );

if (document.body.createTextRange) {
    var textRange = document.body.createTextRange();
    textRange.moveToElementText(newSelection);
    textRange.select();
} else {
    selection.selectAllChildren( newSelection );
}
于 2013-11-05T15:30:57.200 回答
0

我刚刚意识到我没有尝试设置 CSS opacity: 0。奇怪的是,IE9 不考虑将透明节点隐藏在视口中。

var newSelection = document.createElement( 'div' );
newSelection.style.cssText = "opacity: 0;";

但是,如果我也定位元素,为了避免影响布局,它会产生同样的错误。

于 2013-11-05T15:36:44.767 回答