【问题标题】:Non-continuous selections in chrome?chrome中的非连续选择?
【发布时间】:2011-07-06 23:11:35
【问题描述】:

更新

我最近发现您可以使用 Chrome 以编程方式创建不连续的选择,方法是替换您想要取消选择的部分之间的元素/文本节点,或者隐藏然后显示它们。

Chrome 的非连续选择示例:http://jsfiddle.net/niklasvh/YKJBW/

var t = $('div').contents().get(0);


$.each(t.nodeValue.split(" "),function(i,e){
   t = t.splitText(e.length);
     if (t.length>0){
     t = t.splitText(1);
     }
});



var c = $('div').contents();

$.each(c,function(i,e){    
    if (i>0){
    if (i%3) { }else{
             e.parentNode.replaceChild($('<unselect />').text(e.nodeValue).get(0),e);                           
    }    
}   
});

$('unselect').hide(); 
window.setTimeout(function(){
   $('unselect').show();     
},0);

然而在执行复制事件时,确实会选择整个选择(即使它之间有间隙),但当然可以使用相同的方法以编程方式在复制之前更改选择执行复制事件。

现在棘手的部分是,您是否可以像在 Firefox 中那样按住 Ctrl 来创建非连续选择,从而真正使此功能可用。我在示例中使用的当前方法将 TextNode 分成许多部分,这对于视觉目的没有区别。然而,它也使用额外的标签来破坏选择,据我所知,它不能被删除。但是,可以通过删除 TextNode 并为它们添加新的来实现相同的功能。问题是它只会考虑最后添加的节点,所以如果你的选择中有多个空格,它只会考虑你应用的最后一个 DOM 更改。

谁能想到任何非文档破坏方式来应用这种非连续选择不会对选择及其元素进行任何永久性更改?

原来的问题

是否可以在 Google Chrome 中进行不连续的选择?例如,如果您有一个带有如下文本的元素:

&lt;div&gt;this is some random text&lt;/div&gt;

是否可以进行选择,其中包含例如 this istext 使中间的文本未被选中?

这似乎在 FF 中运行良好,您可以在其中 addRanges 彼此不相邻,并相应地进行选择。

对于 IE,似乎没有任何东西可以让您拥有多个范围,但 IE 的选择对象有很多其他方法可以弥补这一点。

对于非连续选择,您始终可以在网站的某个部分附加或预先选择选择,例如在执行复制操作时,或强制用户取消选择您不希望他们选择的某些部分复制。

非连续选择示例:

working example(至少在 FF4 中工作)。

编辑 要手动执行相同类型的选择,您可以使用 firefox 按住 ctrl 并开始将文本拖动到不同的位置,但在 chrome 上执行它不起作用。

编辑 2 我猜thisthis 总结得很好。就 webkit 浏览器而言,似乎没什么可期待的。

【问题讨论】:

  • 这是一个代码问题,它是关于 JavaScript 的——见上文:你可以在哪里 addRanges
  • 除了惹恼您的用户之外,这些示例听起来都没有任何用处。 (从好的方面来说,既然我知道这样做的网站是如何做到的,我可以采取对策)
  • @Random832 一些客户希望避免某些内容被复制,并试图从剪贴板中删除该内容,而不是将所有内容制作成图像,例如,听起来肯定更“用户友好”解决方案。就应对措施而言,客户端所做的任何事情总是可以被规避的,这不是关于使其不可能的问题,而是让用户注意他们正在做他们不应该做的事情。跨度>
  • Offtopic,但有趣的是 Courier 在 FF4 中对我来说不是等宽的,但它在 Chrome 中。更改为 Courier New 对我来说显示它在 FF 中正确对齐。
  • 您可以使用 CSS background-color 伪造选择。

标签: javascript google-chrome selection


【解决方案1】:

没有。 Firefox 是唯一支持多选范围的主流浏览器。我认为它的主要用例是允许选择表中的单个列,否则这是不可能的。

据我所知,WebKit 短期内不打算支持多个选定范围。 IE 彻底检查了 IE 9 的 Range 和 Selection API,但并未实现。不知道 Opera 是否有任何支持它的计划。请参阅this thread from the WHATWG mailing list 了解一些信息:

【讨论】:

  • 此外,Firefox 允许在按住 CTRL 的同时通过鼠标拖动来选择表格列或表格单元格矩形。
【解决方案2】:

不,没有多文本跨度选择的概念。选择与插入符号相关联。一个插入符号 - 一个选择。

【讨论】:

  • 如果是这样,它怎么能与 Firefox 一起工作?肯定是其中一个浏览器做错了,或者结果是一致的?
  • @Niklas :说实话不知道。文本选择包含两个点 anchorPos 和 caretPos。因此,如果您有选择并将插入符号向左/向右移动,则选择将被删除,并且 caretPos 用作参考点。我不知道多重选择会如何发挥作用。
猜你喜欢
  • 1970-01-01
  • 2013-07-07
  • 2011-12-04
  • 2010-09-23
  • 1970-01-01
  • 2010-11-26
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多