ie8 var w = window.open () - “Mensagem: Argumento inválido.”


113

Tenho um site que apresenta um problema apenas com o IE8:

O código é:

var w = window.open(urlstring, wname, wfeatures, 'false');

O erro é:

Mensagem: argumento inválido.
Linha: 419 Char: 5
Código: 0
URI: http: //HOSTNAME/js_context.js

Confirmei o número da linha do código (a "Linha" e o "URI" estão corretos) e sei que em versões posteriores do IE8 isso é considerado preciso.

Eu verifiquei todos os parâmetros de entrada na chamada, despejando alertas e todos parecem válidos.

Este problema não acontece no FF (provavelmente 3).

ATUALIZAR:

O problema parece estar em usar a atribuição do resultado de window.open () ao fazer "var w". Quando divido a linha em duas instruções, ela funciona no IE8.

ATUALIZAÇÃO2:

Baseado em:

http://javascript.crockford.com/code.html

Quando uma função deve ser chamada imediatamente, toda a expressão de chamada deve ser agrupada entre parênteses para que fique claro que o valor que está sendo produzido é o resultado da função e não a própria função.

Não é exatamente o que está acontecendo aqui, mas descobri que a aplicação do princípio resolveu o problema, no modo de compatibilidade do IE8.

var w = (window.open(urlstring, wname, wfeatures, false));

Eu tive o mesmo problema, e a postagem de David é a melhor resposta. Obrigado por sua postagem e pela ajuda de David.
Ervin

Respostas:


251

Esta é uma postagem antiga, mas talvez ainda seja útil para alguém.

Eu tive a mesma mensagem de erro. No final, o problema era um nome inválido para o segundo argumento, ou seja, eu tinha uma linha como:

   window.open('/somefile.html', 'a window title', 'width=300');

O problema era 'um título de janela', pois não é válido. Funcionou bem com a seguinte linha:

   window.open('/somefile.html', '', 'width=300');

Na verdade, lendo cuidadosamente, percebi que a Microsoft não apóia um namesegundo argumento. Quando você olha a página de documentação oficial , vê que a Microsoft permite apenas os seguintes argumentos, se for usar esse argumento:

  • _em branco
  • _meios de comunicação
  • _parent
  • _procurar
  • _auto
  • _topo

1
Acho que deixei de verificar a explicação do Mozilla sobre essa função, porque eu (asker) estava focado na quebra apenas do IE8.
benc

2
basta colocar: developer.mozilla.org/en/DOM/window.open -> "strWindowName não especifica o título da nova janela."
benc

33
Eu também tive esse erro no IE quando meu nome do Windows tinha um traço "-" no nome, como "my-windowname", a qualidade do IE nunca para de me surpreender.
Matt Palmerlee

1
A página de documentação do MSDN que você vinculou a afirma "Opcional. String que especifica o nome da janela.", Que me parece que você deve conseguir usar qualquer palavra-chave além dos argumentos listados acima.
James McMahon

3
Funciona no IE8 com nomes como ImageDisplay1234, mas não funciona com Image-Display-1234
boatcoder

78

O IE é exigente quanto ao argumento do nome da janela. Não gosta de espaços, travessões ou outros sinais de pontuação.


3
ou pontos ou travessões ou talvez outra pontuação
boatcoder

Obrigado, isso é útil
.. realmente

16

Quando você chama window.openno IE, o segundo argumento (nome da janela) deve ser uma das strings de destino predefinidas ou uma string, que tem a forma de um identificador válido em JavaScript.

Então, o que funciona no Firefox: "Job Directory 9463460", não funciona no Internet Exploder e deve ser substituído por: "Job_Directory_9463460" por exemplo (sem espaços, sem sinais de menos, sem pontos, deve ser um identificador válido) .


Obrigado .. isso me ajudou .. Eu tinha travessões (-) no nome da minha janela
delux247

8

o problema pode ser o wname, tente usar um dos mostrados no link acima, cito:

Opcional. String que especifica o nome da janela. Este nome é usado como o valor para o atributo TARGET em um formulário ou elemento âncora.

  • _blank O sURL é carregado em uma nova janela sem nome.
  • _media O url é carregado na Barra de Mídia do Microsoft Internet Explorer 6. Microsoft Windows XP Service Pack 2 (SP2) e posterior. Este recurso não é mais compatível. Por padrão, o url é carregado em uma nova janela ou guia do navegador.
  • _parent O sURL é carregado no pai do quadro atual. Se o quadro não tiver pai, este valor atua como o valor _self.
  • _search Desabilitada no Windows Internet Explorer 7, consulte Segurança e compatibilidade no Internet Explorer 7 para obter detalhes. Caso contrário, o sURL é aberto no painel de pesquisa do navegador no Internet Explorer 5 ou posterior.
  • _self O documento atual é substituído pelo sURL especificado.
  • _top sURL substitui qualquer conjunto de quadros que possa ser carregado. Se não houver conjuntos de quadros definidos, este valor atua como o valor _self.

