通过url调用JS函数

时间:2009-11-08 19:08:12

标签: javascript

我得到了一个可以通过网络界面控制的嵌入式系统。

页面如下:

...
<a href="javascript:foo(bar)">foo</a>
...

有没有办法只通过http来调用这个函数?像

http://<the-devices-ip>:80/javascipt:foo(bar) //wrong

谢谢

4 个答案:

答案 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函数之间没有直接映射。