基于阵列构建交换机
Build a switch based on array
我想根据我从查询字符串创建的数组创建一个Javascript开关。我不知道如何进行。
假设我有一个这样的数组:
var myArray = ("#general","#controlpanel","#database");
我想创建这个...
switch(target){
case "#general":
$("#general").show();
$("#controlpanel, #database").hide();
break;
case "#controlpanel":
$("#controlpanel").show();
$("#general, #database").hide();
break;
case "#database":
$("#database").show();
$("#general, #controlpanel").hide();
break;
}
myArray 可以包含任意数量的元素,因此我希望根据数组的长度动态创建开关。default
的情况始终是第一选择。
该数组是从带有正则表达式的 location.href 创建的,以仅提取我需要的内容。
多谢!
@Michael有正确的一般答案,但这里有一个更简单的方法来实现相同的目标:
// Once, at startup
var $items = $("#general,#controlpanel,#database");
// When it's time to show a target
$items.hide(); // Hide 'em all, even the one to show
$(target).show(); // OK, now show just that one
如果你真的只有一个选择器数组,那么你可以通过以下方式创建一个jQuery集合:
var items = ["#general","#controlpanel","#database"];
var $items = $(items.join(','));
哦,还有"谢谢,很多!":)
我想你想要一个对象。只需使用要匹配的元素名称定义键,并将函数作为值。例如
var switchObj = { "#general":函数 () { $("#general").show(); $("#controlpanel, #database").hide(); }, "#controlpanel":函数 () { $("#controlpanel").show(); $("#general, #database").hide(); }, "#database":函数 () { $("#database").show(); $("#general, #controlpanel").hide(); } }
然后你可以打电话给你想要的那个
switchObj[target]();
当然:如果您需要对每个元素做明确不同的事情,并且与其他答案不同,它侧重于问题的明确主题是什么,而不是OP试图用所述数据结构完成什么,那么这个解决方案会更好。
您需要两个语句,而不是switch
:第一,显示选定的目标,第二条隐藏所有其他目标。
// Array as a jQuery object instead of a regular array of strings
var myArray = $("#general,#controlpanel,#database");
$(target).show();
// Loop over jQuery list and unless the id of the current
// list node matches the value of target, hide it.
myArray.each(function() {
// Test if the current node's doesn't matche #target
if ('#' + $(this).prop('id') !== target) {
$(this).hide();
}
});
实际上,第一个语句可以合并到循环中。
var myArray = $("#general,#controlpanel,#database");
myArray.each(function() {
if ('#' + $(this).prop('id') !== target) {
$(this).hide();
}
else {
$(this).show();
}
});
也许你正在寻找这样的东西?使用您正在使用的元素填充myArray
。
var myArray = ["#general","#controlpanel","#database"];
var clone = myArray.slice(0); // Clone the array
var test;
if ((test = clone.indexOf(target)) !== -1) {
$(target).show();
clone.splice(test,1); // Remove the one we've picked up
$(clone.join(',')).hide(); // Hide the remaining array elements
}
在这里你不需要显式列出所有的情况,只需让数组定义它们。 但请确保该目标存在于数组中,否则您将需要一个 if 语句。
var target = "#controlpanel";
var items = ["#general","#controlpanel","#database"];
items.splice($.inArray(target, items), 1);
$(target).show();
$(items.join(",")).hide();
items.push(target);
相关文章:
- 我应该如何从xml文件构建一个javascript页面
- 如何在DOM元素上按类型构建此函数
- Sencha Touch构建-排除文件
- RubyonRails——构建交互式接口应该朝哪个方向发展
- 如何在构建node-webkit应用程序后获取外部资源
- Ext.js从json构建模型关系的问题
- 如何为生产构建angular2应用程序
- Grunt构建导致Angular应用程序在dist上崩溃
- 构建JS测试,警报窗口重复上一个Q,而不是问下一个Q
- 动态构建一个数据表与scriplets
- 如何只使用特定的表行构建简单的手风琴
- 为tweet构建chrome扩展
- 如何构建angular.js应用程序
- 如何使用Meteorjs构建实时应用程序
- jquery从2个json字符串构建一个复选框表单
- webpack开发模式和生产构建模式之间有什么区别
- js文件是否阻碍了war文件的构建
- 如何在Javascript中从select标记的一系列选项中构建二维数组
- 如何使用angularjs构建交互式滚动着陆页
- 基于阵列构建交换机