我们之前已经记录了两种多项关联的交互方式,标签和列表
Bootstrap框架—-多项关联—标签式选择
Bootstrap框架—-多项关联—列表选择
本章记录第三种多项关联的交互–check选择,适用于中等数量的多项关联。
我们在之前的文章中已经在SpringMVC基础框架的基础上应用了BootStrap的后台框架,在此基础上记录 check选择。
应用bootstrap模板
基础项目源码下载地址为:
SpringMVC+Shiro+MongoDB+BootStrap基础框架
我们在基础项目中已经做好了首页index的访问。
现在就在index.jsp页面和index的路由Controller上做修改,实现 check选择,传给后台保存成List用法。
关键代码
html代码
<div class="row">
<div class="col-md-12">
div>
<div class="col-md-12" style="margin-top: 20px">
div>
div>
-- /. ROW -->
js代码
<script type="text/javascript">
//基础函数开始
/**
* 基础封装函数
*/
var _fnObjectGetPropertyChainValue = function(obj, propertyChain) {
/* 获取属性链的值 */
if (!obj) return;
if (!propertyChain) return obj;
var property,
chains = propertyChain.split('.'),
i = 0,
len = chains.length;
for (;
(property = chains[i]) && i < len - 1; i++) {
if (!obj[property]) return;
obj = obj[property];
}
return obj[property];
},
_fnObjectSetPropertyChainValue = function(obj, propertyChain, value, allowMulti) {
/* 设置属性链的值 */
if (!obj || !propertyChain) return;
var property,
chainObj = obj,
chains = propertyChain.split('.'),
i = 0,
len = chains.length;
for (;
(property = chains[i]) && i < len - 1; i++) {
if (!chainObj[property]) {
chainObj[property] = {};
}
chainObj = chainObj[property];
}
// 改进版:checkbox的多选可以组合为数组
if (!allowMulti || chainObj[property] === undefined) {
chainObj[property] = value;
} else {
var pv = chainObj[property];
if ($.isArray(pv)) {
pv.push(value);
} else {
chainObj[property] = [pv, value];
}
}
return obj;
};
/**
* 格式化字符串 第一个参数为格式化模板 format('this is a {0} template!', 'format');
* format('this is a {0.message} template!', { message: 'format'}); 等同于
* format('this is a {message} template!', { message: 'format' });
*/
$.format = function() {
var template = arguments[0],
templateArgs = arguments,
stringify = function(obj) {
if (obj == null) {
return '';
} else if (typeof obj === 'function') {
return obj();
} else if (typeof obj !== 'string') {
return JSON.stringify ? JSON.stringify(obj) : obj;
}
return obj;
};
return template.replace(/\{\w+(\.\w+)*\}/g, function(match) {
var propChains = match.slice(1, -1).split('.');
var index = isNaN(propChains[0]) ? 0 : +propChains.shift();
var arg, prop;
if (index + 1 < templateArgs.length) {
arg = templateArgs[index + 1];
while (prop = propChains.shift()) {
arg = arg[prop] == null ? '' : arg[prop];
}
return stringify(arg);
}
return match;
});
};
/**
* jQuery form 扩展获取数据
*/
$.fn.formGet = function(opts) {
opts = $.extend({}, opts);
var data = {},
els = opts.formGroup ? this.find('[form-group="' + opts.formGroup + '"]') : this.find('[name]');
if (!els || !els.length) {
return data;
}
var fnSetValue = (function(emptyToNull) {
return emptyToNull ? function(obj, propertyChain, value, allowMulti) {
value !== '' && _fnObjectSetPropertyChainValue(obj, propertyChain, value, allowMulti)
} : _fnObjectSetPropertyChainValue
})(opts.emptyToNull);
els.each(function() {
var $this = $(this),
type = $this.attr('type'),
name = $this.attr('name'), // 可能为属性链
tag = this.tagName.toLowerCase();
if (tag == 'input') {
if (type == 'checkbox') {
var v = $(this).val();
if (v == 'on' || !v) {
fnSetValue(data, name, $(this).prop('checked'));
} else {
$(this).prop('checked') && fnSetValue(data, name, v, true);
}
} else if (type == 'radio') {
this.checked && fnSetValue(data, name, $this.val());
} else {
fnSetValue(data, name, $.trim($this.val()));
}
} else if ('|select|textarea|'.indexOf('|' + tag + '|') > -1) {
fnSetValue(data, name, $this.val());
} else {
fnSetValue(data, name, $.trim($this.text()));
}
});
return data;
};
/**
* jQuery form 扩展绑定数据
*
*/
$.fn.formSet = function(data, formGroup) {
var els = formGroup ? this.find('[form-group="' + formGroup + '"]') : this.find('[name]');
if (!els || !els.length) {
return this;
}
els.each(function() {
var $this = $(this),
type = $this.attr('type'),
name = $this.attr('name'),
tag = this.tagName.toLowerCase();
var value = _fnObjectGetPropertyChainValue(data, name);
if (tag == 'input') {
if (type == 'checkbox') {
var v = $(this).val();
if (v == 'on' || !v) {
this.checked = value ? 'checked' : '';
} else {
this.checked = $.isArray(value) && value.indexOf(v) > -1 ? 'checked' : ''
}
} else if (type == 'radio') {
this.checked = $this.val() == String(value) ? 'checked' : '';
} else {
$this.val(value);
}
} else if ('|select|textarea|'.indexOf('|' + tag + '|') > -1) {
$this.val(value);
} else {
$this.html(value);
}
});
return this;
};
//基础函数结束
$(function(){
$('#btnSave').click(function(){
$(this).button('loading');
var arr = [];
$('#form_associate div.row').each(function(){
arr.push($(this).formGet());
});
console.log(arr);
$.ajax({
type: "POST",
url: "/channel/save?id=" + ${channel.id},
contentType: "application/json",
data: JSON.stringify(arr),
success: function (result) {
console.log(result);
if (!result.code) {
location.href = '/'
}else{
alert(result.msg);
}
},
error: function (result) {
alert("出错了,请稍后重试");
}
});
});
});
script>
完整的jsp代码如下:
<%@ include file="./include/header.jsp"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="cf" uri="com.data.web.view.function" %>
"page-wrapper">
"page-inner">
class="row">
class="col-md-12">
class="page-header">
多项关联 check选择
class="row">
class="col-md-12">
class="col-md-12" style="margin-top: 20px">
<%@ include file="./include/footer.jsp"%>