se estiver usando outro wname, window.open não será executado ...


5
Essa última afirmação não está correta. Você também pode (a) especificar o nome de um quadro existente para carregar a página nesse quadro, (b) especificar o nome de uma "janela nomeada" existente para carregar a página lá, ou (c) especificar um nome que não não existe para criar uma "janela nomeada".
Ben Blank

Eu tive o mesmo problema, exceto que não estava definindo o resultado de window.open como uma variável. Tinha um título de página na variável wname. Alterou para '_blank' e corrigiu o problema.
Derek White

O que eu reduzi para não incluir - ou. Quando me livrei da pontuação Image-Display-1234 -> ImageDisplay1234, tudo estava bem.
boatcoder

1
Para apoiar o argumento de Ben, isso é o que o MSDN diz sobre o segundo parâmetro de window.open: "String que especifica o nome da janela. Este nome é usado como o valor para o atributo TARGET em um formulário ou elemento âncora." E aqui está o documento do atributo TARGET: msdn.microsoft.com/en-us/library/ms534659(v=vs.85).aspx . Diz claramente que o alvo pode ser uma string arbitrária e não apenas os valores listados nesta resposta.
niaher

5

Na verdade, um nome pode ser usado, mas não pode ter espaços, portanto, não window.open("../myPage","MyWindows",...)deve funcionar sem problemas ( window.open ).


4

Eu também enfrento esse problema ao usar o seguinte código:

window.open('test.html','Window title','width=1200,height=800,scrollbars=yes');

mas quando eu excluo o espaço em branco do "Título da janela", o código abaixo está funcionando:

window.open('test.html','Windowtitle','width=1200,height=800,scrollbars=yes');

Isso foi muito útil. Acabei substituindo meus espaços por _. IE estúpido!
MrGlass

2

Olá, usando o seguinte código está funcionando ...

onclick="window.open('privacy_policy.php','','width=1200,height=800,scrollbars=yes');

Anteriormente, eu entrei como

onclick="window.open('privacy_policy.php','Window title','width=1200,height=800,scrollbars=yes');

Significa que a Microsoft não permite que você insira o nome da janela, ela deve estar em branco na window.openfunção ...

Obrigado, Nilesh Pangul


Isso está incorreto, pode estar em branco, mas não precisa estar em branco.
Jimmy Bosse

2

Para mim, o problema era com um traço "-" no campo do nome da janela. Tirei os travessões e o IE não dá erro e de fato abre a janela.


1

O que representa a posição quatro, aquela que tem 'falso' como valor? Isso não deveria ser falso (ou seja, sem aspas?). É possível que as versões anteriores do IE tornassem a string booleana, mas as mais recentes não.


Removi as aspas, mas não era a origem do problema para o IE8.
benc

1

As respostas aqui estão corretas porque o IE não suporta espaços ao definir o título em window.open (), nenhum parece oferecer uma solução alternativa.

Removi o título da minha chamada window.open (você pode usar null ou '') e, em seguida, adicionei o seguinte à página que estava sendo aberta:

<script>document.title = 'My new title';</script>

Não é ideal de forma alguma, mas isso permitirá que você defina o título como quiser em todos os navegadores.


0

Tente remover o último argumento. Fora isso, certifique-se de que urlstring, wname e wfeatures existem.


0

Eu descobri o mesmo problema e depois de ler a primeira resposta que supõe que o problema é causado pelo nome da janela, mudei-o: primeiro para '_blank', que funcionou bem (compatibilidade e visualização normal), depois para o valor anterior, apenas menos o espaço no valor :) - também funcionou. IMO, o problema (ou parte dele) é causado pela incapacidade do IE de usar um valor de string normal como wname. Espero que isso ajude se alguém tiver o mesmo problema.


0

Se você quiser usar o nome da nova janela etc postando um formulário nesta janela, a solução, que funciona no IE, FF, Chrome:

  var ret = window.open("", "_blank");
  ret.name = "NewFormName";

  var myForm = document.createElement("form");
  myForm.method="post";
  myForm.action = "xyz.php";
  myForm.target = "NewFormName";

      ...

0

Parece que mesmo usando um nome de janela personalizado "válido" (não _blank, etc.) usando window.open para abrir uma nova janela, ainda há problemas. Funciona bem na primeira vez que você clica no link, mas se você clicar nele novamente (com a primeira janela aberta ainda aberta), você receberá uma depuração de script "Erro: interface não compatível".

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.