¿Cómo pasar parámetros a una etiqueta de Script?


He leído el tutorial: http://drnicwilliams.com/2006/11/21/diy-widgets / para Widgets XSS de Dr. Nic.

Estoy buscando una manera de pasar parámetros a la etiqueta de script. Por ejemplo, para hacer el siguiente trabajo:

<script src="http://path/to/widget.js?param_a=1&param_b=3">

¿Hay alguna manera de hacer esto?


ACTUALIZACIÓN: Dos enlaces interesantes:

Author: Community, 2011-03-14

9 answers

Me disculpo por responder a una pregunta super vieja, pero después de pasar una hora luchando con las soluciones anteriores opté por cosas más simples.

<script src=".." one="1" two="2"></script>

Dentro del script anterior:

document.currentScript.getAttribute('one'); //1
document.currentScript.getAttribute('two'); //2

Mucho más fácil que jquery O url parsing.

Es posible que necesite el polyfil para doucment.currentScript de la respuesta de @Yared Rodriguez para IE:

document.currentScript = document.currentScript || (function() {
  var scripts = document.getElementsByTagName('script');
  return scripts[scripts.length - 1];
})();
 67
Author: Richard Fox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-25 13:03:43

Es mejor usar la característica en html5 5 atributos de datos

<script src="http://path.to/widget.js" data-width="200" data-height="200">
</script>

Dentro del archivo de script http://path.to/widget.js usted puede conseguir los paremeters de esa manera:

<script>
function getSyncScriptParams() {
         var scripts = document.getElementsByTagName('script');
         var lastScript = scripts[scripts.length-1];
         var scriptName = lastScript;
         return {
             width : scriptName.getAttribute('data-width'),
             height : scriptName.getAttribute('data-height')
         };
 }
</script>
 47
Author: OBender,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-19 10:15:19

Lo tengo. Tipo de truco, pero funciona bastante bien:

var params = document.body.getElementsByTagName('script');
query = params[0].classList;
var param_a = query[0];
var param_b = query[1];
var param_c = query[2];

Paso los parámetros en la etiqueta de script como clases:

<script src="http://path.to/widget.js" class="2 5 4"></script>

Este artículo ayudó mucho.

 15
Author: Tomer Lichtash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-25 20:15:05

JQuery tiene una forma de pasar parámetros de HTML a javascript:

Pon esto en el archivo myhtml.html:

<!-- Import javascript -->
<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
<!-- Invoke a different javascript file called subscript.js -->
<script id="myscript" src="subscript.js" video_filename="foobar.mp4">/script>

En el mismo directorio haga un archivo subscript.js y ponga esto allí:

//Use jquery to look up the tag with the id of 'myscript' above.  Get 
//the attribute called video_filename, stuff it into variable filename.
var filename = $('#myscript').attr("video_filename");

//print filename out to screen.
document.write(filename);

Analizar El Resultado:

Cargando el myhtml.la página html tiene' foobar.mp4 ' imprimir a la pantalla. La variable llamada video_filename se pasó de html a javascript. Javascript lo imprimió en la pantalla, y apareció como incrustado en el html en el padre.

Jsfiddle prueba de que lo anterior funciona:

Http://jsfiddle.net/xqr77dLt /

 9
Author: Eric Leschinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-25 20:19:55

Si está utilizando jquery es posible que desee considerar su método de datos.

He usado algo similar a lo que estás intentando en tu respuesta pero así:

<script src="http://path.to/widget.js" param_a = "2" param_b = "5" param_c = "4">
</script>

También puedes crear una función que te permita agarrar los parámetros GET directamente (esto es lo que uso con frecuencia):

function $_GET(q,s) {
    s = s || window.location.search;
    var re = new RegExp('&'+q+'=([^&]*)','i');
    return (s=s.replace(/^\?/,'&').match(re)) ? s=s[1] : s='';
}

// Grab the GET param
var param_a = $_GET('param_a');
 7
Author: Stuart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-25 20:15:56

Otra forma es usar meta etiquetas. Cualquier dato que se supone que se debe pasar a su JavaScript se puede asignar de la siguiente manera:

<meta name="yourdata" content="whatever" />
<meta name="moredata" content="more of this" />

Los datos se pueden extraer de las meta etiquetas como esta (mejor hecho en un controlador de eventos DOMContentLoaded):

var data1 = document.getElementsByName('yourdata')[0].content;
var data2 = document.getElementsByName('moredata')[0].content;

Absolutamente sin problemas con jQuery o similares, sin hacks y soluciones necesarias, y funciona con cualquier versión HTML que soporte meta tags...

 5
Author: Robidu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-31 08:11:34

Gracias a jQuery, una solución simple compatible con HTML5 es crear una etiqueta HTML adicional, como div, para almacenar los datos.

HTML:

<div id='dataDiv' data-arg1='content1' data-arg2='content2'>
  <button id='clickButton'>Click me</button>
</div>

JavaScript :

$(document).ready(function() {
    var fetchData = $("#dataDiv").data('arg1') + 
                    $("#dataDiv").data('arg2') ;

    $('#clickButton').click(function() {
      console.log(fetchData);
    })
});

Demostración en Vivo con el código anterior: http://codepen.io/anon/pen/KzzNmQ?editors=1011#0

En la demostración en vivo, se pueden ver los datos de los atributos HTML5 data-* que se concatenarán e imprimirán en el registro.

Fuente: https://api.jquery.com/data/

 3
Author: gagallo7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-09 00:44:07

Coloque los valores que necesita en algún lugar donde el otro script pueda recuperarlos, como una entrada oculta, y luego extraiga esos valores de su contenedor cuando inicialice su nuevo script. Incluso podría poner todos sus parámetros como una cadena JSON en un campo oculto.

 2
Author: bwest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-13 21:07:30

Es un hilo muy antiguo, lo sé, pero esto también podría ayudar si alguien llega aquí una vez que buscan una solución.

Básicamente usé el documento.currentScript para obtener el elemento desde donde se ejecuta mi código y filtrar usando el nombre de la variable que estoy buscando. Lo hice extendiendo currentScript con un método llamado "get", por lo que podremos recuperar el valor dentro de ese script usando:

document.currentScript.get('get_variable_name');

De esta manera podemos usar URI estándar para recuperar las variables sin añadir atributos especiales.

Este es el código final

document.currentScript.get = function(variable) {
    if(variable=(new RegExp('[?&]'+encodeURIComponent(variable)+'=([^&]*)')).exec(this.src))
    return decodeURIComponent(variable[1]);
};

Me estaba olvidando de IE :) No podía ser tan fácil... Bueno, no mencioné ese documento.currentScript es una propiedad HTML5. No se ha incluido para diferentes versiones de IE (he probado hasta IE11, y no estaba allí todavía). Para la compatibilidad de IE, he añadido esta parte al código:

document.currentScript = document.currentScript || (function() {
  var scripts = document.getElementsByTagName('script');
  return scripts[scripts.length - 1];
})();

Lo que estamos haciendo aquí es definir algún código alternativo para IE, que devuelve el script actual objeto, que se requiere en la solución para extraer parámetros de la propiedad src. Esta no es la solución perfecta para IE ya que hay algunas limitaciones; Si el script se carga asincrónicamente. Los navegadores más nuevos deben incluir ".currentScript " propiedad.

Espero que ayude.

 2
Author: Yared Rodriguez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-25 13:03:25