详解velocity模板使javaWeb的html+js实现模块化

详解velocity模板使javaWeb的html+js实现模块化

页面上一些基础数据或者其他页面经常用到部分,可以独立出来做成小组件,组件预留调用入口,需要的页面直接调用即可。
如图,页面中的展示分类和搜索标签在多个页面重复使用,可以将这部分内容独立出来,做成组件,供后续开发调用:

classify_search_tag.html文件如下,其中包含HTML节点和jQuery代码;

<!--
展示分类与搜索标签组件使用说明:
  1.新增时父页面调用方法:页面加载时调用 goodsClassifyAndSearchTag.getFirstLevelClassify();/** 初始化一级展示分类 **/
  2.编辑时父页面调用方法:页面加载时调用 goodsClassifyAndSearchTag.getClassifyAndSearchTag(String classifys);
    ShowClassifyList类型json串,可参考 \js\standard_v2\group\group_edit.js 该方法 groupGoodsObj.getEditClassify();
  3.返回页面选中的展示分类和搜索标签,调用 goodsClassifyAndSearchTag.returnSelectedClassifyAndTag();
  注意事项:可能会出现js冲突问题,父页面的js最好在文件顶部加载
-->
<!--展示分类-->
<div class="row form-horizontal">
  <div class="col-md-12">
    <div class="form-group">
      <label class="col-md-1 control-label pr0">展示分类</label>
      <div class="col-md-1">
        <select class="form-control" id="first_classify" onchange="goodsClassifyAndSearchTag.getSecondClassify(this)">
          <option value="0">请选择</option>
        </select>
      </div>
      <div class="col-md-1">
        <select class="form-control" id="second_classify" onchange="goodsClassifyAndSearchTag.getThirdClassify(this)">
          <option value="0">请选择</option>
        </select>
      </div>
      <div class="col-md-1">
        <select class="form-control" id="third_classify" onchange="goodsClassifyAndSearchTag.getSearchTag(this)">
          <option value="0">请选择</option>
        </select>
      </div>
    </div>
  </div>
</div>
<!--搜索标签-->
<div class="row mb15">
  <div class="col-md-12">
    <h2><small>搜索标签:</small></h2>
  </div>
</div>
<div class="row form-horizontal" id="classify_template">
  <div class="col-md-12" name="tag_original">
    <div name="selectTagDom" id="selectTagDom"></div>
    <div name="commonTagDom" id="commonTagDom"></div>
  </div>
</div>
<!-- 展示分类模板 -->
<script id="classifyTemplate" type="text/x-jsrender">
  <option value="{{:id}}">{{:classilyName}}</option>
