博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
邮件审批:表单作为邮件内容展示问题处理过程1——下拉菜单select问题
阅读量:5931 次
发布时间:2019-06-19

本文共 2393 字,大约阅读时间需要 7 分钟。

   在仿照费控和用友做邮件审批时,增加了对表单内容的显示。在系统中做审批时,表单内容有丰富的控件展示,简单的有input,textarea,radio,复杂的有自定义的审批控件、附件控件和人员选择器等。目前复杂控件展示没有问题,复杂控件为只读状态时,展示给用户的就是普通的input或table;简单控件中当为select时出现无法绑定值的问题。即不管其选中项是什么,展示出来的始终是第一项。

   根据问题症状,之前在审批展示时,也出现过因下拉菜单展示有问题(如始终展示第一项或最后一项)导致的问题。究其根源是由于对select的val的不支持,解决方案是增加以下js代码

1
2
3
4
5
6
7
8
$(
"select"
).each(
function
(index, element) {
        
$(
this
).attr(
"style"
"color:rgb(0, 0, 0)"
);
        
var 
_val = $(element).attr(
"val"
);
        
if 
(_val) {
            
$(
"option[value='" 
+ _val + 
"']"
, $(element)).attr(
                    
"selected"
"selected"
);
        
}
    
});

    以上的思路即为先即得select的val值,然后将对应val值的option选项置为selected。

  以下是整个解决过程:

   1.首先对以上思路进行测试,加入代码:

   

1
from = from +
"<script type=\"text/javascript\">$(function(){$(\"select\").each(function(index, element) {var _val = $(element).attr(\"val\");if (_val) {$(\"option[value='\" + _val + \"']\", $(element)).attr(\"selected\", \"selected\")}});});</script>"
;

   由于缺失jquery,所以肯定是失败的。

   2.由于freemarker只提供了解析接口,希望通过重写某些方法实现思路1中的方案,但freemarker的解析没有找到源码,可能代价较大,放弃;   

   3.在网页中选中elements,发现val值被过滤,validate(jQuery的validate)也被滤除;

   跟踪相应代码发现freemarker生成的html并无问题;一直向后跟踪至javaMail发送邮件的content的set处,content值也没有问题。在进行跟踪时,发现content的type是,mixed格式一般是指包含丰富展现的情况,于滤除val值和validate无关。

   4.由于validate是jquery所支持的,考虑到可能与jQuery未被引入有关。OA系统中存在jQuery,是存储在服务器静态资源中,oa在提供服务的时候,可以读取,由于oa需要通过vpn访问,所以初步断定直接引用oastatic中的jquery是拿不到的。在内网、外网访问该静态资源地址时做对比也印证了以上推断。于是希望引入互联网上的,代码如下:

1
from = from + 
"<script src=\"http://code.jquery.com/jquery-1.8.0.min.js\"></script>"
;

   如果是因为validate无法识别,导致val丢失,理论上加入jquery引入是可以解决的。但测试下来不光没有解决,在F12搜索引入的script发现,script也被过滤掉,根本无法引入并解析执行。

  5.由于引入jQuery不成功,所以希望将所有的valieate直接过滤掉,使用如下正则表达式:

1
from = from.replaceAll(
"validate=\"(.*)}\""
,
""
);

   validate虽然被过滤掉,但val还是不存在。在html的标签的介绍中,可以看出,val和同时被过滤的validate都不是基本的属性。所以解决的思路应该转向邮箱正文展示应以最基本属性为主。

  6.仍然按照思路1,将select使用val指定选中项,改为按照option selected,使用正则表达式替换,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
if
(readHtml.contains(
"select"
)){
              
String regex = 
"value=\"" 
+ value + 
"\""
;
               
String str = readHtml;
               
Pattern pat = Pattern.compile(regex);  
               
Matcher matcher = pat.matcher(str);     
               
while 
(matcher.find()) { 
                 
String temp = str.substring(matcher.start(),matcher.end());
                 
str = str.replaceAll(temp, temp.substring(
0
,temp.lastIndexOf(value))+ 
"" 
+ value + 
"\"" 
" selected='true'"
);
                 
               
}   
               
readHtml = str;
        
}

   经确认,问题解决。选中的option后会追加selected=true,显示正常。该方式也解决了之前需要在各页面或统一js中必须增加val转换为selected=true的问题。

     本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/1834296,如需转载请自行联系原作者

你可能感兴趣的文章
windows服务 2.实时刷新App.config
查看>>
jquery 怎么触发select的change事件
查看>>
angularjs指令(二)
查看>>
(原創) 如何建立一个thread? (OS) (Linux) (C/C++) (C)
查看>>
<气场>读书笔记
查看>>
vue-cli创建的项目,如何让键盘监听事件,只在一个页面(url)内有效,如下图和代码...
查看>>
实现一个平行四边形
查看>>
领域驱动设计,构建简单的新闻系统,20分钟够吗?
查看>>
web安全问题分析与防御总结
查看>>
React 组件通信之 React context
查看>>
ZooKeeper 可视化监控 zkui
查看>>
Linux下通过配置Crontab实现进程守护
查看>>
ios 打包上传Appstore 时报的错误 90101 90149
查看>>
Oracle推出轻量级Java微服务框架Helidon
查看>>
密码概述
查看>>
程序员初入公司:10大经验让你能力提升20倍!
查看>>
nagios+nrpe监控配置错误日志集
查看>>
Hyper-V、SCVMM2012和XenDesktop 5.6桌面虚拟化运维之更新、添加和删除虚拟桌面
查看>>
Wireless在域里面实施WPA认证设定应用
查看>>
[20161020]bbed保存执行结果.txt
查看>>