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.
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:
-
Eu me mudei o script fora do HTML e fez correr como uma função ligada ao evento onload.
-
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.