2010-09-07 11 views
2

Est-ce que quelqu'un sait comment utiliser range.setStart de la même façon que range.moveStart fonctionne dans IE? Je voudrais implémenter backspace/delete dans JS, quelque chose comme ceci:Comment faire pour alterner moveStart dans Firefox?

range.moveStart ('character', - 1); range.deleteContents();

mais dans Firefox

Répondre

1

Firefox, ainsi que tous les navigateurs modernes, sauf IE < = 8 utilise DOM Ranges. Il n'y a aucun analogue direct à la méthode moveStart de IE TextRange et c'est difficile à faire dans le cas général. Si la plage est dans un noeud de texte et non au début, c'est facile; sinon, vous devrez revenir en arrière dans le document pour trouver le nœud de texte précédent et y déplacer la plage. Les travaux suivants que dans un nœud texte unique:

function backspace() { 
    var sel = window.getSelection(); 

    // If there is a selection rather than a caret, just delete the selection 
    if (!sel.isCollapsed) { 
     sel.deleteFromDocument(); 
    } else if (sel.rangeCount) { 
     var range = sel.getRangeAt(0); 
     if (range.startContainer.nodeType == 3 && range.startOffset > 0) { 
      range.setStart(range.startContainer, range.startOffset - 1); 
      sel.removeAllRanges(); 
      sel.addRange(range); 
      sel.deleteFromDocument(); 
     } 
    } 
} 

WebKit et Firefox 4 ont le modify method of Selection objects qui résout complètement le problème:

function backspace2() { 
    var sel = window.getSelection(); 

    // If there is a selection rather than a caret, just delete the selection 
    if (!sel.isCollapsed) { 
     sel.deleteFromDocument(); 
    } else if (sel.rangeCount && sel.modify) { 
     sel.modify("extend", "backward", "character"); 
     sel.deleteFromDocument(); 
    } 
}