【发布时间】: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 中进行不连续的选择?例如,如果您有一个带有如下文本的元素:
<div>this is some random text</div>
是否可以进行选择,其中包含例如 this is 和 text 使中间的文本未被选中?
这似乎在 FF 中运行良好,您可以在其中 addRanges 彼此不相邻,并相应地进行选择。
对于 IE,似乎没有任何东西可以让您拥有多个范围,但 IE 的选择对象有很多其他方法可以弥补这一点。
对于非连续选择,您始终可以在网站的某个部分附加或预先选择选择,例如在执行复制操作时,或强制用户取消选择您不希望他们选择的某些部分复制。
非连续选择示例:
working example(至少在 FF4 中工作)。
编辑 要手动执行相同类型的选择,您可以使用 firefox 按住 ctrl 并开始将文本拖动到不同的位置,但在 chrome 上执行它不起作用。
【问题讨论】:
-
这是一个代码问题,它是关于 JavaScript 的——见上文:你可以在哪里
addRanges -
除了惹恼您的用户之外,这些示例听起来都没有任何用处。 (从好的方面来说,既然我知道这样做的网站是如何做到的,我可以采取对策)
-
@Random832 一些客户希望避免某些内容被复制,并试图从剪贴板中删除该内容,而不是将所有内容制作成图像,例如,听起来肯定更“用户友好”解决方案。就应对措施而言,客户端所做的任何事情总是可以被规避的,这不是关于使其不可能的问题,而是让用户注意他们正在做他们不应该做的事情。跨度>
-
Offtopic,但有趣的是 Courier 在 FF4 中对我来说不是等宽的,但它在 Chrome 中。更改为 Courier New 对我来说显示它在 FF 中正确对齐。
-
您可以使用 CSS
background-color伪造选择。
标签: javascript google-chrome selection