forked from fanruan/fineui
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
4.9 KiB
168 lines
4.9 KiB
/** |
|
* 基本的函数 |
|
* Created by GUY on 2015/6/24. |
|
*/ |
|
BI.Func = {}; |
|
_.extend(BI.Func, { |
|
/** |
|
* 创建唯一的名字 |
|
* @param array |
|
* @param name |
|
* @returns {*} |
|
*/ |
|
createDistinctName: function (array, name) { |
|
var src = name, idx = 1; |
|
name = name || ""; |
|
while (true) { |
|
if (BI.every(array, function (i, item) { |
|
return BI.isKey(item) ? item !== name : item.name !== name; |
|
})) { |
|
break; |
|
} |
|
name = src + (idx++); |
|
} |
|
return name; |
|
}, |
|
|
|
/** |
|
* 获取字符宽度 |
|
* @param str |
|
* @return {number} |
|
*/ |
|
getGBWidth: function (str) { |
|
str = str + ""; |
|
str = str.replace(/[^\x00-\xff]/g, "xx"); |
|
return Math.ceil(str.length / 2); |
|
}, |
|
|
|
/** |
|
* 获取搜索结果 |
|
* @param items |
|
* @param keyword |
|
* @param param 搜索哪个属性 |
|
*/ |
|
getSearchResult: function (items, keyword, param) { |
|
var isArray = BI.isArray(items); |
|
items = isArray ? BI.flatten(items) : items; |
|
param || (param = "text"); |
|
if (!BI.isKey(keyword)) { |
|
return { |
|
find: BI.deepClone(items), |
|
match: isArray ? [] : {} |
|
}; |
|
} |
|
var t, text, py; |
|
keyword = BI.toUpperCase(keyword); |
|
var matched = isArray ? [] : {}, find = isArray ? [] : {}; |
|
BI.each(items, function (i, item) { |
|
// 兼容item为null的处理 |
|
if (BI.isNull(item)) { |
|
return; |
|
} |
|
item = BI.deepClone(item); |
|
t = BI.stripEL(item); |
|
text = BI.find([t[param], t.text, t.value, t.name, t], function (index, val) { |
|
return BI.isNotNull(val); |
|
}); |
|
|
|
if (BI.isNull(text) || BI.isObject(text)) return; |
|
|
|
py = BI.makeFirstPY(text, { |
|
splitChar: "\u200b" |
|
}); |
|
text = BI.toUpperCase(text); |
|
py = BI.toUpperCase(py); |
|
var pidx; |
|
if (text.indexOf(keyword) > -1) { |
|
if (text === keyword) { |
|
isArray ? matched.push(item) : (matched[i] = item); |
|
} else { |
|
isArray ? find.push(item) : (find[i] = item); |
|
} |
|
// BI-56386 这边两个pid / text.length是为了防止截取的首字符串不是完整的,但光这样做还不够,即时错位了,也不能说明就不符合条件 |
|
} else if (pidx = py.indexOf(keyword), (pidx > -1)) { |
|
if (text === keyword || keyword.length === text.length) { |
|
isArray ? matched.push(item) : (matched[i] = item); |
|
} else { |
|
isArray ? find.push(item) : (find[i] = item); |
|
} |
|
} |
|
}); |
|
return { |
|
match: matched, |
|
find: find |
|
}; |
|
}, |
|
|
|
/** |
|
* 获取按GB2312排序的结果 |
|
* @param items |
|
* @param key |
|
* @return {any[]} |
|
*/ |
|
getSortedResult: function (items, key) { |
|
var getTextOfItem = BI.isFunction(key) ? key : |
|
function (item, key) { |
|
if (BI.isNotNull(key)) { |
|
return item[key]; |
|
} |
|
if (BI.isNotNull(item.text)) { |
|
return item.text; |
|
} |
|
if (BI.isNotNull(item.value)) { |
|
return item.value; |
|
} |
|
return item; |
|
}; |
|
|
|
return items.sort(function (item1, item2) { |
|
var str1 = getTextOfItem(item1, key); |
|
var str2 = getTextOfItem(item2, key); |
|
if (BI.isNull(str1) && BI.isNull(str2)) { |
|
return 0; |
|
} |
|
if (BI.isNull(str1)) { |
|
return -1; |
|
} |
|
if (BI.isNull(str2)) { |
|
return 1; |
|
} |
|
if (str1 === str2) { |
|
return 0; |
|
} |
|
var len1 = str1.length, len2 = str2.length; |
|
for (var i = 0; i < len1 && i < len2; i++) { |
|
var char1 = str1[i]; |
|
var char2 = str2[i]; |
|
if (char1 !== char2) { |
|
return BI.CODE_INDEX[char1] - BI.CODE_INDEX[char2] |
|
} |
|
} |
|
return len1 - len2; |
|
}); |
|
} |
|
}); |
|
|
|
_.extend(BI, { |
|
beforeFunc: function (sFunc, func) { |
|
var __self = sFunc; |
|
return function () { |
|
if (func.apply(sFunc, arguments) === false) { |
|
return false; |
|
} |
|
return __self.apply(sFunc, arguments); |
|
}; |
|
}, |
|
|
|
afterFunc: function (sFunc, func) { |
|
var __self = sFunc; |
|
return function () { |
|
var ret = __self.apply(sFunc, arguments); |
|
if (ret === false) { |
|
return false; |
|
} |
|
func.apply(sFunc, arguments); |
|
return ret; |
|
}; |
|
} |
|
}); |