Estado dos Assuntos de Não Seleção 2014
Eu fiz algumas pesquisas por conta própria. Aqui está a função que escrevi e estou usando atualmente:
(function deselect(){
var selection = ('getSelection' in window)
? window.getSelection()
: ('selection' in document)
? document.selection
: null;
if ('removeAllRanges' in selection) selection.removeAllRanges();
else if ('empty' in selection) selection.empty();
})();
Basicamente, getSelection().removeAllRanges()
atualmente é suportado por todos os navegadores modernos (incluindo o IE9 +). Este é claramente o método correto para avançar.
Os problemas de compatibilidade foram responsáveis por:
- Versões antigas do Chrome e Safari usadas
getSelection().empty()
- IE8 e abaixo usados
document.selection.empty()
Atualizar
Provavelmente, é uma boa ideia agrupar essa funcionalidade de seleção para reutilização.
function ScSelection(){
var sel=this;
var selection = sel.selection =
'getSelection' in window
? window.getSelection()
: 'selection' in document
? document.selection
: null;
sel.deselect = function(){
if ('removeAllRanges' in selection) selection.removeAllRanges();
else if ('empty' in selection) selection.empty();
return sel; // chainable :)
};
sel.getParentElement = function(){
if ('anchorNode' in selection) return selection.anchorNode.parentElement;
else return selection.createRange().parentElement();
};
}
// use it
var sel = new ScSelection;
var $parentSection = $(sel.getParentElement()).closest('section');
sel.deselect();
Criei um wiki da comunidade para que você possa adicionar funcionalidade a ele ou atualizar as coisas à medida que os padrões evoluem.
document.selection
implica a existência de umempty()
método dele. Você já testou o método em todos os outros casos; portanto, também pode testarempty
no caso final.