我从jquery的json调用中收到一些'body'内容,在那里我可以通过执行以下操作返回唯一的javascript元素:
script_element = $(data.body)[1]
这相当于:
<script type="text/javascript">
updater('foo', 'bar', {}, '0', constant='');
</script>
因此,typeof script_element
会返回"object"
而且,如果我运行script_element.innerText
,我可以得到:
updater('foo', 'bar', {}, '0', constant='');
收到此脚本后,我现在正在做的就是在其上运行eval
,但搜索我无法运行eval
更改函数调用参数。< / p>
我要做的是更改调用的third
参数,在这种情况下是{}
,可以根据json调用的返回而改变,所以我不能只需搜索{}
。
我也可以做script_element.text.split(',')[2]
例如,并动态更改此文本,但我认为应该有更好的方法来做到这一点。
我不知道javascript是否可以识别和处理“未来的方法调用”,但仍然认为应该有更好的方法。
有什么想法吗?
答案 0 :(得分:5)
你可以做的是遮蔽函数,以便能够改变第三个参数。你应该在获取JSON之前定义该阴影函数。
var originalUpdater = updater; // keep old function to call
// overwrite (shadowing)
updater = function(a, b, c, d, e) {
// change c appropriately here
originalUpdater(a, b, c, d, e);
}
然后你仍然只能eval
它(这不是很安全,但如果我没有误,那不是你的意思),它会调用阴影函数。
更通用的阴影方法将遵循:
var originalUpdater = updater; // keep old function to call
// overwrite (shadowing)
updater = function() {
// change arguments[2] appropriately here
originalUpdater.apply(this, arguments);
}
答案 1 :(得分:3)
更改服务器。而不是返回
<script type="text/javascript">
updater('foo', 'bar', {}, '0', constant='');
</script>
返回
{
"method": "updater",
"params": [
"foo", "bar", {}, "0", ''
]
}
答案 2 :(得分:2)
假设您无法更改从服务器发送的内容,您只需使用正则表达式运行innerText
并在插入之前传递更新HTML。
var replacer = /\w+\(([^()]+)\)/gi;
script_element.innerText.replace(replacer, function(matched_text, func_params){
var orig_func_params = func_params;
// Make changes to func_params here.
return matched_text.replace(orig_func_params, func_params);
});
通过执行以下操作可以实现此功能:
var replacer = /\w+\(([^()]+)\)/gi;
function replace_arg(script_element, arg_index, replacement_value) {
script_element.innerHTML = script_element.innerHTML.replace(replacer,
function(matched_text, func_params){
var orig_func_params = func_params;
func_params = func_params.split(",");
if (arg_index >= func_params.length) {
throw new RangeError(arg_index + " is out of range. Total args in function:" + func_params.length);
}
func_params[arg_index] = JSON.stringify(replacement_value);
return matched_text.replace(orig_func_params, func_params.join(","));
});
return script_element;
}
可以这样调用:
script_element = replace_arg(script_element, 3, {"new":"arg"});
答案 3 :(得分:0)
我不明白你在做什么,但一般来说,如果你不想依赖参数的顺序,那么使该函数采用一个参数,该参数是一个属性为参数的对象:
function add(params) {
var a = params.hasOwnProperty("paramA") ? params.paramA : 0;
var b = params.hasOwnProperty("paramB") ? params.paramB : 0;
return a + b;
}
add({paramA: 1, paramB: 2});
在这种情况下,您应该使用hasOwnProperty来检查函数是否在尝试访问之前传递了您要查找的参数。