如何将parameter passing给Script标签?

我读了Nic博士的XSS Widgets的教程: http ://drnicwilliams.com/2006/11/21/diy-widgets/。

我正在寻找一种方法将parameter passing给脚本标记。 例如,做以下工作:

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

有没有办法做到这一点?


更新:两个有趣的链接:

  • 如何embeddedJavaScript的小部件,取决于jQuery到一个未知的环境 (Stackoverflow讨论)
  • 将parameter passing给脚本标记的文章

使用html5 5数据属性的function更好

<script src="widget.html" data-width="200" data-height="200"> </script> 

在脚本文件widget.html中; ,可以通过这种方式获取参数:

 <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> 

我很抱歉回答一个超级老问题,但花了一个小时与上述解决scheme摔跤select简单的东西。

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

里面的脚本里面:

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

比jQuery或URLparsing更容易。

你可能需要从@Yared Rodriguez的IE的doucment.currentScript的polyfil的答案:

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

得到它了。 一种黑客,但它的作品相当不错:

 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]; 

我将脚本标签中的参数作为类传递:

 <script src="widget.html" class="2 5 4"></script> 

这篇文章帮了很多。

如果你正在使用jQuery,你可能要考虑他们的数据方法。

我已经使用了类似于您在回复中尝试的内容,但是像这样:

 <script src="widget.html" param_a = "2" param_b = "5" param_c = "4"> </script> 

你也可以创build一个函数,让你直接抓取GET参数(这是我经常使用的):

 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'); 

JQuery有一种方法可以将参数从HTML传递给javascript:

把这个放在myhtml.html文件中:

 <!-- Import javascript --> <script src="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> 

在同一个目录subscript.js一个subscript.js文件并把它放在那里:

 //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); 

分析结果:

加载myhtml.html页面有'foobar.mp4'打印到屏幕。 名为video_filename的variables是从html传递给javascript的。 JavaScript将其打印到屏幕上,并显示为embedded到父级的HTML中。

jsfiddlecertificate上述工作:

http://jsfiddle.net/xqr77dLt/

感谢jQuery,一个简单的HTML5兼容解决scheme是创build一个额外的HTML标签,如div,来存储数据。

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); }) }); 

现场演示,上面的代码: http : //codepen.io/anon/pen/KzzNmQ?editors=1011#0

在现场演示中,可以将来自HTML5 data- *属性的数据连接并打印到日志中。

来源: https : //api.jquery.com/data/

把你需要的值放在另一个脚本可以检索它们的地方,比如隐藏的input,然后在你初始化你的新脚本的时候,从它们的容器中取出这些值。 你甚至可以把所有的参数作为一个JSONstring放到一个隐藏的字段中。

这是一个非常古老的线索,我知道,但是如果有人在search解决scheme时到达这里,这也可能会有所帮助。

基本上我使用document.currentScript来从我的代码运行的地方得到元素,我使用我正在寻找的variables的名称进行筛选。 我用一个名为“get”的方法来扩展currentScript,所以我们可以通过使用下面的代码获取脚本中的值:

 document.currentScript.get('get_variable_name'); 

通过这种方式,我们可以使用标准的URI来检索variables而不需要添加特殊的属性。

这是最终的代码

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

我忘了IE浏览器:)它不能那么容易…嗯,我没有提到document.currentScript是一个HTML5属性。 它没有被包括在不同版本的IE浏览器(我testing,直到IE11,它还没有)。 对于IE兼容性,我将这部分添加到代码中:

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

我们在这里做的是为IE定义一些替代代码,它返回当前脚本对象,这是解决scheme中从src属性提取参数所需的。 这不是IE的完美解决scheme,因为有一些限制; 如果脚本是asynchronous加载的。 较新的浏览器应该包含“.currentScript”属性。

我希望它有帮助。

另一种方法是使用元标签。 无论什么数据应该传递给你的JavaScript可以像这样分配:

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

然后可以像这样从元标签中提取数据(最好在DOMContentLoaded事件处理程序中完成):

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

绝对没有麻烦与jQuery或喜欢,没有黑客和解决方法必要,并与任何支持元标记的HTML版本工作…