我得到了一个可以通过网络界面控制的嵌入式系统。
页面如下:
...
<a href="javascript:foo(bar)">foo</a>
...
有没有办法只通过http来调用这个函数?像
http://<the-devices-ip>:80/javascipt:foo(bar) //wrong
谢谢
答案 0 :(得分:7)
您可以通过将查询字符串或散列传递到URL并执行一段JS来执行此操作,该片段在onload期间检查它。
var query = window.location.search; // Gets '?foo=bar' from http://example.com/page.html?foo=bar
var hash = window.location.hash; // Gets '#foo' from http://example.com/page.html#foo
您只需要自己进一步解析或使用具有插件功能的第三方JS框架,例如jQuery。
答案 1 :(得分:3)
page1.html:
<a href="page2.html#foo('hello world')">foo</a>
page2.html:
<script type="text/javascript">
if(window.location.hash)
eval(window.location.hash)
</script>
我不是说这是个好主意。记录您认为需要执行此操作的原因可能会有所帮助,可能有更好的方法来实现实际目标。
请注意,执行此操作不允许您传递变量。您需要在page2.html上执行的javascript代码中只有静态值,或者动态生成page1.html中的href。
答案 2 :(得分:2)
警告:这可能会打开您的代码以进行HTML和/或脚本注入。严格过滤。
我最近不得不为我承包的项目做类似的事情。像其他人一样,我使用URL的哈希部分来传递JavaScript函数和参数。但是,主要区别在于我没有对整个字符串进行简单的eval
。我建立了一种特定的格式,1)缩小可执行的函数数量,2)清理方法所需的任何输入
格式完整如下:
http://somedomain.tld/path/?query=blah#specific.controller.object/method/['array', 'of', {json: 'arguments'}]
所以,基本上,你最终得到以下字符串:
specific.controller.object/method/['array', 'of', {json: 'arguments'}]
然后我写了一个解析器来处理这个字符串。可以通过在某种“命名空间”对象前加上来调用可以调用的对象的限制,换句话说,将其作为现有预定静态对象的成员的一部分进行调用。例如,specific.controller.object
将被称为new com.project.specific.controller.object();
。这与我的解析器类似:
var data = location.hash.substr(1).split('/'),
controller = ("my.namespace." + data[0]).split("."),
// You can provide a default method if you want, my framework used `show`
method = data[1] || "show",
// must be an array for use with `apply`
params = data[2] || "[]";
// Parse the controller to find the appropriate object to instantiate.
// All objects are in reference to the global window object. Break
// them apart by their dot composition and step down through the object
// tree starting at window.
var composition = window;
for ( var i=0; i<controller.length; i++ ) {
composition = composition[ controller[i] ];
}
var obj = new composition;
// Handle the parameters. It may be the case that there "/" is present
// in the last argument. If so, add anything that was left out.
if ( data.length > 3 ) {
for ( var i=3; i<data.length; i++ ) {
params += '/' + data[i];
}
}
// Convert params from a string to an array.
// ***Possible injection point here***
params = dojo.fromJson(params);
// Make sure that the method runs in the proper context and
// pass it all of the parameters
obj[method].apply(obj, params);
由于解析器的工作方式,如果不需要,您需要提供参数,在某些情况下,如果您选择允许默认方法,则不必指定要调用的对象上的哪个成员,这极大地简化了这些URL的构建。
不使用静态命名空间对象来限制可以实例化的对象,使用安全对象和方法的白名单将是微不足道的。
答案 3 :(得分:1)
<a href="javascript:foo(bar)">foo</a>
表示调用函数,而不是调用url。 url和JavaScript函数之间没有直接映射。