Accueil > > > DOCUMENT.SELECTION POUR FF (FIREFOX)
DOCUMENT.SELECTION POUR FF (FIREFOX)
Information sur la source
Description
Rend document.selection compatible pour firefox... La totalité des fonctionnalités du document.selection d'Internet Explorer sont aujourd'hui reprises, même si il est possible que certains bugs subsistent. Le code suivant suffit pour faire fonctionner document.selection sous FireFox, peut-être sous Opéra/Safari, mais je n'ai pas essayé. Ce code ne modifie en aucun cas la manière dont IE gère document.selection Il s'agit d'un workaround pour FireFox
Source
- /* COMMENTAIRE
- // Utilisation
- var textRange = document.selection.createRange()
- // format supporté par selection
- document.selection = {
- "type":String["none","text","control"],
- "createRange":textRange,
- }
- // format supporté par textRange
- textRange = {
- "text":String,
- "htmlText":String,
- "parentElement":function() as HTMLElement,
- "length":Integer,
- "item":function(index) as HTMLElement,
- "add":function(node),
- "addElement":function(node),
- "execCommand":function(...) as CommandResult
- }
- */
- // SelectionObject
- function SelectionObject(Window) {
- this.window=(Window?Window:window);
- this.document=this.window.document;
- }
- if(!document.selection) { try {
- SelectionObject.prototype={
- "clear":function() {
- try {
- var sel = this.window.getSelection();
- sel.collapse(true);
- sel.dettach();
- } catch (ex) {}
- },
- "createRange":function() {
- if (this.type=="none") {
- var range = "no selection";
- range.text=""; range.htmlText="";
- return range;
- }
- if (!this.activeElement) {
- var txt = this.document.getSelection()
- var sel = {};
- try { sel=this.window.getSelection().getRangeAt(0); } catch (ex) {}
- var html = getHTMLOfSelection(this.window, this.document);
- var range = null;
-
- range = new ControlRangeObject();
- range.isControlRange=true;
- range._text=(""+txt+"");
- range._htmlText=html;
- range._range=sel;
- range.base=sel.commonAncestorContainer?sel.commonAncestorContainer:this.document.body
- range.items=new Array();
- range.addElement=range.add;
-
- try {
- while (range.base.nodeName.substr(0,1)=="#") {
- range.base=range.base.parentNode;
- }
- var index = 0; var started;
- var current = range.base.childNodes[0];
- while (current) {
- if (started || current==sel.startContainer || current==sel.commonAncestorContainer) {
- started = true;
- range.items.push(current);
- }
- if (current == sel.endContainer || current==sel.commonAncestorContainer) {
- break;
- }
- index++;
- current = range.base.childNodes[index];
- }
- range.length=range.items.length;
- } catch (ex) {}
-
- return range;
- } else {
- var base = this.activeElement;
- var range = new ControlRangeObject();
- range.isControlRange=false;
- range._text = base.value.substring(base.selectionStart, base.selectionEnd);
- range._htmlText=range._text;
- range._range=null;
- range.base=base;
- range.items=[range.base];
- range.addElement=range.add;
-
- return range;
- }
- }
- }
- SelectionObject.prototype.empty=SelectionObject.prototype.clear;
- SelectionObject.prototype.createRangeControl=SelectionObject.prototype.createRange;
- SelectionObject.prototype.findActiveElement=function() {
- function haveFocus(inp) {
- try { // IE
- var result = !!(inp.hasFocus||inp==document.activeElement);
- if (result) { return result; }
- } catch (ex) {}
- try { // FF; Safari
- var sel = false;
- sel=this.window.getSelection().getRangeAt(0);
- if (!sel.collapsed) { return false; }
- var sel2 = document.createRange();
- sel2.setStartBefore(inp);
- sel2.setEndBefore(inp);
- var result = sel.compareBoundaryPoints(Range.START_TO_START, sel2)==0;
- result = result && sel.compareBoundaryPoints(Range.END_TO_END, sel2)==0;
- result = result && sel.startOffset == sel2.startOffset
- result = result && sel.endOffset == sel2.endOffset
- return result;
- } catch (ex) {}
- try { // Opéra
- return !!(inp.selectionStart||inp.selectionEnd);
- } catch (ex) {}
- return false;
- }
- try {
- var allInputs = this.document.getElementsByTagName("INPUT");
- var allTAreas = this.document.getElementsByTagName("TEXTAREA");
- var l1 = allInputs.length; var l2 = allTAreas.length;
- for (var i=0; i<l1; i++) {
- var inp = allInputs[i];
- if (inp.type=="" || inp.type=="text") {
- if (haveFocus(inp)) {
- this.activeElement = inp;
- return "text";
- }
- }
- }
- for (var i=0; i<l2; i++) {
- var inp = allTAreas[i];
- if (haveFocus(inp)) {
- this.activeElement = inp;
- return "text";
- }
- }
- if (document.activeElement) { return document.activeElement; }
- } catch (ex) {}
- };
- SelectionObject.prototype.__defineGetter__("type", function() {
- try {
- this.activeElement = false;
- var sel = false;
- if ((""+this.document.getSelection()+"")=="") {
- this.findActiveElement();
- if (this.activeElement) {
- return "text";
- }
- }
- try {
- sel = this.window.getSelection().getRangeAt(0);
- } catch (ex) {}
- if (sel.commonAncestorContainer.nodeName.substr(0,1)=="#") {
- return "text";
- } else {
- return "control";
- }
- } catch (ex) { }
- return "none";
- });
- SelectionObject.prototype.__defineSetter__("type", function() {
- // Do nothing
- });
- // ControlRangeObject
- function ControlRangeObject() {}
- ControlRangeObject.prototype={
- "_text":"",
- "_htmlText":"",
- "_range":null,
- "parentElement":function() {
- return this.base;
- },
- "item":function(i) {
- return this.items[i];
- },
- "add":function(node) {
- try {
- this._range.insertNode(node);
- } catch (ex) {}
- },
- "execCommand":function(a1,a2,a3,a4) {
- var mode = document.designMode;
- document.designMode="on";
- document.execCommand(a1,a2,a3,a4);
- document.designMode=mode;
- }
- }
- // Properties
- ControlRangeObject.prototype.__defineGetter__("text",function() {
- return this._text;
- });
- ControlRangeObject.prototype.__defineSetter__("text",function(value) {
- if (this.isControlRange) {
- var range = this._range;
- var p=document.createTextNode(value);
- range.deleteContents();
- range.insertNode(p)
- try { document.getSelection().collapseToEnd() } catch (ex) {}
- } else {
- var beforeText = this.base.value.substr(0, this.base.selectionStart);
- var middleText = value;
- var afterText = this.base.value.substr(this.base.selectionEnd);
- this.base.value = beforeText+middleText+afterText;
- this.base.selectionStart = beforeText.length + value.length;
- this.base.selectionEnd = this.base.selectionStart;
- this.base.focus();
- }
- });
- ControlRangeObject.prototype.__defineGetter__("htmlText",function() {
- return this._htmlText
- });
- ControlRangeObject.prototype.__defineSetter__("htmlText",function(value) {
- var range = this._range;
- var p=document.createElement("htmlSection");
- p.innerHTML=value;
- range.deleteContents();
- range.insertNode(p)
- });
- document.selection=new SelectionObject();
- } catch (ex) {} }
- function getHTMLOfSelection (window, document) {
- var range;
- if (window.ActiveXObject && document.selection && document.selection.createRange) {
- range = document.selection.createRange();
- return range.htmlText;
- }
- else if (window.getSelection) {
- var selection = window.getSelection();
- if (selection.rangeCount > 0) {
- range = selection.getRangeAt(0);
- var clonedSelection = range.cloneContents();
- var div = document.createElement('div');
- div.appendChild(clonedSelection);
- return div.innerHTML;
- }
- else {
- return '';
- }
- }
- else {
- return '';
- }
- }
/* COMMENTAIRE
// Utilisation
var textRange = document.selection.createRange()
// format supporté par selection
document.selection = {
"type":String["none","text","control"],
"createRange":textRange,
}
// format supporté par textRange
textRange = {
"text":String,
"htmlText":String,
"parentElement":function() as HTMLElement,
"length":Integer,
"item":function(index) as HTMLElement,
"add":function(node),
"addElement":function(node),
"execCommand":function(...) as CommandResult
}
*/
// SelectionObject
function SelectionObject(Window) {
this.window=(Window?Window:window);
this.document=this.window.document;
}
if(!document.selection) { try {
SelectionObject.prototype={
"clear":function() {
try {
var sel = this.window.getSelection();
sel.collapse(true);
sel.dettach();
} catch (ex) {}
},
"createRange":function() {
if (this.type=="none") {
var range = "no selection";
range.text=""; range.htmlText="";
return range;
}
if (!this.activeElement) {
var txt = this.document.getSelection()
var sel = {};
try { sel=this.window.getSelection().getRangeAt(0); } catch (ex) {}
var html = getHTMLOfSelection(this.window, this.document);
var range = null;
range = new ControlRangeObject();
range.isControlRange=true;
range._text=(""+txt+"");
range._htmlText=html;
range._range=sel;
range.base=sel.commonAncestorContainer?sel.commonAncestorContainer:this.document.body
range.items=new Array();
range.addElement=range.add;
try {
while (range.base.nodeName.substr(0,1)=="#") {
range.base=range.base.parentNode;
}
var index = 0; var started;
var current = range.base.childNodes[0];
while (current) {
if (started || current==sel.startContainer || current==sel.commonAncestorContainer) {
started = true;
range.items.push(current);
}
if (current == sel.endContainer || current==sel.commonAncestorContainer) {
break;
}
index++;
current = range.base.childNodes[index];
}
range.length=range.items.length;
} catch (ex) {}
return range;
} else {
var base = this.activeElement;
var range = new ControlRangeObject();
range.isControlRange=false;
range._text = base.value.substring(base.selectionStart, base.selectionEnd);
range._htmlText=range._text;
range._range=null;
range.base=base;
range.items=[range.base];
range.addElement=range.add;
return range;
}
}
}
SelectionObject.prototype.empty=SelectionObject.prototype.clear;
SelectionObject.prototype.createRangeControl=SelectionObject.prototype.createRange;
SelectionObject.prototype.findActiveElement=function() {
function haveFocus(inp) {
try { // IE
var result = !!(inp.hasFocus||inp==document.activeElement);
if (result) { return result; }
} catch (ex) {}
try { // FF; Safari
var sel = false;
sel=this.window.getSelection().getRangeAt(0);
if (!sel.collapsed) { return false; }
var sel2 = document.createRange();
sel2.setStartBefore(inp);
sel2.setEndBefore(inp);
var result = sel.compareBoundaryPoints(Range.START_TO_START, sel2)==0;
result = result && sel.compareBoundaryPoints(Range.END_TO_END, sel2)==0;
result = result && sel.startOffset == sel2.startOffset
result = result && sel.endOffset == sel2.endOffset
return result;
} catch (ex) {}
try { // Opéra
return !!(inp.selectionStart||inp.selectionEnd);
} catch (ex) {}
return false;
}
try {
var allInputs = this.document.getElementsByTagName("INPUT");
var allTAreas = this.document.getElementsByTagName("TEXTAREA");
var l1 = allInputs.length; var l2 = allTAreas.length;
for (var i=0; i<l1; i++) {
var inp = allInputs[i];
if (inp.type=="" || inp.type=="text") {
if (haveFocus(inp)) {
this.activeElement = inp;
return "text";
}
}
}
for (var i=0; i<l2; i++) {
var inp = allTAreas[i];
if (haveFocus(inp)) {
this.activeElement = inp;
return "text";
}
}
if (document.activeElement) { return document.activeElement; }
} catch (ex) {}
};
SelectionObject.prototype.__defineGetter__("type", function() {
try {
this.activeElement = false;
var sel = false;
if ((""+this.document.getSelection()+"")=="") {
this.findActiveElement();
if (this.activeElement) {
return "text";
}
}
try {
sel = this.window.getSelection().getRangeAt(0);
} catch (ex) {}
if (sel.commonAncestorContainer.nodeName.substr(0,1)=="#") {
return "text";
} else {
return "control";
}
} catch (ex) { }
return "none";
});
SelectionObject.prototype.__defineSetter__("type", function() {
// Do nothing
});
// ControlRangeObject
function ControlRangeObject() {}
ControlRangeObject.prototype={
"_text":"",
"_htmlText":"",
"_range":null,
"parentElement":function() {
return this.base;
},
"item":function(i) {
return this.items[i];
},
"add":function(node) {
try {
this._range.insertNode(node);
} catch (ex) {}
},
"execCommand":function(a1,a2,a3,a4) {
var mode = document.designMode;
document.designMode="on";
document.execCommand(a1,a2,a3,a4);
document.designMode=mode;
}
}
// Properties
ControlRangeObject.prototype.__defineGetter__("text",function() {
return this._text;
});
ControlRangeObject.prototype.__defineSetter__("text",function(value) {
if (this.isControlRange) {
var range = this._range;
var p=document.createTextNode(value);
range.deleteContents();
range.insertNode(p)
try { document.getSelection().collapseToEnd() } catch (ex) {}
} else {
var beforeText = this.base.value.substr(0, this.base.selectionStart);
var middleText = value;
var afterText = this.base.value.substr(this.base.selectionEnd);
this.base.value = beforeText+middleText+afterText;
this.base.selectionStart = beforeText.length + value.length;
this.base.selectionEnd = this.base.selectionStart;
this.base.focus();
}
});
ControlRangeObject.prototype.__defineGetter__("htmlText",function() {
return this._htmlText
});
ControlRangeObject.prototype.__defineSetter__("htmlText",function(value) {
var range = this._range;
var p=document.createElement("htmlSection");
p.innerHTML=value;
range.deleteContents();
range.insertNode(p)
});
document.selection=new SelectionObject();
} catch (ex) {} }
function getHTMLOfSelection (window, document) {
var range;
if (window.ActiveXObject && document.selection && document.selection.createRange) {
range = document.selection.createRange();
return range.htmlText;
}
else if (window.getSelection) {
var selection = window.getSelection();
if (selection.rangeCount > 0) {
range = selection.getRangeAt(0);
var clonedSelection = range.cloneContents();
var div = document.createElement('div');
div.appendChild(clonedSelection);
return div.innerHTML;
}
else {
return '';
}
}
else {
return '';
}
}
Conclusion
Ce code --est-- était aussi disponibe à http://www.developpez.net/forums/showthread.php?p= 1926681
Historique
- 05 avril 2007 10:09:44 :
- .
- 05 avril 2007 14:07:32 :
- Suppression d'une partie utilisée lors de mes tests
- 05 avril 2007 14:51:19 :
- Ajout de :
- createRange().text="newSelectionText"
- createRange().htmlText="newSelectionHTML"
Typage fort des controlRange et SelectionObject
- 05 avril 2007 15:10:22 :
- Multi-frame possibility (voir commentaires)
- 05 avril 2007 16:06:15 :
- .
- 05 avril 2007 18:30:33 :
- ZIP + Preview
- 06 avril 2007 14:42:45 :
- .
- 06 avril 2007 15:14:02 :
- .
- 25 décembre 2007 15:26:53 :
- Un bug vient d'être corrigé concernant les sélections dans les boites de texte.
La mise à jour est conseillée
- 14 février 2008 17:26:13 :
- Correction d'un bug (this.beforeText remplacé par beforeText, ligne 179)
- 14 février 2008 18:23:43 :
- Meilleure détection des champs ayant le focus (le code gère maintenant le focus dans un champ vide)
- 15 février 2008 18:06:25 :
- Correction d'un nouveau bug
J'espère que cette fois ci, c'est la dernière modif ;)
- 16 février 2008 11:52:33 :
- Suppression d'une erreur de syntaxe sous IE (__defineGetter__ est FireFox/Safari only)
- 04 avril 2008 15:55:28 :
- Deux lignes étaient commentées alors qu'elle ne devaient pas ce qui posait problème dans quelques rares cas de doublons (deux éléments dans une ^même structure HTML parente)
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Problème document.selection sous Firefox [ par cradleofpain ]
Bonjour à tous !J'ai un problème sous Firefox lorsque j'utilise la ligne suivante : maFrame.document.selection- maFrame est de type Window (IFRAME)- m
bug sous firefox [ par freija ]
Bonjour, Pour faire un site internet on m'a fourni une base. Mon index se présente sous la forme d'un tableau avec sur une ligne un menu flash, et un
probleme avec un lien sous firefox [ par fatifleurf ]
salut tout le monde,en fait j ai un probleme avec un lien sous firefox, mon besoin est le suivant : je souhaite recuperer la valeur du href de mon lie
Aide pour selection de plusieurs tableau pour faire manipulations [ par Jarod1980 ]
Bonjour, J'ai un problème dans mon script, je voudrais savoir si quelqu'un peut m'aider à le résoudre. Mon problème est le suivant : Dans une interf
recupérer le code html d'une selection [ par caviar ]
Saluté ! j'ai un petit pb tout bête ...j'aimerai récupérer le code html selectionné lorsqu'un utilisateur fait un surlignage sur ma page ...par exempl
Recuperer le texte selectionne avec la souris! [ par LotusTissues ]
Bonjour,Je ne parviens pas a faire fonctionne cette fonction qui est cense retourner le texte selectionne.Dans le premier if elle me renvoie systemati
Problème createRange() [ par damsdu92 ]
Bonjour,J'ai actuellement un petit soucis avec la methode createRange() .Je vous explique :Sur le site que je suis en train de faire, je souhaite mett
Selection [ par olive2634 ]
Bonjour,je débute en javascript. J'aimerai pouvoir selectionner du texte dans une page HTML, avec l'aide de javascript....Par exemple : <FIELDSET&g
changement de couleur qui marche sur firefox mais pas sous IE [ par nicomilville ]
Salut,je fais un code pour que si la personne est une femme l'arrière plan d'une colone de tableau soit rose... ça marche parfaitement sous Firefox ma
Affichage bizarre sous firefox... [ par adelami ]
Bonsoir ! J'ai réalisé un code qui permet, en utilisant des <SPAN> mis côte à côte et en réduisant progressivement la taille, de donner un eff
|
Derniers Blogs
[WF4] PASSAGE D'ARGUMENTS LITERAL, VISUALBASICVALUE OU LAMBDAVALUE?[WF4] PASSAGE D'ARGUMENTS LITERAL, VISUALBASICVALUE OU LAMBDAVALUE? par JeremyJeanson
Avec la sortie de la RC de Visual Studio 2010, Microsoft a mis un peu les points sur le i en ce qui concernait le passage d'arguments. Mais nous somme un certain nombre à avoir pris ce changement comme un méchant coup dur. Pour résumer la situation : à la...
Cliquez pour lire la suite de l'article par JeremyJeanson [RIA SERVICES] INCLUDE ET DOMAINDATASOURCE[RIA SERVICES] INCLUDE ET DOMAINDATASOURCE par Audrey
Dans un de mes articles précédents , j'avais parlé des DomainDataSource avec RIA Services dans le cas d'une interface Maître - Détail. Dans le même principe, je vais parler d'une autre manière de mettre en forme ce cas d'interface avec RIA Services. Et po...
Cliquez pour lire la suite de l'article par Audrey ZUNE : VERSION ZUNE SOFTWARE V 4.2 ET LA SOCIALISATIONZUNE : VERSION ZUNE SOFTWARE V 4.2 ET LA SOCIALISATION par ROMELARD Fabrice
Une des nouveautés de la version V 3.0 était l'apparition de l'onglet Social qui ne fonctionnait que si le MarketPlace était activé sur son poste. Cela limitait donc son intérêt, car hors du cadre commercial USA-CANADA, peu de monde trouva...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice PRATIQUE DE SILVERLIGHT PAR ERIC AMBROSIPRATIQUE DE SILVERLIGHT PAR ERIC AMBROSI par MPOWARE
Je viens de finir la lecture du dernier livre d'
Eric Ambrosi
éditions PEARSON
Son livre donne une approche pratique de Silverlight qui sera aussi bien comprise par le développeur que par le designeur.
Tous les aspects du développement RIA sont abor...
Cliquez pour lire la suite de l'article par MPOWARE APPRENDRE à DéVELOPPER POUR LES MOBILES AVEC LA NOUVELLE GéNéRATION .NETAPPRENDRE à DéVELOPPER POUR LES MOBILES AVEC LA NOUVELLE GéNéRATION .NET par odewit
2 déclinaisons de Silverlight et 2 déclinaisons de Mono permettent dorénavant (ou permettront prochainement) de développer des applications .NET mobiles pour les principales plates-formes du marché :
Silverlight pour Symbian, basé sur Silverlight 2...
Cliquez pour lire la suite de l'article par odewit
Forum
RE : CONVERSIONRE : CONVERSION par peter2010
Cliquez pour lire la suite par peter2010
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|