2010-03-26 10 views
11

Tengo el código siguiente para insertar un estilo en DOM (hay un caso de uso para inyectar estilo en DOM así que no preguntes por qué ni diga cargar el CSS en el archivo .css).Error de Chrome con NO_MODIFICATION_ALLOWED_ERR Dom Exception 7

<script type="text/javascript"> 
window.onload = function() 
{ 
    var bmstyle = document.createElement('style'); 
    bmstyle.setAttribute('type', 'text/css'); 
    var styleStr = "#test-div {background:#FFF;border:2px solid #315300;"; 
    bmstyle.innerHTML = styleStr; 
    document.body.appendChild(bmstyle); 
} 

</script> 

Si ejecuto en Firefox, funciona bien. Pero tengo este error en Google Chrome:

Line bmstyle.innerHTML = styleStr; 
Uncaught Error: NO_MODIFICATION_ALLOWED_ERR: DOM Exception 7 

¿Alguien tiene una solución? Gracias

+1

parece mi problema que se describe aquí http://code.google.com/p/chromium/issues/detail?id=3976#makechanges~~V~~singular~~3rd así que me pregunto si "¿hay una forma de trabajar? " Gracias –

Respuesta

9

Creo que es porque estás usando innerHTML cuando en cualquier otro lugar estás usando la sintaxis XML. Proveedores:

bmstyle.nodeValue = styleStr; 

Sugerencia 2:

También podría ser porque usted está tratando de establecer el innerHTML de un elemento aún no está en el código HTML DOM. Si ese es el caso, mi primera sugerencia todavía debe soportar, o se puede ir con:

document.body.appendChild(bmstyle); 
bmstyle.innerHTML = styleStr; 

No estoy seguro de si había necesidad de una línea entre medio para recuperar el elemento o si el bmstyle todavía señalar lo.

+0

Debo mencionar que dado que el DOM en este caso es un DOM HTML, no debería importar. Pero Chrome puede estar enojado cuando no configuras la variable del elemento DOM explícitamente como HTML. – Anthony

+0

He utilizado su sugerencia 2 y todavía tiene un error. Utilicé la sugerencia 1 con nodeValue, no tiene ningún error, pero la etiqueta de estilo no tiene nada (por cierto, corregí para agregar} al final). ¿Debo insertar en el encabezado y cómo? –

+0

¡Gracias por esto!Muy útil –

1

Se podría ser porque es válido para poner <style> elementos en el interior del cuerpo, pero para ser honesto, me sorprendería

2

Yo también he tenido este problema, intente éste:

bmstyle.value = styleStr; 
1

Trate de usar:

<f:view xmlns:f="http://java.sun.com/jsf/core" contentType="text/html" /> 
1

uso innerText/textContent. O cree un nodo de texto con los estilos y agréguelo a la etiqueta de estilo. No es porque el estilo esté en el cuerpo, además siempre puedes agregarlo a la cabeza, lo que no soluciona el problema.

3

Solo una nota para referencia futura ... Estoy usando la siguiente función para crear dinámicamente estilos CSS. Descubrí que el uso de textContent funcionaba mejor.

Esto rompe el Safari

el.innerHTML = css.join('\n'); 

Esto rompe en Firefox

el.innerText = css.join('\n'); 

La siguiente es mi código final que funciona en ambos navegadores. IE no probado ...

/** 
* Write out stylesheets to the page. 
* 
* @param {array} css 
*/ 
function print_css(css) { 
    var headTag = document.getElementsByTagName('head')[0], 
     el = document.createElement('style'); 

    el.type = 'text/css'; 
    el.textContent = css.join('\n'); 
    headTag.appendChild(el); 
} 
Cuestiones relacionadas