我正在构建一个调查工具,它将具有不同的布局和“审问”流程,具体取决于用户响应的部分和实际问题。我在Coldfusion中构建它,我使用jQuery UI元素来呈现问题,但是这会导致ui元素嵌入到ui元素中。
构造或触发UI元素的顺序将与它们在html中呈现的顺序相反,因此必须首先触发最内层元素。有一个母版页,其中包含查找数据库以查找问题信息和要使用的特定页面布局的逻辑,然后<cfinclude'd
,此布局页面可能会显示表格UI元素
我的解决方案是声明一组UI html节点名称(DIV标签)以及UI构造方法。然后,每个包含的元素将其UI信息“推送”到此数组中。
var inst_triggers = new Array()
inst_triggers.push("#accordion@@accordion()")
最后,当所有内容都已组合时,我需要触发这些UI元素,因此在母版页中我会执行以下操作。
$(function() {
var it = inst_triggers.reverse();
var it_len = it.length;
for (e=0;e<it_len;e++){
var trig_parts = it[e].split('@@');
//do the jQuery UI element trigger here
var eval_str = '$("'+trig_parts[0]+'").'+trig_parts[1];
eval(eval_str);
}
});
我们知道“eval()”是邪恶的,所以我需要一个替代方法来触发或构建这些页面元素
像jQuery.uistuff.method('accordion')
这样的东西,但我在文档中看不到这一点(或者至少我还没理解我读过的内容更有可能)
任何建议,指示进一步阅读或参考将非常感激。
提前感谢集体神经网络!
Gus
答案 0 :(得分:1)
鉴于您发布的方法,我不确定您为什么使用@@并拆分它以确定您的组件。您可以轻松地将对象推送到“inst_triggers”数组:
var inst_triggers = [];
inst_triggers.push({selector:"#accordion", method: "accordion"});
$(function() {
var it = inst_triggers,
it_len = it.length;
it.reverse()
for ( e=0; e < it_len; e++ ) {
$(it[e].selector)[it[e].method]();
}
});
答案 1 :(得分:0)
您可以查看jQuery UI的Developer's Guide,尤其是jQuery.fn
部分。基本上,所有jQuery小部件都在jQuery.fn
下使用命名空间。所以,这意味着
$('#accordion').accordion(options);
相当于
$.fn['accordion'].call($('#accordion'), options);
和
$.fn['accordion'].apply($('#accordion'), [options]);
我不确定我的解决方案是否比bstakes更好,但它是另一种选择。最重要的是,避免使用邪恶的eval()
。