</script>
<!-- 普通标签模板 -->
<script id="commonTagTemplate" type="text/x-jsrender">
  <div class="form-group">
    <label class="col-md-1 control-label pr0">{{:optionName}}</label>
    <div class="col-md-9">
      {{for optionValues}}
        <label class="checkbox-inline">
          {{if checked==true}}
            <input type="checkbox" checked name='{{: #data.optionId}}' optionid='{{: #data.optionId}}' valueid='{{: #data.id}}'>
          {{else}}
            <input type="checkbox" name='{{: #data.optionId}}' optionid='{{: #data.optionId}}' valueid='{{: #data.id}}'/>
          {{/if}}
          <span>{{: #data.value}}</span>
        </label>
      {{/for}}
    </div>
  </div>
</script>
<!-- 级联标签模板 -->
<script id="selectTagTemplate" type="text/x-jsrender">
  <div class="form-group" id='label_{{:optionId}}' valueid='{{:valueId}}'>
    <label class="col-md-1 control-label pr0">{{:optionName}}</label>
    <div class="col-md-9">
      {{for optionValues}}
        <label class="checkbox-inline">
          {{if checked==true}}
            <input type="checkbox" checked name='{{: #data.optionId}}' optionid='{{: #data.optionId}}' valueid='{{: #data.id}}' onclick='goodsClassifyAndSearchTag.getChildSelectOption({{: #data.optionId}}, {{: #data.id}}, this)'>
          {{else}}
            <input type="checkbox" name='{{: #data.optionId}}' optionid='{{: #data.optionId}}' valueid='{{: #data.id}}' onclick='goodsClassifyAndSearchTag.getChildSelectOption({{: #data.optionId}}, {{: #data.id}}, this)'/>
          {{/if}}
          <span>{{: #data.value}}</span>
        </label>
      {{/for}}
    </div>
  </div>
</script>
<!-- 级联子标签模板 -->
<script id="childOptionTemplate" type="text/x-jsrender">
  <div class="form-group" name='label_{{:optionId}}' valueId='{{:valueId}}'>
    <lable class="col-md-1 control-label pr0">{{:optionName}}</lable>
    <div class="col-md-9">
      {{for optionValues}}
        <label class="checkbox-inline">
          <input type="checkbox" name='{{:#parent.parent.data.optionId}}' optionid='{{: #data.optionId}}' valueid='{{: #data.id}}' onclick='goodsClassifyAndSearchTag.getChildSelectOption({{: #data.optionId}}, {{: #data.id}}, this)'/>
          <span>{{: #data.value}}</span>
        </label>
      {{/for}}
    </div>
  </div>
</script>
<!--展示分类和搜索标签相关处理js代码开始-->
<script> 

  /**
   * 展示分类和搜索标签对象
   * @type {{index: {index: number}, getEditClassify: goodsClassifyAndSearchTag."getEditClassify"}}
   */
  var goodsClassifyAndSearchTag = {
    "index": 1,
    "getFirstLevelClassify": function () { /** 获取一级展示类目,新增时父页面调用入口 **/
    var url = '/showClassify/getClassifyByPid?pid=' + 0;
      var ajaxObj = {url: configJS.hostUrl() + url, async: true, method: "GET"};
      commonJS.loading("open");
      commonJS.sendAjaxRequest(ajaxObj, function (value) {
        $("#first_classify").append($("#classifyTemplate").render(value));
      });
      commonJS.loading("close");
    },
    "getSecondClassify": function (e) { /** 获取二级展示类型 **/
    $("#second_classify").html("<option value='0'>请选择</option>");
      $("#third_classify").html("<option value='0'>请选择</option>");
      $("#commonTagDom").html("");
      $("#selectTagDom").html("");
      if($(e).val() == 0){
        return;
      }
      var url = '/showClassify/getClassifyByPid?pid=' + $(e).val();
      var ajaxObj = {url: configJS.hostUrl() + url, async: true, method: "GET"};
      commonJS.loading("open");
      commonJS.sendAjaxRequest(ajaxObj, function (value) {
        $("#second_classify").append($("#classifyTemplate").render(value));
      });
      commonJS.loading("close");
      goodsClassifyAndSearchTag.getSearchTag(e);
    },
    "getThirdClassify": function (e) {
      $("#third_classify").html("<option value='0'>请选择</option>");
      $("#commonTagDom").html("");
      $("#selectTagDom").html("");
      if($(e).val() == 0){
        return;
      }
      var url = '/showClassify/getClassifyByPid?pid=' + $(e).val();
      var ajaxObj = {url: configJS.hostUrl() + url, async: true, method: "GET"};
      commonJS.loading("open");
      commonJS.sendAjaxRequest(ajaxObj, function (value) {
        $("#third_classify").append($("#classifyTemplate").render(value));
      });
      commonJS.loading("close");
      goodsClassifyAndSearchTag.getSearchTag(e);
    },
    "getSearchTag": function (e) {
      $("#commonTagDom").html("");
      $("#selectTagDom").html("");
      var classifyId = $(e).val();
      if(0 == classifyId){
        return;
      }
      goodsClassifyAndSearchTag.getClassifyCommonSearchOption(e);
      goodsClassifyAndSearchTag.getClassifySelectedSearchOption(e);
    },
    "getClassifyCommonSearchOption": function (e) { /** 查询当前分类的所有普通标签 **/
    var classifyId = $(e).val();
      var url = '/searchTag/getCommonOptionByClassifyId?classifyId=' + classifyId;
      var ajaxObj = {url: configJS.hostUrl() + url, async: true, method: "GET"};
      commonJS.loading("open");
      commonJS.sendAjaxRequest(ajaxObj, function (value) { 

        $("div[name='commonTagDom']").html($("#commonTagTemplate").render(value));
        var commonRadios = $("div[name='commonTagDom']").find("input[type='checkbox']");
        $.each(commonRadios, function (n, commonRadio) {
          var newName = goodsClassifyAndSearchTag.index + "_" + $(commonRadio).attr("name");
          $(commonRadio).attr("name", newName);
        });
      });
      commonJS.loading("close");
    },
    "getClassifySelectedSearchOption": function (e) { /** 查询当前分类的所有一级级联搜索标签 **/
    var classifyId = $(e).val();
      var url = '/searchTag/getSelectedOptionByClassifyId?classifyId=' + classifyId + "&pid=0";
      var ajaxObj = {url: configJS.hostUrl() + url, async: true, method: "GET"};
      commonJS.loading("open");
      commonJS.sendAjaxRequest(ajaxObj, function (value) {
        $("div[name='selectTagDom']").html($("#childOptionTemplate").render(value));
        var selectRadios = $("div[name='selectTagDom']").find("input[type='checkbox']");
        $.each(selectRadios, function (n, selectRadio) {
          var newName = goodsClassifyAndSearchTag.index + "_" + $(selectRadio).attr("name");
          $(selectRadio).attr("name", newName);
        }); 

      });
      commonJS.loading("close");
    },
    "getChildSelectOption": function (parentOptionId, valueId, e) { /** 根据标签值id获取下级标签 **/
    var url = '/searchTag/getChildSelectedOptionByValueId?valueId=' + valueId;
      var ajaxObj = {url: configJS.hostUrl() + url, async: true, method: "GET"};
      commonJS.loading("open");
      commonJS.sendAjaxRequest(ajaxObj, function (value) {
        if(value==null||value.length==0){
          return;
        }
        var parent = $($(e).parents().parents()[1]);
        if(e.checked){
          value[0]['valueId']=valueId;
          var childHtml = $("#childOptionTemplate").render(value);
          parent.after(childHtml);
        }else{
          // 先删除所有后面的兄弟节点
          var divs=parent.nextAll('div');
          goodsClassifyAndSearchTag.deleteOptionDiv(divs,valueId);
        }
      });
      commonJS.loading("close");
    },
    "deleteOptionDiv":function(divs,valueId){
      $.each(divs,function(key,obj){
        if($(obj).attr("valueid")==valueId){
          var inputs=$(obj).find('input');
          $.each(inputs,function(key1,obj1){
            if(obj1.checked){
              goodsClassifyAndSearchTag.deleteOptionDiv(divs,$(obj1).attr('valueid'));
            }
          });
          $(obj).remove();
        }
      });
    },
    "getClassifyAndSearchTag": function (showClassifys) {//编辑时回写搜索标签,父页面调用入口
      var url = "/standardGroupV2/getClassifyAndSearchTag";
      var param = {};
      param["showClassifyList"] = showClassifys.showClassifyList;
      var ajaxObj = {url: configJS.hostUrl() + url, async: true, param: {"showClassifys": JSON.stringify(param)}, method: "POST"};
      commonJS.loading("open");
      commonJS.sendAjaxRequest(ajaxObj, function (value) {
        $.each(value, function (n, obj) {
          var html = $($("#classify_template").html()); 

          var firstLevelHtml = '';
          var secondLevelHtml = '';
          var thirdLevelHtml = ''; 

          $.each(obj.showClassifyJsons, function (n, val) {
            if(val.level == 1){
              if(val.checked == true){
                firstLevelHtml += "<option selected value='"+val.id+"'>"+val.classilyName+"</option>";
              }else{
                firstLevelHtml += "<option value='"+val.id+"'>"+val.classilyName+"</option>";
              } 

            }else if(val.level == 2){
              if(val.checked == true){
                secondLevelHtml += "<option selected value='"+val.id+"'>"+val.classilyName+"</option>";
              }else{
                secondLevelHtml += "<option value='"+val.id+"'>"+val.classilyName+"</option>";
              }
            }else if(val.level == 3){
              if(val.checked == true){
                thirdLevelHtml += "<option selected value='"+val.id+"'>"+val.classilyName+"</option>";
              }else{
                thirdLevelHtml += "<option value='"+val.id+"'>"+val.classilyName+"</option>";
              }
            }
          });
          $("#first_classify").append(firstLevelHtml);
          $("#second_classify").append(secondLevelHtml);
          $("#third_classify").append(thirdLevelHtml); 

          // 加载普通标签
          $("div[name='commonTagDom']").html($("#commonTagTemplate").render(obj.commonTagOptionJsons));
          // 加载级联标签
          $("div[name='selectTagDom']").html($("#selectTagTemplate").render(obj.selectTagOptionJsons));
        });
      });
      commonJS.loading("close");
    },
    "returnSelectedClassifyAndTag":function () {
      // 获取展示分类ID和搜索标签
      var classifyName = '';
      var classifyId = $("#third_classify").val();
      $.each($("#third_classify").find("option"), function (n, val) {
        if (val.selected) {
          classifyName = $(val).html();
        }
      });
      if (0 == classifyId) {
        classifyId = $("#second_classify").val();
        $.each($("#second_classify").find("option"), function (n, val) {
          if (val.selected) {
            classifyName = $(val).html();
          }
        });
      }
      if (0 == classifyId) {
        classifyId = $("#first_classify").val();
        $.each($("#first_classify").find("option"), function (n, val) {
          if (val.selected) {
            classifyName = $(val).html();
          }
        });
      } 

      if (0 != classifyId) {
        var classify = {
          "classifyId": 0,
          'classifyName': '',
          "searchTags": []
        }
        classify.classifyId = classifyId;
        classify.classifyName = classifyName;
        var selectTagDom = $("#selectTagDom");
        var commonTagDom = $("#commonTagDom");
        var selectTagsEle = selectTagDom.find("input[type='checkbox']");
        var commonTagsEle = commonTagDom.find("input[type='checkbox']");
        for (var i = 0; i < selectTagsEle.length; i++) {
          if (selectTagsEle[i].checked) {
            var searchTag = {};
            var optionId = $(selectTagsEle[i]).attr("optionid");
            var optionValueId = $(selectTagsEle[i]).attr("valueid");
            searchTag.optionId = optionId;
            searchTag.optionValueId = optionValueId;
            classify.searchTags.push(searchTag);
          }
        }
        for (var i = 0; i < commonTagsEle.length; i++) {
          if (commonTagsEle[i].checked) {
            var searchTag = {};
            var optionId = $(commonTagsEle[i]).attr("optionid");
            var optionValueId = $(commonTagsEle[i]).attr("valueid");
            searchTag.optionId = optionId;
            searchTag.optionValueId = optionValueId;
            classify.searchTags.push(searchTag);
          }
        }
        return classify;
      }
    }
  }
</script>

调用页面的HTML文件中该模块的位置用velocity引用该组件:

#parse("/classify_search_tag.html")

调用页面的js文件中,调用入口方法即可:

新增调用

$(function () {
  goodsClassifyAndSearchTag.getFirstLevelClassify();/** 初始化一级展示分类 **/
});

编辑调用:

$(function () {
  goodsClassifyAndSearchTag.getClassifyAndSearchTag("需要的参数");/** 回显展示类目以及搜索标签 **/
});

获取选中的返回值:

goodsClassifyAndSearchTag.returnSelectedClassifyAndTag()

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)

    问题:表单怎么在输入后立即验证,而不是提交后再验证那么不方便(网上搜到的要么是模棱两可,要么是残缺不全-) 方法:鉴于此,加上我个人的理解(注释)在上面. 截图: 代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>用户注册</title

  • JavaWeb 中Cookie实现记住密码的功能示例

    本文主要内容: •1.什么是Cookie •2.Cookie带来的好处 •3.Cookie的主要方法 一.什么是Cookie cookie是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段.Cookie的目的就是为用户带来方便,为网站带来增值.虽然有着许多误传,事实上Cookie并不会造成严重的安全威胁.Cookie永远不会以任何方式执行,因此也不会带来病毒或攻击你的系统.另外,由于浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为

  • JavaWeb表单注册界面的实现方法

    JavaWeb表单注册界面的实现方法 今天又做了一个注册界面,还是一如既往的从以前的代码copy过来,于是决定总结一下做注册界面的思路,供同学参考. Step1 页面实现 在这一步主要用到了html.css.JavaScript的知识. 1)  html 建立页面基本结构.建议在做html的时候给每个Element都设置id,方便之后的css.JavaScript操作. 2)  css 给节点设置长.宽.边距.边框.背景等样式. 3)  js 设置按钮鼠标悬停时的背景变化等.页面效果实现. St

  • javaWeb项目部署到阿里云服务器步骤详解

    记录web项目部署到阿里云服务器步骤 (使用 web项目.阿里云服务器.Xftp.Xshell),敬请参考和指正 1.将要部署的项目打包成WAR文件格式,可以在MyEclipse.Eclipse都可以完成打包,如下图: 2.安装Xshell和Xftp两种软件 简单介绍下这两种软件作用(详情请百度相关文档) Xshell:通过网络连接到远程服务器主机. Xftp:能在Linux.Unix和Windows之间互传文件. 3.通过Xshell连接远程主机,如下图    4.创建会话完成,点击连接,显示

  • JavaWeb实现压缩多个文件并下载实例详解

    下面一段代码给大家分享JavaWeb实现压缩多个文件并下载功能,具体代码如下所示: //文件名称 String[] names={"one.jpg","two.jpg","three.jpg","four.jpg"}; //四个文件流 FileInputStream input1 = new FileInputStream(new File("文件路径")); FileInputStream input2

  • 关于javaWeb中405错误的解决方法

    今天写了一个servlet,可是一直405报错,开始以为web.xml里面的servlet配置有问题,可是那样的话应该报404错误啊 最后才发现在重写doPost和doGet方法的时候,写成了dopost和doget,因为java对大小写很敏感,故相当于没有重新httpservelt里面的方法. 反思:编程需谨慎!!! 以上这篇关于javaWeb中405错误的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • 详解velocity模板使javaWeb的html+js实现模块化

    详解velocity模板使javaWeb的html+js实现模块化 页面上一些基础数据或者其他页面经常用到部分,可以独立出来做成小组件,组件预留调用入口,需要的页面直接调用即可. 如图,页面中的展示分类和搜索标签在多个页面重复使用,可以将这部分内容独立出来,做成组件,供后续开发调用: classify_search_tag.html文件如下,其中包含HTML节点和jQuery代码: <!-- 展示分类与搜索标签组件使用说明: 1.新增时父页面调用方法:页面加载时调用 goodsClassifyA

  • 详解C++模板编程中typename用法

    typename的常规用法 typename在C++类模板或者函数模板中经常使用的关键字,此时作用和class相同,只是定义模板参数:在下面的例子中,该函数实现泛型交换数据,即交换两个数据的内容,数据的类型由_Tp决定. template <typename _Tp> inline void swap(_Tp& __a, _Tp& __b) { _Tp __tmp = __a; __a = __b; __b = __tmp; } typename的第二个用法:修饰类型 限定名和

  • 详解C++ 模板编程

    类型模板 类型模板包括函数模板和类模板,基本上是C++开发人员接触模板编程的起点. 下面代码演示了函数模板和类模板的使用方法: // 函数模板 template<typename T> T add(const T& a, const T& b) { return a + b; } // 类模板 template<typename T> class Point { private: T x[3]; ... }; 类型模板以template开始声明,尖括号内的typen

  • js对象实例详解(JavaScript对象深度剖析,深度理解js对象)

    这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕. 平时发的文章基本都是开发中遇到的问题和对最佳解决方案的探讨,终于忍不住要写一篇基础概念类的文章了. 本文探讨以下问题,在座的朋友各取所需,欢迎批评指正: 1.创建对象 2.__proto__与prototype 3.继承与原型链 4.对象的深度克隆 5.一些Object的方法与需要注意的点 6.ES6新增特性 下面反复提到实例对象和原型对象,通过构造函数 new

  • 详解本地Vue项目请求本地Node.js服务器的配置方法

    目录 1.使用vue-cli脚手架搭建vue项目 2.使用koa搭建node后端 3.Vue项目中添加后端请求 参考资料: 前言:本文只针对自己需要本地模拟接口于是搭建一个本地node服务器供自己测试使用,仅作自己从头到尾搭建项目的记录 1.使用vue-cli脚手架搭建vue项目 1.在桌面运行 cmd,使用命令vue create demo创建一个vue项目demo,插件依赖等使用默认配置2.项目创建成功之后,使用命令 cd demo,进入 demo 文件夹,然后使用命令 npm run se

  • 详解Javascript模板引擎mustache.js

    本文总结它的使用方法和一些使用心得,内容不算很高深,纯粹是入门内容,看看即可.不过要是你还没有用过此类的javascript引擎库,那么本文还是值得你一读的,相信在你了解完它强大的功能和简单用法之后,一定会迫不及待地将之用于你的工作当中. 1. 从一个简单真实的需求讲起 目前公司做了一个统一的开发平台,后台封装了MVC的接口和数据增删改查的接口,前端我自己用bootstrap+手写各类组件的方式弄了一套开发框架:集成了CAS,在CAS的基础上,首先做了一套统一权限管理系统,这个系统是我们开发平台

  • 详解django模板与vue.js冲突问题

    问题: django模板与vue.js的变量都是使用"{{"和"}}"包裹起来的,在渲染django模板时会先替代掉所有的"{{"和"}}"及被包裹在其中的内容,使得vue.js没有使用"{{"."}}"来绑定变量. 处理方法: 方法1:修改vue.js的默认的绑定符号 Vue.config.delimiters = ["[[", "]]"]; 执

  • 详解Android端与JavaWeb传输加密(DES+RSA)

    一.加密介绍 本文采用对称式加密算法DES和非对称式加密算法RSA结合做数据传输加密的方式. 先说一下对称式加密 DES:对称式加密即使用单钥密码加密的方法,信息的加密和解密使用同一个秘钥,这种方式也称为单秘钥加密.所谓对称就是指加密和解密使用的是同一个秘钥! 常用的对称加密有:DES.IDEA.RC2.RC4.SKIPJACK.RC5.AES算法等. 与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥 (privatekey).公开密钥与私有密钥是一对,如

  • 详解nodejs模板引擎制作

    关于模板,我倒是用过了不少.最开始要数Java的JSP了,然后接触了PHP的smarty,再就是Python的jinja2, Django内置模板,现在刚开始看Nodejs,也发现了不少类似的模板引擎,ejs, jade等等吧. 模板带来的最直接的好处就是加速开发,前后端分离.除此之外,对于字符串的格式化同样是个比较好的应用.习惯了python中 string = "hello {}".format("郭璞") # hello 郭璞 string = "h

  • 详解java模板和回调机制

    最近看spring的JDBCTemplete的模板方式调用时,对模板和回调产生了浓厚兴趣,查询了一些资料,做一些总结. 回调函数: 所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数.回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数.回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机.一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供.由于S并不知道C

随机推荐