|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
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
Fichier Zip
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
Télécharger le zip
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 du même auteur
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
|