如何将参数传递给 Script 标签?

IT技术 javascript parameters widget xss script-tag
2021-02-10 23:37:07

我阅读了教程DIY widgets - How to embed your site on another site for XSS Widgets by Dr. Nic。

我正在寻找一种将参数传递给脚本标记的方法。例如,要进行以下工作:

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

有没有办法做到这一点?


两个有趣的链接:

6个回答

我很抱歉回答了一个超级老问题,但在花了一个小时与上述解决方案搏斗后,我选择了更简单的东西。

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

在上面的脚本中:

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

比jquery OR url解析容易得多。

您可能需要来自@Yared Rodriguez 对 IE 的回答中的 doucment.currentScript 的 polyfil:

document.currentScript = document.currentScript || (function() {
  var scripts = document.getElementsByTagName('script');
  return scripts[scripts.length - 1];
})();
polyfill 不再工作, document.currentScript 是只读的,如果它已经存在则无法分配。也许一个不同的检查,比如 if(!document.currentScript) { *** the polyfill function *** } 会更好
2021-03-17 23:37:07
@RichardFox 感谢您的回答,但不得不评论“不回答原始问题:不使用 path/to/widget.js”可能是我整周读过的最有趣的事情!不敢相信你回答得这么好。
2021-03-23 23:37:07
我很抱歉大卫,我总是使我的答案通用,以便其他人可以使用该解决方案,而无需将初始实施细节添加到问题中。在我上面的示例中,您可以看到src="..."这意味着,任何 src,都无关紧要 :)
2021-03-25 23:37:07
@fadomire 一个真正的 polyfill 应该在 polyfill 之前检查是否存在。只需将其包装成类似的东西: if(!document.currentScript) {...}
2021-04-02 23:37:07
请注意,currentScript 在 IE 中不起作用。细节
2021-04-04 23:37:07

最好在 html5 5 数据属性中使用功能

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

在脚本文件http://path.to/widget.js 中,您可以通过这种方式获取参数:

<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>
如果您异步加载脚本,那么使用 ID 是我推荐的唯一可靠选项。谢谢@Thunderforge ...此外,任何程序员都应该避免在没有适当的冲刺计划的情况下重构代码,而该计划由对正在发生的事情有线索的人进行概述;)
2021-03-23 23:37:07
如果您团队中的其他程序员不知道您使用了这个 ID,那么如果该 ID 被更改了怎么办?
2021-03-31 23:37:07
如果 id="myAwesomeWigretNo1" 不总是那样,但是myAwesomeWigretNo2, 或者myAwesomeWigretNo681??? 我该如何解决这个问题以接受一个真实的变量?
2021-04-02 23:37:07
对于它的value,还有其他方法可以引用脚本,例如document.currentScript(仅适用于不在自己文件中的脚本)并id<script>标签放置一个,然后通过它找到它。
2021-04-07 23:37:07
当然你可以要求开发人员有很强的道德规范,但从长远来看它不会起作用......人们会忘记东西......在一个好的软件设计中,每个块都被隔离, awesome-pixels.tumblr.com/post/101930002170 /... en.wikipedia.org/wiki/SOLID_(object-oriented_design) 所以我不认为这是一个好还是坏的解决方案,只是维护 ID 和不维护 ID 更复杂:-) 你不打算这样做吗?加载脚本异步我认为没有理由使用 ID 加载
2021-04-09 23:37:07

知道了。有点像黑客,但效果很好:

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="http://path.to/widget.js" class="2 5 4"></script>

这篇文章很有帮助。

类应该用于样式元素而不是传递参数。
2021-03-16 23:37:07
文章太棒了!
2021-03-29 23:37:07
@kspacja 是的,HTML 应该只包含没有样式的内容,除非我们必须为浮动和列布局精确地排列 DIV 标签,因为 CSS 实际上无法完成这项工作,我们在某种程度上可以接受。走开,我说。但是如果你想避免冲突或者你是那种失眠的人,你可以使用“数据-”属性。
2021-04-12 23:37:07

另一种方法是使用元标记。任何应该传递给 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 版本一起使用...

我认为这种方法是迄今为止最简单的方法。它就像一个魅力,给了我我需要的东西。好问题和绝妙的解决方案!
2021-03-17 23:37:07
我认为在每个参数的 <script> 之前需要一行是笨拙的。我们需要一个新的标准特性。
2021-03-21 23:37:07

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

把它放在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>

在同一目录中创建一个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 的变量从 html 传递到 javascript。Javascript 将其打印到屏幕上,并且显示为嵌入到父级的 html 中。

jsfiddle 证明上述方法有效:

http://jsfiddle.net/xqr77dLt/