De minha pergunta recente , eu já criei algumas funções JavaScript para visualização parcial de carregamento dinâmico. Portanto, não posso depurar nenhum JavaScript de carregamento dinâmico. Porque todo o JavaScript carregado será avaliado pela função "eval".
No entanto, descobri uma maneira de criar um novo JavaScript usando o seguinte script para criar dinamicamente o script no cabeçalho do documento atual. Todos os scripts carregados serão exibidos em HTML DOM (que você pode usar qualquer depurador para localizá-lo).
var script = document.createElement('script')
script.setAttribute("type","text/javascript")
script.text = "alert('Test!');";
document.getElementsByTagName('head')[0].appendChild(script);
A propósito, a maioria dos depuradores (IE8 Developer Toolbar, Firebug e Google Chrome) não consegue definir o ponto de interrupção em nenhum script dinâmico. Porque o script depurável deve ser carregado na primeira vez após o carregamento da página.
Você tem uma ideia para depurar conteúdo ou arquivo de script dinâmico?
Atualização 1 - Adicionar código fonte para teste
Você pode usar o seguinte arquivo xhtml para tentar depurar o valor de someVariable.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Dynamic Loading Script Testing</title>
<script type="text/javascript">
function page_load()
{
var script = document.createElement('script')
script.setAttribute("id", "dynamicLoadingScript");
script.setAttribute("type","text/javascript");
script.text = "var someVariable = 0;\n" +
"someVariable = window.outerWidth;\n" +
"alert(someVariable);";
document.getElementsByTagName('head')[0].appendChild(script);
}
</script>
</head>
<body onload="page_load();">
</body>
</html>
Da resposta, acabei de testá-lo no FireBug. O resultado deve ser exibido como as imagens abaixo.
Observe o script "dynamicLoadingScript" adicionado após o carregamento da página.
Mas não é encontrado na guia de script do FireBug
Atualização 2 - Criar ponto de interrupção de depuração no script de carregamento dinâmico
Ambas as imagens acima mostram a inserção de "depurador;" declaração em alguma linha de script pode disparar um ponto de interrupção no script de carregamento dinâmico. No entanto, ambos os depuradores não mostram nenhum código no ponto de interrupção. Portanto, é inútil fazer isso.
Obrigado,
fonte
Respostas:
Também seria possível usar cromo para o mesmo. O Chrome tem um recurso onde você pode especificar um atributo de analisador e fazer com que o pedaço de JS dinâmico apareça como um arquivo que pode então ser navegado e definido os pontos de interrupção.
o atributo que precisa ser definido é
onde dynamicScript.js é o nome do arquivo que deve aparecer no navegador de arquivos de script.
Mais informações aqui
Paul Irish também fala sobre isso brevemente em sua excelente palestra sobre Tooling & The Webapp Development Stack
fonte
Tente adicionar um "depurador;" declaração no javascript que você está adicionando dinamicamente. Isso deve fazer com que ele pare naquela linha, independentemente das configurações do ponto de interrupção.
fonte
Sim, é (agora) possível depurar JavaScript carregado dinamicamente usando o Google Chrome!
Não há necessidade de adicionar extra
debugger;
ou qualquer outro atributo para o arquivo JS carregado dinamicamente. Basta seguir as etapas abaixo para depurar:Método 1:
Meu líder de tecnologia acabou de mostrar uma maneira super fácil de depurar métodos Javascript carregados dinamicamente.
No meu caso, é
GetAdvancedSearchConditonRowNew
Se o método JS foi carregado, ele mostrará a definição do método.
Método 2:
Por exemplo, estou carregando um arquivo JS quando clico em um botão usando uma
ajax
chamada.network
guia nas ferramentas de desenvolvimento do google chromeRetrieveAllTags?_=1451974716935
)initiater
e você encontrará seu arquivo JS carregado dinamicamente (com o prefixoVM*
).VM*
arquivo para abri-lo.fonte
Estou usando o Google Chrome para esse fim.
No Chrome na guia de scripts, você pode habilitar 'pausar em todas as exceções'
E, em seguida, coloque em algum lugar na linha de código
try{throw ''} catch(e){}
. O Chrome irá parar a execução quando atingir esta linha.EDIT: imagem modificada para ficar mais claro do que estou falando.
fonte
try{throw ''} catch(e){}
e ativa o modo 'pausar em todas as exceções' e o cromo interromperá a execução quando a exceção for lançada. Eu verifiquei muitas vezes. Carreguei outra imagem. Está mais claro aí do que estou falando.debugger
não funcionaria em script criado dinamicamente naquela época.Acho que você pode precisar dar ao código avaliado um "nome" como este:
http://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/
Se você fizer isso, acho que é provável que a
debugger
abordagem da "atualização 2" funcione.fonte
//@ sourceURL=blah
em produção.debugger
parte que causa problemas, não o comentário da fonte (que certamente é ignorado por JS)ATUALIZAÇÃO : a sintaxe para sourceUrl foi alterada (@ é substituído por #) para evitar erros em navegadores não suportados (leia: IE). Detalhes
fonte
Usando o Chrome (12.0.742.112) com o código que você forneceu mais uma instrução do depurador como esta
funciona para mim.
Pode ser mais tangível se você vincular a mudança do seletor a um evento em sua visão parcial, em vez de criar elementos de script no corpo html (não parece certo).
Você poderia fazer algo assim
Este código sempre adicionaria um seletor de limitação para todas as operações de seleção do jQuery feitas enquanto o mouse está em um determinado elemento, dado que o HTML não deve bagunçar.
(Ainda parece hacker, pode ser que alguém tenha uma solução melhor)
Felicidades
fonte
No Firebug, você deve conseguir ver esse script depois que a página for carregada e o script injetado. Ao fazer isso, você pode definir um ponto de interrupção no local apropriado e ele será preservado quando você atualizar a página.
fonte
O Javascript carregado dinamicamente ainda precisa ser analisado pelo navegador, é onde o depurador do WebKit ou FireBug fica, portanto, está sujeito ao depurador de qualquer maneira, acho que é o mesmo para as ferramentas de desenvolvedor no IE8,
Portanto, seu código está sujeito ao depurador, portanto, o local onde você obter um problema não estará naquele arquivo ou texto se não houver erro
A outra coisa é que
script.text = "alert('Test!');";
não é válido, então não funcionará em todos os navegadores o que você quer éscript.innerHTML = "alert('Test!');";
mesmo que seu HTML interno signifique código dentro das tags HTML não o HTML dentro apenas a maioria das pessoas usa-o para isso então fica explicado errado
EDITADO PARA ATUALIZAÇÃO DOIS
E na segunda atualização usando o Chrome eu fiz isso
vá para about: blank Abra o console e cole
então ele irá quebrar e abrir a guia do script com sobre: em branco mostrado (nada para ver)
Em seguida, no lado direito, mostre a lista de pilha de chamadas, clique no segundo (função anônima) e será mostrado.
Portanto, em seu arquivo, você terá uma (função anônima) que é o código que você está executando e verá o ponto de interrupção nele. para que você saiba que está no caminho certo.
fonte
Usando a ferramenta de desenvolvedores do Google Chrome (ou Safari ), você pode executar o JavaScript linha por linha.
Developer Tool
>
Scripts>
Escolha qual script você deseja depurar>
sinal de pausa no lado direito Ou defina pontos de interrupção clicando no número da linhafonte
Uma opção que gosto de usar adicionando uma instrução console.log ('') em meu código. Uma vez que esta declaração aparece no console, um número de linha é associado a ela. Você pode clicar nesse número para ir até o local na fonte e definir um ponto de interrupção. A desvantagem dessa abordagem é que os pontos de interrupção não são preservados nos recarregamentos de página e você precisa executar o código antes de adicionar um depurador.
fonte
Para o navegador Google Chrome atual ou outros navegadores modernos, você pode pesquisar facilmente qualquer código avaliado com a ferramenta do desenvolvedor, como as imagens a seguir.
Crie algum ponto de interrupção e execute a função para testá-lo.
fonte