如何将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上述工作:
感谢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版本工作…