Pregunta

Tengo una página web html con un objeto flash incrustado. Basándome en la presencia de una cadena de consulta, quiero variar uno de los parámetros al objeto, así que escribí algo como esto:

<object  ...>
   <param ...>
   <param ...>
   <script type="text/javascript">
      if (window.location.search.indexOf("stuff")>=0) {
          document.write("<param  variant 1>");
      } else {
          document.write("<param variant 2>");
      }
   </script>
</object>

Funciona muy bien en Firefox, pero IE8 no ejecuta el código js, ??en absoluto. Reemplacé todo el script con una alerta simple (" una ") llamada, y eso tampoco fue ejecutado por IE8. Al usar la herramienta para desarrolladores, puedo ver el script, pero no está resaltado, ni puedo establecer un punto de interrupción en él, así que estoy bastante seguro de que no lo reconoce como un script válido.

¿Es esta una restricción de IE o me falta algo?

He reemplazado todo con las llamadas document.write, y eso funciona bien, pero preferiría algo más cercano a mi intento original.

¿Fue útil?

Solución

Creo que el problema radica en el DOM y en que Internet Explorer aparentemente no ejecuta JavaScipt en línea.

Esperar que se cargue la ventana antes de inicializar, y luego agregar los parámetros como hijos (en lugar de escribir HTML) es la forma correcta de hacerlo, parece.

Lo siguiente funcionó como se esperaba tanto en Firefox como en Internet Explorer.

<html>
<head>
    <script type="text/javascript">

        listen(window, "load", "onload", initiate);

        // called when the window finishes loading
        function initiate() {
            checkStuff();
        }

        function checkStuff() {

            var myObj = document.getElementById("myObj");
            var elm = document.createElement('param');

            if (window.location.search.indexOf("stuff") >= 0){
                elm.setAttribute("name", "param1");
                elm.setAttribute("value", "true");
            } else {
                elm.setAttribute("name", "param2");
                elm.setAttribute("value", "true");
            }

            myObj.appendChild(elm);
        }

        // just a simple function to attach events to objects
        function listen(obj, event_normal, event_alt, func) {
            if (obj.attachEvent) {
                obj.attachEvent(event_alt, func);
            } else if (obj.addEventListener) {
                obj.addEventListener(event_normal, func, false);
            } else {
                obj.addEventListener(event_normal, func, false);
            }
        }

    </script>
</head>
<body>
    <object id="myObj"></object>
</body>
</html>

Otros consejos

¿Falla si lo intentas de la forma DOM adecuada? Además, ¿está seguro de que no desea que variant = " 1 " en lugar de " variant 1 " ? ¿No necesitas un atributo name en alguna parte?

<object id="foo"></object> 
<script>
if (window.location.search.indexOf("stuff")>=0) {
    var object = document.getElementById('foo'), param = document.createElement('param');
    param.setAttribute('variant', '1'); // not sure if you want variant=1 or variant=variant AND 1=1
    object.appendChild( param );
} else { /* add the rest */ }
</script>

He eliminado algunos de los html.

Escribí lo siguiente según tu ejemplo:

   <script type="text/javascript">
    window.onload = function() {
      if (window.location.search.indexOf("stuff")>=0) {
          alert("stuff!");
      } else {
          alert("nope!");
      }
     };
   </script>

   <object>
       <param />
       <param />
   </object>

Y funciona bien en IE8. Hice dos cambios fundamentales:

  1. Moví el script fuera del HTML y lo ejecuté como una función vinculada al evento onload.

  2. Cambié el params para que tenga más XHTML, usando < param / > en lugar de < param > .

Puede que esta no sea la respuesta que está buscando, pero cuando se trata de hacer algo dinámico con Flash, simplemente me rindo y uso SWFObject . Al procesar Flash, hay muchas cosas complicadas y no estándar que varían según el navegador, la versión de Flash, etc. Por lo tanto, confiar en una biblioteca externa puede ser menos elegante que encontrar la solución más eficiente y minimalista para incrustar en un determinado situación, pero ahorra mucho tiempo y es menos probable que luego descubra que está roto en el navegador X.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top