A menudo tendré un archivo JavaScript que quiero usar que requiere que se definan ciertas variables en mi página web.
Entonces el código es algo como esto:
<script type="text/javascript" src="file.js"></script>
<script type="text/javascript">
var obj1 = "somevalue";
</script>
Pero lo que quiero hacer es:
<script type="text/javascript"
src="file.js?obj1=somevalue&obj2=someothervalue"></script>
Intenté diferentes métodos y el mejor todavía es analizar la cadena de consulta de esta manera:
var scriptSrc = document.getElementById("myscript").src.toLowerCase();
Y luego busca mis valores.
Me pregunto si hay otra forma de hacer esto sin construir una función para analizar mi cadena.
¿Conocen todos otros métodos?
Respuestas:
Recomiendo no usar variables globales si es posible. Use un espacio de nombres y OOP para pasar sus argumentos a un objeto.
Este código pertenece en file.js:
Y en tu archivo html:
fuente
var MYLIBRARY = MYLIBRARY || (function(){}());
? ¿Por qué deberíaMYLIBRARY
establecerse en un valor booleano?Puede pasar parámetros con atributos arbitrarios. Esto funciona en todos los navegadores recientes.
Dentro de somefile.js puede obtener valores de variables pasados de esta manera:
........
... etc ...
fuente
document.currentScript
, ver caniuse.com/#feat=document-currentscript para compatibilidad (o usar un polyfill)$(..)
sintaxis es jquery, no olvides incluirla.Otra idea que encontré fue asignar un elemento
id
al<script>
elemento y pasar los argumentos comodata-*
atributos. La<script>
etiqueta resultante se vería así:El script podría usar la identificación para ubicarse programáticamente y analizar los argumentos. Dado lo anterior
<script>
etiqueta , el nombre podría recuperarse así:Obtenemos
name
=helper
fuente
helper.js
script recorra todas lasscript
etiquetas de la página, busque la que tienescr="helper.js"
y luego extraigadata-name
.var this_js_script = $('script[src*=somefile]');
(copiado desde arriba )Mira esta URL. Está funcionando perfectamente para el requisito.
http://feather.elektrum.org/book/src.html
Muchas gracias al autor. Para una referencia rápida, pegué la lógica principal a continuación:
fuente
Utiliza variables globales :-D.
Me gusta esto:
El código JavaScript en 'file.js' puede acceder
obj1
yobj2
sin problemas.EDITAR Solo quiero agregar que si 'file.js' quiere verificar si
obj1
eobj2
incluso ha sido declarado, puede usar la siguiente función.Espero que esto ayude.
fuente
return typeof window[$Name] !== 'undefined';
. Tenga en cuenta que pasaría esa función una cadena que contiene el nombre de la variable. Es probable que sea más fácil simplemente verificar si la variable existe en el código de llamada (esto no se puede implementar como una función) a través deif (typeof var !== 'undefined')
.var
.Aquí hay una prueba de concepto muy apresurada.
Estoy seguro de que hay al menos 2 lugares donde puede haber mejoras, y también estoy seguro de que esto no sobreviviría mucho en la naturaleza. Cualquier comentario para hacerlo más presentable o utilizable es bienvenido.
La clave es establecer una identificación para su elemento de script. El único inconveniente es que esto significa que solo puede llamar al script una vez, ya que busca esa ID para extraer la cadena de consulta. Esto podría solucionarse si, en cambio, el script recorre todos los elementos de consulta para ver si alguno de ellos apunta a él, y si es así, utiliza la última instancia de dicho elemento de script. De todos modos, adelante con el código:
Guión que se llama:
Script llamado a través de la siguiente página:
fuente
podría ser muy simple
por ejemplo
Luego puede convertir la cadena de consulta en json como a continuación
y luego puede usar como
fuente
Esto se puede hacer fácilmente si está utilizando un marco Javascript como jQuery. Al igual que,
Ahora puede usar estos parámetros dividiéndolos como sus parámetros variables.
El mismo proceso se puede hacer sin ningún marco, pero tomará más líneas de código.
fuente
Bueno, podría tener el archivo javascript creado por cualquiera de los lenguajes de script, inyectando sus variables en el archivo en cada solicitud. Tendría que decirle a su servidor web que no distribuya archivos js estáticamente (sería suficiente usar mod_rewrite).
Sin embargo, tenga en cuenta que pierde el almacenamiento en caché de estos archivos js ya que se modifican constantemente.
Adiós.
fuente
<script>
bloque puede usar algo como loMyModule.Initialize( '<%: Model.SomeProperty%>', '<%: Model.SomeOtherProperty%>', ...);
que se representa en el servidor. Precaución:<%:
escapa al valor, mientras<%=
envía el valor sin escape.MyModule
sería un espacio de nombres (es decir, una variable dentro del archivo .js que se autoinvoca, que expone la funciónInitialize
). Voté su respuesta, porque es una contribución útil.Buena pregunta y respuestas creativas, pero mi sugerencia es hacer que sus métodos estén paramterizados y eso debería resolver todos sus problemas sin ningún truco.
si tienes función:
puedes cambiar esto a:
Creo que este es el enfoque más natural, no necesita crear documentación adicional sobre 'parámetros de archivo' y recibe lo mismo. Esto es especialmente útil si permite que otros desarrolladores utilicen su archivo js.
fuente
No, realmente no puede hacer esto agregando variables a la porción de cadena de consulta de la URL del archivo JS. Si está escribiendo la parte del código para analizar la cadena que te molesta, ¿quizás otra forma sería codificar json tus variables y ponerlas en algo como el atributo rel de la etiqueta? No sé qué tan válido es esto en términos de validación de HTML, si eso es algo que te preocupa mucho. Luego solo necesita encontrar el atributo rel del script y luego json_decode eso.
p.ej
fuente
No es html válido (no lo creo) pero parece funcionar si crea un atributo personalizado para la etiqueta de script en su página web :
<script id="myScript" myCustomAttribute="some value" ....>
Luego acceda al atributo personalizado en javascript:
var myVar = document.getElementById( "myScript" ).getAttribute( "myCustomAttribute" );
No estoy seguro de si esto es mejor o peor que analizar la cadena de origen del script.
fuente
Si necesita una forma que pase la verificación CSP (que prohíbe la inseguridad en línea), entonces debe usar un método nonce para agregar un valor único tanto al script como a la directiva CSP o escribir sus valores en el html y leerlos nuevamente.
Método Nonce para express.js:
o escribir valores al método html. en este caso usando Jquery:
fuente