铬的非连续选择?

时间:2011-06-14 20:06:39

标签: javascript google-chrome selection

更新

我最近发现,您可以通过在要取消选择或隐藏的部分之间替换元素/文本节点然后显示它们,以编程方式创建不连续的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);

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

现在棘手的部分是,您可以通过按住Ctrl键来实际使用此功能,就像在Firefox中创建非连续选择一样。我在示例中使用的当前方法将TextNodes分成许多部分,出于视觉目的没有区别。然而,它也使用额外的标签来打破选择,据我发现,无法删除。但是,可以通过删除TextNodes并为其添加新的TextNodes来实现相同的功能。问题是它只会考虑添加的最后一个节点,因此如果您的选择中有多个空格,它将只考虑您应用的最后一个DOM更改。

任何人都可以想到任何非文档破解方法来应用这种非连续选择哪些不会对选择及其元素进行任何永久性更改?

原始问题

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

<div>this is some random text</div>

是否可以进行包含例如this istext的选择,使文本处于未选中状态?

这似乎在FF中工作正常,你可以addRanges彼此不相邻,并相应地做出选择。

对于IE,似乎没有任何东西允许你有多个范围,但IE的选择对象有很多其他方法来补偿它。

通过非连续选择,您可以随时在网站上附加或添加某个部分的选择,例如在执行复制操作时,或强制用户取消选择您不希望选择的部分选项副本。

非连续选择的例子:

enter image description here

working example(至少在FF4工作)。

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

编辑2 我猜thisthis总结得很好。就webkit浏览器而言,似乎没有任何预期。

2 个答案:

答案 0 :(得分:4)

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

WebKit不打算在不久的将来支持多个选定范围。 IE对IE 9的Range和Selection API进行了大修,并没有实现它。不知道Opera是否有任何支持它的计划。有关信息,请参阅this thread from the WHATWG mailing list

答案 1 :(得分:0)

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