Como posso referenciar o elemento de script que carregou o javascript atualmente em execução?
Aqui está a situação. Eu tenho um script "mestre" sendo carregado no alto da página, logo abaixo da tag HEAD.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type="text/javascript" src="scripts.js"></script>
Há um script em "scripts.js" que precisa ser capaz de carregar sob demanda de outros scripts. O método normal não funciona muito bem para mim, porque preciso adicionar novos scripts sem fazer referência à tag HEAD, porque o elemento HEAD não concluiu a renderização:
document.getElementsByTagName('head')[0].appendChild(v);
O que eu quero fazer é fazer referência ao elemento de script que carregou o script atual, para que eu possa acrescentar minhas novas tags de script carregadas dinamicamente ao DOM depois dele.
<script type="text/javascript" src="scripts.js"></script>
loaded by scripts.js--><script type="text/javascript" src="new_script1.js"></script>
loaded by scripts.js --><script type="text/javascript" src="new_script2.js"></script>
javascript
element
parent
Shog9
fonte
fonte
Respostas:
Como obter o elemento de script atual:
1. Use
document.currentScript
document.currentScript
retornará o<script>
elemento cujo script está sendo processado no momento.Benefícios
defer
&async
)Problemas
<script type="module">
2. Selecione o script por id
Ao atribuir ao script um atributo id, você poderá selecioná-lo facilmente por id de dentro do uso
document.getElementById()
.Benefícios
defer
&async
)Problemas
id
atributo pode causar um comportamento estranho para scripts em alguns navegadores para alguns casos extremos3. Selecione o script usando um
data-*
atributodata-*
Atribuir um atributo ao script permitirá que você o selecione facilmente de dentro.Isso tem poucos benefícios em relação à opção anterior.
Benefícios
defer
&async
)Problemas
querySelector()
não compatível em todos os navegadoresid
atributo<script>
comid
casos de ponta.4. Selecione o script por src
Em vez de usar os atributos de dados, você pode usar o seletor para escolher o script pela origem:
No embed.js:
Benefícios
defer
&async
)Problemas
id
atributo5. Passe por todos os scripts para encontrar o que você deseja
Também podemos percorrer todos os elementos do script e verificar cada um individualmente para selecionar o que queremos:
Isso nos permite usar as duas técnicas anteriores em navegadores mais antigos que não suportam
querySelector()
bem os atributos. Por exemplo:Isso herda os benefícios e os problemas de qualquer abordagem adotada, mas não depende disso,
querySelector()
pois funcionará em navegadores mais antigos.6. Obtenha o último script executado
Como os scripts são executados sequencialmente, o último elemento do script muitas vezes será o script em execução no momento:
Benefícios
Problemas
defer
&async
)fonte
script
está em umtemplate
inserido em um DOM SombraComo os scripts são executados sequencialmente, a tag de script atualmente executada é sempre a última tag de script da página até então. Portanto, para obter a tag de script, você pode:
fonte
Provavelmente, a coisa mais fácil a fazer seria
id
atribuir um atributo à sua tag de script .fonte
Os scripts são executados sequencialmente apenas se eles não tiverem um atributo "adiar" ou "assíncrono". Conhecer um dos possíveis atributos ID / SRC / TITLE da tag de script também pode funcionar nesses casos. Então, as sugestões de Greg e Justin estão corretas.
Já existe uma proposta para um
document.currentScript
nas listas WHATWG.EDIT : Firefox> 4 já implementa essa propriedade muito útil, mas não está disponível no IE11 pela última vez que verifiquei e disponível apenas no Chrome 29 e Safari 8.
Edição : ninguém mencionou a coleção "document.scripts", mas acredito que o seguinte pode ser uma boa alternativa entre navegadores para obter o script atualmente em execução:
fonte
Aqui está um pouco de um polyfill que aproveita
document.CurrentScript
se existe e volta a encontrar o script por ID.Se você incluir isso na parte superior de cada marca de script, acredito que você poderá saber constantemente qual marca de script está sendo acionada e também poderá fazer referência à marca de script no contexto de um retorno de chamada assíncrono.
Não testado, deixe comentários para os outros, se você tentar.
fonte
id
atributo é inválido em umscript
elemento. Que tipos de problemas essa abordagem poderia gerar?id
atributo.id
,,class
eslot
são definidos no nível DOM, não no nível HTML. Se você acessar os atributos globais em HTML e rolar a lista, encontrará "O padrão DOM define os requisitos do agente do usuário para os atributos de classe, ID e slot para qualquer elemento em qualquer espaço de nome". seguido por "Os atributos de classe, ID e slot podem ser especificados em todos os elementos HTML". A especificação do DOM cobre aqui .Ele deve funcionar no carregamento da página e quando uma tag de script é adicionada com javascript (por exemplo, com ajax)
fonte
Siga estas etapas simples para obter referência ao bloco de scripts em execução atual:
Exemplo (ABCDE345678 é o ID exclusivo) :
btw, para o seu caso, você pode simplesmente usar o método document.write () à moda antiga para incluir outro script. Como você mencionou que o DOM ainda não foi renderizado, é possível aproveitar o fato de o navegador sempre executar o script em sequência linear (exceto o adiado que será renderizado posteriormente), portanto o restante do documento ainda "não existe". Tudo o que você escrever em document.write () será colocado logo após o script do chamador.
Exemplo de página HTML original :
Conteúdo de script.js :
Após renderizada, a estrutura do DOM se tornará:
fonte
Uma abordagem para lidar com scripts assíncronos e adiados é alavancar o manipulador de onload - defina um manipulador de onload para todas as tags de script e o primeiro a ser executado deve ser o seu.
fonte
Para obter o script, que atualmente carregou o script, você pode usar
Você precisa manter uma referência no início do seu script, para poder ligar mais tarde
fonte
Considere este algoritmo. Quando o seu script for carregado (se houver vários scripts idênticos), consulte document.scripts, encontre o primeiro script com o atributo "src" correto, salve-o e marque-o como 'visitado' com um atributo de dados ou nome de classe exclusivo.
Quando o próximo script for carregado, verifique novamente document.scripts, passando sobre qualquer script já marcado como visitado. Tome a primeira instância não visitada desse script.
Isso pressupõe que scripts idênticos provavelmente serão executados na ordem em que são carregados, da cabeça para o corpo, de cima para baixo, de síncrono para assíncrono.
Isso examinará todo o script para o primeiro script correspondente que não está marcado com o atributo especial.
Em seguida, marque esse nó, se encontrado, com um atributo de dados para que as verificações subsequentes não o escolham. Isso é semelhante ao gráfico dos algoritmos BFS e DFS, nos quais os nós podem ser marcados como 'visitados' para impedir a revisão.
fonte
Eu tenho isso, que está funcionando no FF3, IE6 e 7. Os métodos nos scripts carregados sob demanda não estão disponíveis até o carregamento da página ser concluído, mas isso ainda é muito útil.
fonte
Se você puder assumir o nome do arquivo do script, poderá encontrá-lo. Até agora, só testei realmente a seguinte função no Firefox.
fonte
Eu descobri o código a seguir como o mais consistente, com desempenho e simples.
fonte