Domanda

Ho una semplice pagina Web HTML con un oggetto Flash incorporato. In base alla presenza di una stringa di query, voglio variare uno dei parametri sull'oggetto, quindi ho scritto qualcosa del genere:

<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>

Funziona benissimo in Firefox, ma IE8 non esegue affatto il codice js. Ho sostituito l'intero script con una semplice chiamata di avviso (" a "), che neanche IE8 ha eseguito. Usando lo strumento sviluppatore, posso vedere lo script, ma non è evidenziato, né posso impostare un punto di interruzione in esso, quindi sono abbastanza sicuro che non lo riconosca come uno script valido.

È una limitazione IE o mi manca qualcosa?

Ho sostituito il tutto con le chiamate document.write, e funziona benissimo, ma preferirei qualcosa di più vicino al mio tentativo originale.

È stato utile?

Soluzione

Penso che il problema risieda nel DOM e sembra che Internet Explorer non esegua JavaScipt in linea.

Aspettare che la finestra si carichi prima di inizializzare, e quindi aggiungere i parametri come figli (piuttosto che scrivere HTML) è la strada giusta da percorrere, a quanto pare.

Quanto segue ha funzionato come previsto in Firefox e 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>

Altri suggerimenti

Non funziona se lo provi nel modo DOM corretto? Inoltre, sei sicuro di non voler variant = " 1 " invece di " variante 1 " ? Non hai bisogno di un attributo name da qualche 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>

Ho eliminato parte dell'html.

Ho scritto quanto segue in base al tuo esempio:

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

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

E funziona benissimo in IE8. Ho apportato due modifiche fondamentali:

  1. Ho spostato lo script dall'HTML e l'ho fatto funzionare come una funzione legata all'evento onload.

  2. Ho modificato i params per renderli più validi XHTML, usando < param / > invece di < param > .

Questa potrebbe non essere la risposta che stai cercando, ma quando si tratta di fare qualcosa di dinamico con Flash, mi arrendo e utilizzo SWFObject . Ci sono così tante cose complicate e non standard durante il rendering di Flash, e varia tra browser, versione di Flash, ecc. Quindi fare affidamento su una libreria esterna potrebbe essere meno elegante rispetto a trovare la soluzione più efficiente e minimalista per incorporare in un dato situazione, ma consente di risparmiare molto tempo e sarà meno probabile che scoprirai in seguito che è rotto nel browser X.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top