/*
* 树形(jTree)插件
* 江鸿宾(QQ33080907)
* 最近修改:2019.09.02
* 本插件只用于作者参与的项目,未经许可请勿转载
*/
// select示例:
// 注意:必须存在一个父类为0的节点
(function ($) {
'use strict'
// 追加chosen插件所用CSS
$('head').append('')
// 重置AmazeUI样式
// $('head').append('')
$.fn.jTreeSelect = function (options) {
var defaults = {
all: false, // 是否插入[不限]选项
parid: null // 祖先节点ID,不传的话需要手工制定一个父类为0的节点
}
// 调用时的参数覆盖默认参数
var opts = $.extend(defaults, options)
var tree = []
var deep = 0
var title = ''
var $this
return this.each(function () {
// 如果只有一个子节点则不应用插件
if ($(this).children().length > 1) {
// jQuery对象
$this = $(this)
// DOM对象
var theselect = $this.get(0)
// 追加class方便控制css
$this.addClass('jtree')
// 选中项的的值
var selectid = $('option[selected]', $this).length === 0 ? '' : $('option[selected]', $this).val()
// 存入数组
$this.children().each(function () {
if (opts.parid !== null) {
tree.push($(this).val() + '|' + ($(this).val() === opts.parid.toString() ? 0 : $(this).data('pid')) + '|' + $(this).text())
}
else {
tree.push($(this).val() + '|' + $(this).data('pid') + '|' + $(this).text())
}
})
// 清空原有option
$this.empty()
// 转换为仿二维数组(0当前id,1父id,2名称,3是否兄弟节点最后一个)
$.each(tree, function (i) { tree[i] = tree[i].split('|') })
// console.log(tree)
// 每一行增加一列表明该节点是否为最后一个
$.each(tree, function (i) { tree[i][3] = islast(tree[i][0], tree[i][1]) })
// 显示(第一个参数是DOM对象)
showtree(0)
// 插入[不限]选项
if (opts.all) { $this.prepend('') }
// 初始选中
if (selectid !== '') {
position(selectid)
theselect.value = selectid
theselect.title = title
}
else if (opts.all) { theselect.selectedIndex = 0 }
}
})
// 显示
function showtree(id) {
$.each(tree, function (i) {
if (tree[i][1].toString() === id.toString()) {
deep++
// 构造option的text
var text = ''
for (var j = deep - 2; j > 0; j--) { text += parentislast(tree[i][0], j) ? ' ' : '┃' }
if (deep > 1) { text += tree[i][3] ? '┗ ' : '┣ ' }
text += tree[i][2]
// 新增一项option
$this.append('')
showtree(tree[i][0])
deep--
}
})
}
// 判断当前节点是否是其父节点的最后一个
function islast(id, pid) {
// N表示当前节点,M表示下一个节点
var n = 0
var m = 0
for (var i = 0; i < tree.length; i++) {
if (tree[i][1] === pid) {
if (tree[i][0] === id) { n = i }
else { m = i }
if (m > 0 && n > 0 && m > n) { return false }
}
}
return true
}
// 判断当前节点的父节点是否是最后一个
function parentislast(id, deep) {
var i, j
var pid = id
for (j = deep; j > 0; j--) {
for (i = 0; i < tree.length; i++) {
if (tree[i][0] === pid) {
pid = tree[i][1]
break
}
}
}
for (i = 0; i < tree.length; i++) {
if (tree[i][0] === pid) { return tree[i][3] }
}
}
// 获取完整路径文字
function position(id) {
if (id) {
$.each(tree, function (i) {
if (tree[i][0].toString() === id.toString()) {
if (title === '') { title = tree[i][2] }
else { title = tree[i][2] + ' → ' + title }
position(tree[i][1])
}
})
}
}
}
})(jQuery)