什么是在javascript / jQuery中实现以下目的的有效(且用户友好)方式?

依靠文件的mime类型,应执行回调。回调是由开发人员定义的,方法是提供带有可选通配符(例如text / javascript,text / *,* / *)的mime类型描述和回调本身。必须以指定的顺序将声明的类型与文件的给定mime-type相匹配。例如,text / plain必须比text / *具有更高的优先级。

这里有一些想法:

使用一个简单的对象

var handler = {
 'text/javascript' : callback0,
 'text/*' : callback1
}


这将是最直观的解决方案,但不能保证订购。

维护两个清单

var order = ['text/javascript', 'text/*'];
var handler = [callback0, callback1];


如果类型多于两种或三种,并且您使用匿名函数作为回调,则将很难维持这种状态。

通过将回调包装到对象中来添加索引

var handler = {
  'text/javascript' : {index: 0, callback0},
  'text/*' : {index: 1, callback1}
};


...在开始插入项目时更改成千上万的索引属性。

使用数组数组
var handler = [
  ['text/javascript', callback0],
  ['text/*', callback1]
];


我可能比其他人更友好,但是如果不迭代元素就无法直接访问已知的mime类型(这很不错)。

因此,有一些方法可以做我想要的事情,但是正确的方法是什么(为什么)?也许有人有模式?

最好,
哈克牛排

最佳答案

我将使用“简单对象”解决方案,并将订单数组形成“维护两个列表”解决方案。

用代码块遍历order数组,该代码块使用handler简单对象执行某些操作,该操作可能会中断循环或继续进行下一个循环迭代。

编辑以回应评论

我同意你的评论。我会做这样的事情,使其只是一个变量:

var handlers = {
  handler: {
    'text/javascript': callback0,
    'text/*': callback1
  },
  order: ["text/javascript", "text/*"]
};


尽管我会为handlers变量和/或handlers.handler属性选择更好的名称。

对另一条评论的另一种回应

也许您应该一次修改handlers.handlerhandlers.order一种模仿类型:

var handlers = { handler: {}, order: [] }; // initialize as empty

// add 'text/javascript' mime type
handlers['text/javascript'] = callback0;
handlers.order.push('text/javascript');

// add 'text/*' mime type
handlers['text/*'] = callback1;
handlers.order.push('text/*');


该方法有点重复,但是将来应该易于维护。如果需要,可以编写一个函数,将一个新属性添加到handlers.handler并将一个新的mime类型附加到handlers.order

10-08 12:00