Alterar paramaters no carregamento da página no IE8

StackOverflow https://stackoverflow.com/questions/1604719

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu tenho uma página web HTML simples com um objeto flash incorporado. Com base na presença de uma cadeia de consulta, eu quero variar um dos paramters para o objeto, então eu escrevi algo como isto:

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

Ele funciona muito bem no Firefox, mas não IE8 não executar o código js, ??em tudo. Troquei todo o script com um alerta simples ( "a") chamada, e que não foi executado pelo IE8, tampouco. Usando a ferramenta de desenvolvedor, eu posso ver o roteiro, mas não é destacado, nem posso definir um ponto de interrupção na mesma, então eu tenho certeza que ele é não reconhecê-lo como um script válido.

Será esta uma restrição IE, ou estou faltando alguma coisa?

Eu já substituiu o inteiro com as chamadas document.write, e que funciona bem, mas eu prefiro algo mais perto da minha tentativa original.

Foi útil?

Solução

Eu acho que as mentiras problema no DOM e com Internet Explorer aparentemente não executar in-line JavaScipt.

Espera para a janela de carga antes de inicializar, e depois adicionar os parâmetros como as crianças (ao invés de escrever HTML) é a maneira correta para ir, parece.

A seguir, funcionou como esperado no 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>

Outras dicas

Será que ela falhar se você tentar isso da maneira DOM adequada? Além disso, você tem certeza que não quer variant="1" vez de "variant 1"? Você não precisa de um lugar atributo name?

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

I retirados alguns dos html.

Eu escrevi o seguinte com base no seu exemplo:

   <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 ele funciona muito bem no IE8. I fez duas alterações fundamnetal:

  1. Eu me mudei o script fora do HTML e fez correr como uma função ligada ao evento onload.

  2. Eu mudei o params a ser mais XHTML, usando <param /> vez de <param>.

Esta pode não ser a resposta que você está procurando, mas quando se trata de fazer qualquer coisa dinâmica com o Flash, eu simplesmente desistir e uso SWFObject . Há muito complicado e outras coisas não-padrão acontecendo ao renderizar Flash, e varia através do navegador, versão do Flash, etc. Então, contando com uma biblioteca externa pode ser menos elegante do que encontrar a solução mais eficiente e minimalista para inclusão em um determinado situação, mas poupa muito tempo e você é menos provável para descobrir mais tarde que ele tem quebrado no navegador X.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top