当前位置:   article > 正文

若依ruoyi框架html部分实现onclick多选,及追加元素(有点乱,给自己看)_若依onclick多个参数

若依onclick多个参数

只针对若依框架的html部分代码:

想要的效果,选中多选项,实现指定元素节点的新增(各种方式实现都不理想,只能自己一点点拼了):

 

 

效果:

移除:

 

 

 

代码:  复制指定节点(页面初始化生成的被隐藏的节点,id为 div_replace_id);遍历验证新增节点各项元素数值;提交时获取新增节点下的所有数据,封装为json字符串 。复制的节点被bootstrap进行了二次编码,所以js里对被复制节点代码做了各种自定义删减

  1. <!DOCTYPE HTML>
  2. <html lang="zh" xmlns:th="http://www.thymeleaf.org">
  3. <meta charset="utf-8">
  4. <head th:include="include :: header"></head>
  5. <body class="white-bg">
  6. <div class="wrapper wrapper-content animated fadeInRight ibox-content">
  7. <form class="form-horizontal m" id="form-boomWorkTask-add" th:object="${merchantOrder}">
  8. <input id="merchantOrderId" name="merchantOrderId" class="form-control" type="hidden" th:value="*{merchantOrderId}">
  9. <input id="merchantOrderTitle" name="merchantOrderTitle" class="form-control" type="hidden" th:value="*{merchantOrderTitle}">
  10. <input id="channelsJson" name="channelsJson" class="form-control" type="hidden">
  11. <div class="form-group">
  12. <label class="col-sm-3 control-label">任务类型:</label>
  13. <div class="col-sm-8">
  14. <input id="taskType" name="taskType" type="hidden" value="1">
  15. <span id="taskTypeSpan" name="taskTypeSpan" th:each="dict:${@dict.getType('boom_task_type')}" th:class="${dict.dictValue == '1' ? ' badge badge-success taskTypeSpan ' : 'badge badge-default taskTypeSpan '}" th:text="|&nbsp;&nbsp;&nbsp;${dict.dictLabel}&nbsp;&nbsp;&nbsp;|" th:value ="${dict.dictValue}" th:onclick="selectTaskTypeSpan(this,[[${dict.dictValue}]])" style="margin: 0.5rem;padding: 0.8rem;font-size:12px;cursor:pointer;"/>
  16. </div>
  17. </div>
  18. <div class="form-group">
  19. <label class="col-sm-3 control-label">类目:</label>
  20. <div class="col-sm-4">
  21. <select name="dictCategoryKV" id="dictCategoryKV" th:with="dictList=${@dict.getType('talent_category')}" class="selectpicker" title="请选择类目" data-live-search="true" >
  22. <option th:each="dict : ${dictList}" th:text="${dict.dictLabel}"
  23. th:value="|${dict.dictValue},${dict.dictLabel}|"></option>
  24. </select>
  25. </div>
  26. <label class="dictCategoryKVTip" style="color:#ef392b;"></label>
  27. </div>
  28. <!--
  29. 下拉检索渠道
  30. <div class="form-group">
  31. <label class="col-sm-3 control-label">渠道:</label>
  32. <div class="col-sm-8">
  33. <select name="dictChannelKV" id="dictChannelKV" th:with="dictList=${@dict.getType('talent_channel')}" class="selectpicker" multiple title="请选择渠道" data-live-search="true" >
  34. <option th:each="dict : ${dictList}" th:text="${dict.dictLabel}"
  35. th:value="|${dict.dictValue},${dict.dictLabel}|"></option>
  36. </select>
  37. </div>
  38. <label class="dictChannelKVTip" style="color:#ef392b;"></label>
  39. </div>
  40. -->
  41. <div class="form-group">
  42. <label class="col-sm-3 control-label">渠道:</label>
  43. <div class="col-sm-8">
  44. <span th:each="dict:${@dict.getType('talent_channel')}" th:id ="'channelsSpan_'+${dict.dictValue}" th:class="${dict.dictValue == '1' ? ' badge badge-success channelsSpan ' : 'badge badge-default channelsSpan '}" th:text="|&nbsp;&nbsp;&nbsp;${dict.dictLabel}&nbsp;&nbsp;&nbsp;|" th:value ="${dict.dictValue}" th:onclick="selectChannelSpan(this,[[${dict.dictValue}]],[[${dict.dictLabel}]])" style="margin: 0.5rem;padding: 0.8rem;font-size:12px;cursor:pointer;"/>
  45. </div>
  46. </div>
  47. <!--
  48. 原多选方式(弃用)
  49. <div class="form-group">
  50. <label class="col-sm-3 control-label">渠道:</label>
  51. <div class="col-sm-9">
  52. <label th:each="dict:${@dict.getType('talent_channel')}" class="check-box" onclick="addText(this)">
  53. <input id="channelsKVArray" name="channelsKVArray" type="checkbox" th:value="|${dict.dictValue}@${dict.dictLabel}|" th:text="${dict.dictLabel}">
  54. </label>
  55. </div>
  56. </div>
  57. -->
  58. <div class="form-group">
  59. <label class="col-sm-3 control-label">各渠道内容:</label>
  60. <div class="col-sm-8">
  61. </div>
  62. </div>
  63. <hr width="70%"/>
  64. <!-- 渠道池 -->
  65. <div id="push_channels">
  66. <!-- 隐藏节点(追加渠道时复制此节点) start -->
  67. <div id="div_replace_id" class="div_replace_base" hidden>
  68. <div class="form-group">
  69. <label class="col-sm-3 control-label"></label>
  70. <div class="col-sm-8">
  71. <input id="channelName" class="" hidden th:value="渠道名">
  72. <label style="margin-top: 9px;font-size: 16px;font-weight: bold;">渠道名:</label>
  73. <label style="color: red;font-size: 16px;float: right;cursor:pointer;" title="删除" onclick="removeChannel('div_replace_id')">&nbsp;&nbsp;x&nbsp;&nbsp;</label>
  74. </input>
  75. </div>
  76. <div class="form-group">
  77. <label class="col-sm-3 control-label"></label>
  78. <div class="col-sm-4" >
  79. <input id="articleType" type="hidden" value="0">
  80. <span id="articleTypeSpan" th:each="dict:${@dict.getType('article_type')}" th:class="${dict.dictValue == '0' ? ' badge badge-success articleTypeSpanClass ' : 'badge badge-default articleTypeSpanClass '}" th:text="|&nbsp;&nbsp;&nbsp;${dict.dictLabel}&nbsp;&nbsp;&nbsp;|" th:value ="${dict.dictValue}" th:onclick="selectArticleTypeSpan_rep,[[${dict.dictValue}]])" style="margin: 0.5rem;padding: 0.8rem;font-size:12px;cursor:pointer;"/>
  81. </div>
  82. <div class="col-sm-4">
  83. <input id="workNum" class="form-control" type="number" placeholder="内容数量">
  84. </div>
  85. <label class="workNumTip" style="color:#ef392b;"></label>
  86. </div>
  87. <div class="form-group">
  88. <label class="col-sm-3 control-label"></label>
  89. <div class="col-sm-4">
  90. <select id="staffKV" class="selectpicker" title="选择执行人" data-live-search="true" >
  91. <option th:each="map : ${staffList}" th:text="${map.mapValue}"
  92. th:value="|${map.mapKey},${map.mapValue}|" ></option>
  93. </select>
  94. </div>
  95. <div class="col-sm-4" style="margin-left:3px;" >
  96. <input type="text" placeholder="计划任务结束日期" class="layui-input form-control " id="planEndDate" th:value="*{#dates.format(planEndDate,'yyyy-MM-dd')}">
  97. </div>
  98. <label class="staffKVTip" style="color:#ef392b;"></label>
  99. </div>
  100. <div class="form-group">
  101. <label class="col-sm-3 control-label"></label>
  102. <div class="col-sm-8">
  103. <textarea id="taskInfo" class="form-control" placeholder="任务描述" th:field="*{orderNote}"></textarea>
  104. </div>
  105. </div>
  106. <hr width="70%"/>
  107. </div>
  108. </div>
  109. <!-- 隐藏节点(追加渠道时复制此节点) end -->
  110. </div>
  111. </form>
  112. </div>
  113. <div th:include="include::footer"></div>
  114. <script type="text/javascript">
  115. var prefix = ctx + "system/boomWorkTask";
  116. //注意:
  117. layui.use(['laydate'], function(){
  118. var laydate = layui.laydate;
  119. //执行一个laydate实例
  120. laydate.render({
  121. elem: '#planEndDate', //指定元素
  122. done:function(value,date){//value, date, endDate点击日期、清空、现在、确定均会触发。回调返回三个参数,分别代表:生成的值、日期时间对象、结束的日期时间对象
  123. if(value.length == 10){
  124. // reloadData(value);//默认加载当日数据
  125. }
  126. }
  127. });
  128. });
  129. $("#form-boomWorkTask-add").validate({
  130. rules:{
  131. // workTaskTitle:{
  132. // required:true,
  133. // },
  134. // workNum:{
  135. // required:true,
  136. // },
  137. // taskInfo:{
  138. // required:true,
  139. // },
  140. }
  141. });
  142. function submitHandler() {
  143. cleanTips();
  144. if ($.validate.form()) {
  145. if(add_validate() == false){
  146. return false;
  147. }
  148. $.operate.save(prefix + "/add", $('#form-boomWorkTask-add').serialize());
  149. }
  150. }
  151. //验证并提示
  152. function add_validate() {
  153. if($("#dictCategoryKV").val() == ""){
  154. $(".dictCategoryKVTip").html("*必选");
  155. $.modal.msgError("未选择类目");
  156. $("#dictCategoryKV").focus();
  157. return false;
  158. }
  159. //下面是遍历带有名为div_replace的class节点下的各元素数值
  160. var eachBoolean = true;
  161. var jsonArr = [];
  162. var i = 0;
  163. $('div').filter('.div_replace').each(function() {
  164. var eachJson = {};
  165. var channelId = $(this).attr('id');
  166. eachJson["channelId"] = channelId;
  167. eachJson["channelName"] = $(this).find($("#channelName_"+channelId)).val();
  168. eachJson["articleType"] = $(this).find($("#articleType_"+channelId)).val();
  169. var workNum_Element = $(this).find($("#workNum_"+channelId));
  170. var workNum = workNum_Element.val();
  171. if(workNum == "" || parseInt(workNum) < 1){
  172. $.modal.msgError("请录入正确数值");
  173. workNum_Element.focus();
  174. eachBoolean = false;
  175. return false;
  176. }else{
  177. if(parseInt(workNum) > 1000){
  178. $.modal.msgError("内容最大分配数为1000,请拆分任务");
  179. workNum_Element.focus();
  180. eachBoolean = false;
  181. return false;
  182. }
  183. }
  184. eachJson["workNum"] = workNum;
  185. var staff_Element = $(this).find($("#staffKV_"+channelId));
  186. var staffKV = staff_Element.val();
  187. if(staffKV == ""){
  188. $.modal.msgError("未选择执行人");
  189. staff_Element.focus();
  190. eachBoolean = false;
  191. return false;
  192. }
  193. eachJson["staffKV"] = staffKV;
  194. var planEndDate_Element = $(this).find($("#planEndDate_"+channelId));
  195. var planEndDate = planEndDate_Element.val();
  196. if(planEndDate == "" ){
  197. $.modal.msgError("未选择日期");
  198. planEndDate_Element.focus();
  199. eachBoolean = false;
  200. return false;
  201. }
  202. eachJson["planEndDate"] = planEndDate;
  203. eachJson["taskInfo"] = $(this).find($("#taskInfo_"+channelId)).val();
  204. jsonArr[i] = eachJson;
  205. i = i+1;
  206. });
  207. if(eachBoolean === false){
  208. return false;
  209. }
  210. var jsonStr = JSON.stringify(jsonArr);
  211. if(jsonStr == "[]"){
  212. $.modal.msgError("请选择渠道并录入数据");
  213. return false;
  214. }else{
  215. $("#channelsJson").val(jsonStr);
  216. }
  217. }
  218. //清空提示
  219. function cleanTips() {
  220. $(".dictCategoryKVTip").html("");
  221. $(".dictChannelKVTip").html("");
  222. // $(".talentKVTip").html("");
  223. $(".staffKVTip").html("");
  224. }
  225. //
  226. function selectTaskTypeSpan(taskTypeElement,taskTypeValue) {
  227. $(".taskTypeSpan").removeClass("badge-default badge-success"); //移除样式
  228. $(".taskTypeSpan").addClass("badge-default"); //初始化背景样式
  229. var taskType = $("#taskType").val();
  230. if(taskTypeValue == taskType){
  231. //取消
  232. $("#taskType").val(0);
  233. }else{
  234. //选中
  235. $("#taskType").val(taskTypeValue);
  236. $(taskTypeElement).addClass("badge-success");
  237. }
  238. }
  239. function selectArticleTypeSpan(articleTypeElement,channelId,articleTypeValue) {
  240. $(".articleTypeSpanClass_"+channelId).removeClass("badge-default badge-success"); //移除样式
  241. $(".articleTypeSpanClass_"+channelId).addClass("badge-default"); //初始化背景样式
  242. var articleType = $("#articleType_"+channelId).val();
  243. if(articleTypeValue == articleType){
  244. //取消
  245. $("#articleType_"+channelId).val(0);
  246. }else{
  247. //选中
  248. $("#articleType_"+channelId).val(articleTypeValue);
  249. $(articleTypeElement).addClass("badge-success");
  250. }
  251. }
  252. function selectChannelSpan(element,value,label){
  253. if($(element).hasClass("badge-success")){
  254. removeChannel(value);//移除渠道
  255. }else{
  256. //-------------拷贝渠道信息录入节点,并替换各种属性值-------------
  257. var base_div_html = $("#div_replace_id").prop("outerHTML");//拷贝指定元素及其下属元素
  258. // console.error(base_div_html); //打印追加的节点原始代码
  259. base_div_html = base_div_html.replace('class="div_replace_base"','class="div_replace"' );//替换类名
  260. base_div_html = base_div_html.replace('hidden=""',"" );//取消隐藏 替换第一次出现的某个字符串
  261. base_div_html = base_div_html.replace('渠道名',label );//替换渠道名
  262. base_div_html = base_div_html.replace('渠道名',label );//二次替换渠道名
  263. base_div_html = base_div_html.replace('id="channelName"','id="channelName_'+ value+'"');//替换
  264. base_div_html = base_div_html.replace('id="workNum"','id="workNum_'+ value+'"');//替换
  265. base_div_html = base_div_html.replace('id="taskInfo"','id="taskInfo_'+ value+'"');//替换
  266. base_div_html = base_div_html.replace('id="staffKV"','id="staffKV_'+value+'"');
  267. base_div_html = base_div_html.replace('articleTypeSpanClass ',"articleTypeSpanClass_"+ value);//替换
  268. base_div_html = base_div_html.replace('articleTypeSpanClass ',"articleTypeSpanClass_"+ value);//替换
  269. base_div_html = base_div_html.replace('id="articleType"','id="articleType_'+value+'"');
  270. var re = new RegExp("selectArticleTypeSpan_rep,","g"); //定义正则表达式 第一个参数是要替换掉的内容,第二个参数"g"表示替换全部(global)。
  271. base_div_html = base_div_html.replace(re,'selectArticleTypeSpan(this,'+value+',');//第一个参数是正则表达式 全局替换所有指定字符串
  272. base_div_html = base_div_html.replace('id="planEndDate"','id="planEndDate_'+value+'"');//日期id
  273. base_div_html = base_div_html.replace('lay-key="1"','lay-key="'+value+'"');//日期id
  274. var bs = '<div class="dropdown bootstrap-select bs3">';
  275. base_div_html = base_div_html.replace(bs,"" );//去掉下拉框上级div 注意这里闭合的</div>需要在下面r字符串末尾一起去掉
  276. var nul_option = '<option class="bs-title-option" value=""></option>';
  277. base_div_html = base_div_html.replace(nul_option,"" );//去掉多余空选项
  278. var r = '<button type="button" class="btn dropdown-toggle btn-default bs-placeholder" data-toggle="dropdown" role="combobox" aria-owns="bs-select-2" aria-haspopup="listbox" aria-expanded="false" data-id="staffKV" title="选择执行人"><div class="filter-option"><div class="filter-option-inner"><div class="filter-option-inner-inner">选择执行人</div></div> </div><span class="bs-caret"><span class="caret"></span></span></button><div class="dropdown-menu open"><div class="bs-searchbox"><input type="text" class="form-control" autocomplete="off" role="combobox" aria-label="Search" aria-controls="bs-select-2" aria-autocomplete="list"></div><div class="inner open" role="listbox" id="bs-select-2" tabindex="-1"><ul class="dropdown-menu inner " role="presentation"></ul></div></div></div>';
  279. base_div_html = base_div_html.replace(r,"");//去掉多余下拉框(下面会重新渲染一个下拉框)
  280. var re = new RegExp("div_replace_id","g"); //定义正则表达式 第一个参数是要替换掉的内容,第二个参数"g"表示替换全部(global)。
  281. base_div_html = base_div_html.replace(re, value); //第一个参数是正则表达式 全局替换所有指定字符串
  282. // console.error(base_div_html); //打印追加的节点
  283. // 各控件新增class 用于获取控件内容值
  284. //向渠道大节点push_channels 追加新的渠道录入节点
  285. $("#push_channels").append(base_div_html);
  286. //-------------重新渲染下拉框-------------
  287. //使用refresh方法更新UI以匹配新状态。
  288. $('#'+'staffKV_'+value).selectpicker('refresh');
  289. //render方法强制重新渲染引导程序 - 选择ui。
  290. $('#'+'staffKV_'+value).selectpicker('render');
  291. //-------------重新渲染时间控件-------------
  292. layui.use(['laydate'], function(){
  293. var laydate = layui.laydate;
  294. //执行一个laydate实例
  295. laydate.render({
  296. elem: '#planEndDate_'+value,
  297. done:function(value,date){//value, date, endDate点击日期、清空、现在、确定均会触发。回调返回三个参数,分别代表:生成的值、日期时间对象、结束的日期时间对象
  298. if(value.length == 10){
  299. // reloadData(value);//默认加载当日数据
  300. }
  301. }
  302. });
  303. });
  304. //选中渠道
  305. $(element).addClass("badge-success");
  306. }
  307. }
  308. //失去焦点监听事件
  309. $("#workTaskTitle").on('blur', function(){
  310. checkWorkTaskTitle();
  311. });
  312. //达人名存在提示
  313. function showWorkTaskTip(){
  314. $("#workTaskTitle-error").css("display","block");
  315. $("#workTaskTitle-error").html("<i class=\"fa fa-times-circle\"></i> 标题重复");
  316. }
  317. function removeChannel(channel) {
  318. $.modal.confirm("删除渠道内容?", function() {
  319. //移除渠道内容元素
  320. $("#"+channel).remove();
  321. //移除选中样式
  322. $("#channelsSpan_"+channel).removeClass("badge-success"); //移除样式
  323. $("#channelsSpan_"+channel).addClass("badge-default"); //初始化背景样式
  324. });
  325. }
  326. //检查达人名是否存在
  327. function checkWorkTaskTitle() {
  328. var url = prefix + "/checkWorkTaskTitle";
  329. var workTaskTitle = $("#workTaskTitle").val();
  330. if (workTaskTitle != '') {
  331. $.ajax({
  332. url: url,
  333. data: {"workTaskTitle": workTaskTitle},
  334. async: false,
  335. type: "post",
  336. success: function (result) {
  337. if(result.code == 500){
  338. showWorkTaskTip();
  339. }
  340. }
  341. });
  342. }
  343. }
  344. $(function() {
  345. $.fn.extend({
  346. onoffswitch: function() {
  347. if (this.length > 0 && !this.is('div')) {
  348. alert('请正确初始化onoffswitch控件');
  349. return;
  350. }
  351. this.each(function(i, ele) {
  352. var $ele = $(ele);
  353. if ($ele.data('onoffswitch')) { // 已经初始化过了
  354. return true;
  355. }
  356. $ele.find(':checkbox').click(function() {
  357. setValue(this);
  358. }).each(function() {
  359. setValue(this);
  360. });
  361. setValue(this);
  362. });
  363. function setValue(input) {
  364. var $input = $(input),
  365. ry_value = $input.attr('ry-alue'); // value 为1,0 第一个为不选中,第二个为选中
  366. if (!ry_value) {
  367. return;
  368. }
  369. if ($input.is(':checked')) {
  370. $input.val(ry_value.split(',')[1]);
  371. } else {
  372. $input.val(ry_value.split(',')[0]);
  373. }
  374. }
  375. }
  376. });
  377. $('div.onoffswitch').onoffswitch();
  378. });
  379. </script>
  380. </body>
  381. </html>

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/197892?site
推荐阅读
相关标签
  

闽ICP备14008679号