您好我需要创建动态函数,所以我使用以下代码。在这里,我想将对象传递给函数并获取它。我尝试传递javascript数组,它的工作原理,但javascript对象无法正常工作。
<button onclick="mainfunc('funct')">button</button>
<script>
window.funct = function(){
alert(arguments); //alerts object arguments.
alert(arguments.a); //alerts undefined
alert(JSON.stringify(arguments)); //alerts blank object as {}
}
window.mainfunc = function(func){
var args = {"a":"jhgj","b":"hjgh","c":"hghj"};
window[func].apply(this, args);
}
</script>
window.funct = function(){
alert(arguments);
alert(arguments.a);
alert(JSON.stringify(arguments));
}
window.mainfunc = function(func){
var args = {"a":"jhgj","b":"hjgh","c":"hghj"};
window[func].apply(this, args);
}
<button onclick="mainfunc('funct')">button</button>
我正在研究在线航班预订系统。我想创建动态函数来调用从php循环创建的函数。
<?php foreach($flightsegment as $data){ $flightnumber = $data->flightnum; ?>
<li><a href="#fareRules<?= $flightnumber; ?>" data-toggle="tab" onclick="mainfunc('fareRules<?= $flightnumber; ?>', event)">Fare Rules</a></li>
<script>
jQuery(document).ready(function ($) {
window.fareRules<?= $flightnumber; ?> = function () {
// alert(arguments[0].target);
alert(JSON.stringify(arguments));
var params = {};
alert(arguments[1]);
if (arguments[1] > 1) { //there is multiple segment
var segment = arguments[1];
var logical_gap = segment - 1;
var dataobj = {};
for (var o = 2; o < arguments.length; o++) {
alert(arguments[o + 1]);
}
} else { //there is single segment
for (var i = 1; i < arguments.length; i++) {
params[i] = arguments[i];
}
var target = arguments[0];
var url = "<?php echo site_url() . '/action/?type=fairbasisrule' ?>";
var json_upload = "json_name=" + JSON.stringify(params);
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
var data = JSON.parse(this.responseText);
var len = data.length;
// console.log(data);
var html = "";
for (var i = 0; i < len; i++) {
var rules = data[i].rules[0];
html += "<b>" + data[i].title + "</b><br><p>" + rules.replace(/\n/g, '<br/>') + "</p>";
}
$(target).parents("td").find('#fareRules<?= $flightnumber; ?>').html(html);
}
};
xhttp.open("POST", url, true);
xhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
xhttp.send(json_upload);
}
}
});
</script>
<?php } ?>
<script>
window.mainfunc = function (func)
{
if ($(arguments[1].target).parents("td").find('.fair_rule_basiscode').length > 1) {
var vars = {};
vars['target'] = arguments[1].target;
vars['segment_length'] = $(arguments[1].target).parents("td").find('.fair_rule_basiscode').length;
var z = 0;
$(arguments[1].target).parents("td").find('.fair_rule_basiscode').each(function () {
z++;
vars['fair_rule_basiscode' + z] = $(this).text();
});
var z = 0;
$(arguments[1].target).parents("td").find('.fair_rule_departairport').each(function () {
z++;
vars['fair_rule_departairport' + z] = $(this).text();
});
var z = 0;
$(arguments[1].target).parents("td").find('.fair_rule_arrivalairport').each(function () {
z++;
vars['fair_rule_arrivalairport' + z] = $(this).text();
});
var z = 0;
$(arguments[1].target).parents("td").find('.fair_rule_airlines').each(function () {
z++;
vars['fair_rule_airlines' + z] = $(this).text();
});
var z = 0;
$(arguments[1].target).parents("td").find('.fairbasisdepartdate').each(function () {
z++;
vars['fairbasisdepartdate' + z] = $(this).text();
});
args = vars;
} else {
var fair_rule_basiscode = $(arguments[1].target).parents("td").find('.fair_rule_basiscode').text();
var fair_rule_departairport = $(arguments[1].target).parents("td").find('.fair_rule_departairport').text();
var fair_rule_arrivalairport = $(arguments[1].target).parents("td").find('.fair_rule_arrivalairport').text();
var fair_rule_airlines = $(arguments[1].target).parents("td").find('.fair_rule_airlines').text();
var fairbasisdepartdate = $(arguments[1].target).parents("td").find('.fairbasisdepartdate').text();
var args = new Array();
args.push(arguments[1].target);
args.push(fair_rule_basiscode);
args.push(fair_rule_departairport);
args.push(fair_rule_arrivalairport);
args.push(fair_rule_airlines);
args.push(fairbasisdepartdate);
}
window[func].apply(this, args);
}
});
</script>
我的目标是有时会有多个航段。所以我可能需要使用值传递多个参数映射键的多个ajax请求。
答案 0 :(得分:0)
简单的答案是它不起作用。 apply
函数需要一个数组作为第二个参数,如果你给它别的东西就会失败。如果你真的必须解析一个对象并按照字母顺序应用它的属性,就像你拥有它们一样,你可以这样做。
var args = {"a":"jhgj","b":"hjgh","c":"hghj"};
window[func].apply(this, Object.keys(args).sort().map(function (key) {
return args[key];
}));
如果你能支持es6那么你可以缩短它。
var args = {"a":"jhgj","b":"hjgh","c":"hghj"};
window[func].apply(this, Object.keys(args).sort().map(key => args[key]));
Object.keys(args)
以对象的形式返回对象上所有键的数组:['a','b','c']
。
.sort()
将返回一个按字母顺序排序的新数组,因为JS objects do not guarantee property order.
.map(key => args[key])
迭代数组并使用每次迭代的返回值创建一个新数组。在这种情况下,我们返回要作为参数传递的值。
这可以保证您获得一个只包含对象值的新数组,按原始对象键的字母顺序排列。