Hola, a ver si me podeis ayudar con esto porque no se de que viene. Tengo un mètodo de un objeto que yo he creado donde se ejecutan en diferentes casos execCommand con unos paràmetros u otros en segun que casos. Resulta que este objeto lo creo dentro de un mètodo de otro objeto que también he creado (digo esto por si tiene algo que ver) . Bueno, pues cuando se ejecuta un execCommand con todos los datos correctos (los he printado con un alert y estan correctos) me salta este Error.
Error: uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMNSHTMLDocument.execCommand]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame ::
http://localhost/NAVARCLES/index.php...s&verif=afegir :: tbclick :: line 378" data: no]
Para que se vea más claro os pongo el còdigo aquí marcando las partes para que lo entendais un poco:
Código:
function InitToolbarButtons() {
kids = document.getElementsByTagName('DIV');
//Creación del objeto donde hay los mètodos de los eventos
ev=new eventos(this.ident);
for (var i=0; i < kids.length; i++) {
if (kids[i].className == 'imagebutton') {
//Aquí se substituyen las acciones de los eventos que ya estan definidos por los qie hay dentro del objeto acabado de crear
kids[i].onmouseover = ev.MOver;
kids[i].onmouseout = ev.MOut;
kids[i].onmousedown = ev.MDown;
kids[i].onmouseup = ev.MUp;
kids[i].onclick = ev.MClick;
}
}
}
function tbmousedown(e)
{
this.firstChild.style.left = 2;
this.firstChild.style.top = 2;
this.style.border='inset 1px';
e.preventDefault();
}
function tbmouseup()
{
this.firstChild.style.left = 1;
this.firstChild.style.top = 1;
this.style.border='outset 1px';
}
function tbmouseout()
{
this.style.border='solid 1px #80B7EB';
}
function tbmouseover()
{
this.style.border='outset 1px';
}
function insertNodeAtSelection(win, insertNode)
{
// get current selection
var sel = win.getSelection();
// get the first range of the selection
// (there's almost always only one range)
var range = sel.getRangeAt(0);
// deselect everything
sel.removeAllRanges();
// remove content of current selection from document
range.deleteContents();
// get location of current selection
var container = range.startContainer;
var pos = range.startOffset;
// make a new range for the new selection
range=document.createRange();
if (container.nodeType==3 && insertNode.nodeType==3) {
// if we insert text in a textnode, do optimized insertion
container.insertData(pos, insertNode.nodeValue);
// put cursor after inserted text
range.setEnd(container, pos+insertNode.length);
range.setStart(container, pos+insertNode.length);
} else {
var afterNode;
if (container.nodeType==3) {
// when inserting into a textnode
// we create 2 new textnodes
// and put the insertNode in between
var textNode = container;
container = textNode.parentNode;
var text = textNode.nodeValue;
// text before the split
var textBefore = text.substr(0,pos);
// text after the split
var textAfter = text.substr(pos);
var beforeNode = document.createTextNode(textBefore);
var afterNode = document.createTextNode(textAfter);
// insert the 3 new nodes before the old one
container.insertBefore(afterNode, textNode);
container.insertBefore(insertNode, afterNode);
container.insertBefore(beforeNode, insertNode);
// remove the old node
container.removeChild(textNode);
} else {
// else simply insert the node
afterNode = container.childNodes[pos];
container.insertBefore(insertNode, afterNode);
}
range.setEnd(afterNode, 0);
range.setStart(afterNode, 0);
}
sel.addRange(range);
};
function getOffsetTop(elm) {
var mOffsetTop = elm.offsetTop;
var mOffsetParent = elm.offsetParent;
while(mOffsetParent){
mOffsetTop += mOffsetParent.offsetTop;
mOffsetParent = mOffsetParent.offsetParent;
}
return mOffsetTop;
}
function getOffsetLeft(elm) {
var mOffsetLeft = elm.offsetLeft;
var mOffsetParent = elm.offsetParent;
while(mOffsetParent){
mOffsetLeft += mOffsetParent.offsetLeft;
mOffsetParent = mOffsetParent.offsetParent;
}
return mOffsetLeft;
}
//En esta funcion (vinculada al método MClick) es donde al ejecutarse cualquier execCommand me da el error anteriormente citado
function tbclick()
{
if ((this.id == 'forecolor') || (this.id == 'hilitecolor')) {
parent.command = this.id;
buttonElement = document.getElementById(this.id);
document.getElementById('colorpalette').style.left = this.GOffsetLeft(buttonElement);
document.getElementById('colorpalette').style.top = this.GOffsetTop(buttonElement) + buttonElement.offsetHeight;
document.getElementById('colorpalette').style.visibility='visible';
} else if (this.id == 'createlink') {
var szURL = prompt('Enter a URL:', 'http://');
if ((szURL != null) && (szURL != '')) {
document.getElementById(ev.identify).contentWindow.document.execCommand('CreateLink',false,szURL);
}
} else if (this.id == 'createimage') {
imagePath = prompt('Enter Image URL:', 'http://');
if ((imagePath != null) && (imagePath != '')) {
document.getElementById(ev.identify).contentWindow.document.execCommand('InsertImage', false, imagePath);
}
} else if (this.id == 'createtable') {
e = document.getElementById(ev.identify);
rowstext = prompt('enter rows');
colstext = prompt('enter cols');
rows = parseInt(rowstext);
cols = parseInt(colstext);
if ((rows > 0) && (cols > 0)) {
table = e.contentWindow.document.createElement('table');
table.setAttribute('border', '1');
table.setAttribute('cellpadding', '2');
table.setAttribute('cellspacing', '2');
tbody = e.contentWindow.document.createElement('tbody');
for (var i=0; i < rows; i++) {
tr =e.contentWindow.document.createElement('tr');
for (var j=0; j < cols; j++) {
td =e.contentWindow.document.createElement('td');
br =e.contentWindow.document.createElement('br');
td.appendChild(br);
tr.appendChild(td);
}
tbody.appendChild(tr);
}
table.appendChild(tbody);
insertNodeAtSelection(e.contentWindow, table);
}
} else {
parent.document.getElementById(ev.identify).contentWindow.document.execCommand(this.id, false, null);
}
}
function Select(selectname)
{
var cursel = document.getElementById(selectname).selectedIndex;
/* First one is always a label */
if (cursel != 0) {
var selected = document.getElementById(selectname).options[cursel].value;
document.getElementById(this.ident).contentWindow.document.execCommand(selectname, false, selected);
document.getElementById(selectname).selectedIndex = 0;
}
document.getElementById(this.ident).contentWindow.focus();
}
function dismisscolorpalette()
{
document.getElementById('colorpalette').style.visibility='hidden';
}
function getHtml(form,formnot)
{
if(ie){
var editor_obj = document.all[this.ident];
}else if (n6){
var editor_obj = document.getElementById(this.ident);
}
formnot.value=editor_obj.contentWindow.document.body.innerHTML;
form.submit();
}
//Constructor del objeto padre que contiene en el mètodo IToolbarButtons (funcion InitToolbarButtons) la creación del objeto que contiene los metosos de eventos
function Editor(id) {
this.ident=id;
alert(this.ident);
document.getElementById(this.ident).contentWindow.document.designMode = 'on';
//try {
// document.getElementById('edit').contentWindow.document.execCommand('undo', false, null);
//} catch (e) {
// alert('This demo is not supported on your level of Mozilla.');
//}
this.IToolbarButtons=InitToolbarButtons;
this.INodeAtSelection=insertNodeAtSelection;
this.GOffsetTop=getOffsetTop;
this.GOffsetLeft=getOffsetLeft;
this.ISelect=Select;
this.Dcolorpalette=dismisscolorpalette;
this.GHtml=getHtml;
this.IToolbarButtons();
document.addEventListener('mousedown', this.Dcolorpalette, true);
document.getElementById(this.ident).contentWindow.document.addEventListener('mousedown', this.Dcolorpalette, true);
document.addEventListener('keypress', this.Dcolorpalette, true);
document.getElementById(this.ident).contentWindow.document.addEventListener('keypress', this.Dcolorpalette, true);
}
//Constructor del objeto que contiene los mètodos de eventos
function eventos(id)
{
this.identify=id;
this.MDown=tbmousedown
this.MUp=tbmouseup;
this.MOut=tbmouseout;
this.MOver=tbmouseover;
this.MClick=tbclick;
}
Seguiré buscando el problema, pero si alguien lo ve le agradeceria mucho que lo posteara.
Muchas gràcias
PD: El còdigo es de un editor wysiwig que esta en la web de mozilla.