Passe vars para JavaScript por meio do atributo SRC
-
06-07-2019 - |
Pergunta
No meu arquivo HTML Tenho ligado à JS com:
src="myscript.js?config=true"
O meu JS lido diretamente o valor deste var assim?
alert (config);
Isto não funciona, eo erro FireFox Console diz "config não está definido". Como faço para ler o vars passou através do atributo src no arquivo JS? É tão simples assim?
Solução
<script>
var config=true;
</script>
<script src="myscript.js"></script>
Você não pode passar variáveis ??para JS do jeito que você tentou. SCRIPT tag não cria um objeto Window (que tem uma cadeia de consulta), e não é código do lado do servidor.
Outras dicas
Sim, você pode, mas você precisa saber o nome do arquivo de script exata no script:
var libFileName = 'myscript.js',
scripts = document.head.getElementsByTagName("script"),
i, j, src, parts, basePath, options = {};
for (i = 0; i < scripts.length; i++) {
src = scripts[i].src;
if (src.indexOf(libFileName) != -1) {
parts = src.split('?');
basePath = parts[0].replace(libFileName, '');
if (parts[1]) {
var opt = parts[1].split('&');
for (j = opt.length-1; j >= 0; --j) {
var pair = opt[j].split('=');
options[pair[0]] = pair[1];
}
}
break;
}
}
Você tem agora uma variável de 'opções' que tem os argumentos passados. Eu não testá-lo, eu mudei um pouco de http://code.google.com/p/canvas-text/source/browse/trunk/canvas.text.js onde trabalha.
Você pode ter visto este feito, mas realmente o arquivo JS está sendo pré-processado do lado do servidor usando PHP ou alguma outra linguagem de primeira. O código do lado do servidor irá imprimir / ecoar o javascript com as variáveis ??set. Eu vi um serviço de anúncios roteirizado fazer isso antes, e isso me fez olhar para ver se ele pode ser feito com js simples ol', mas não pode.
Você precisa usar o Javascript para encontrar o atributo src do script e analisar as variáveis ??após o '?'. Usando a estrutura Prototype.js, parece algo como este:
var js = /myscript\.js(\?.*)?$/; // regex to match .js
var jsfile = $$('head script[src]').findAll(function(s) {
return s.src.match(js);
}).each(function(s) {
var path = s.src.replace(js, ''),
includes = s.src.match(/\?.*([a-z,]*)/);
config = (includes ? includes[1].split('=');
alert(config[1]); // should alert "true" ??
});
habilidades Meu Javascript / RegEx são enferrujado, mas essa é a idéia geral. Rasgado direto do arquivo scriptaculous.js!
Seu script pode, contudo, localizar o seu próprio nó do script e examinar o atributo src e extrato de qualquer informação que você gosta.
var scripts = document.getElementsByTagName ('script');
for (var s, i = scripts.length; i && (s = scripts[--i]);) {
if ((s = s.getAttribute ('src')) && (s = s.match (/^(.*)myscript.js(\?\s*(.+))?\s*/))) {
alert ("Parameter string : '" + s[3] + "'");
break;
}
}
Quer ou não isso deve ser feito, é uma pergunta justa, mas se você quiser fazê-lo, http://feather.elektrum.org/book/src.html realmente mostra como. Assumindo blocos do seu navegador quando o processamento de tags de script (atualmente verdadeiros, mas pode não ser prova de futuro), o script em questão é sempre o último script na página até esse ponto.
Em seguida, usando alguma estrutura e plugin como jQuery e http://plugins.jquery.com/project/ parseQuery isso se torna bastante trivial. Surpreso não há um plugin para isso ainda.
Um pouco relacionado é marcas de script degradantes de John Resig, mas que o código é executado após o script externo, não como parte da inicialização: http://ejohn.org/blog/degrading-script-tags/
Créditos: Passando parâmetros para JavaScript arquivos , Passando parâmetros para arquivos JavaScript
Usando variáveis ??globais não é uma solução tão limpo ou seguro, em vez disso você pode usar os atributos de dados-X, é mais limpo e mais seguro:
<script type="text/javascript" data-parameter_1="value_1" ... src="/js/myfile.js"></script>
De myfile.js você pode acessar os parâmetros de dados, por exemplo, com jQuery:
var parameter1 = $('script[src*="myfile.js"]').data('parameter_1');
Obviamente "myfile.is" e "Parameter_1" tem de corresponder nos 2 fontes;)