您好,登錄后才能下訂單哦!
在仿照費控和用友做郵件審批時,增加了對表單內容的顯示。在系統中做審批時,表單內容有豐富的控件展示,簡單的有input,textarea,radio,復雜的有自定義的審批控件、附件控件和人員選擇器等。目前復雜控件展示沒有問題,復雜控件為只讀狀態時,展示給用戶的就是普通的input或table;簡單控件中當為select時出現無法綁定值的問題。即不管其選中項是什么,展示出來的始終是第一項。
根據問題癥狀,之前在審批展示時,也出現過因下拉菜單展示有問題(如始終展示第一項或最后一項)導致的問題。究其根源是由于對select的val的不支持,解決方案是增加以下js代碼
$("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.首先對以上思路進行測試,加入代碼:
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是Multipart/mixed,mixed格式一般是指包含豐富展現的情況,于濾除val值和validate無關。
4.由于validate是jquery所支持的,考慮到可能與jQuery未被引入有關。OA系統中存在jQuery,是存儲在服務器靜態資源中,oa在提供服務的時候,可以讀取,由于oa需要通過***訪問,所以初步斷定直接引用oastatic中的jquery是拿不到的。在內網、外網訪問該靜態資源地址時做對比也印證了以上推斷。于是希望引入互聯網上的jquery資源,代碼如下:
from = from + "<script src=\"http://code.jquery.com/jquery-1.8.0.min.js\"></script>";
如果是因為validate無法識別,導致val丟失,理論上加入jquery引入是可以解決的。但測試下來不光沒有解決,在F12搜索引入的script發現,script也被過濾掉,根本無法引入并解析執行。
5.由于引入jQuery不成功,所以希望將所有的valieate直接過濾掉,使用如下正則表達式:
from = from.replaceAll("validate=\"(.*)}\"","");
validate雖然被過濾掉,但val還是不存在。在html的select標簽的介紹中,可以看出,val和同時被過濾的validate都不是基本的屬性。所以解決的思路應該轉向郵箱正文展示應以最基本屬性為主。
6.仍然按照思路1,將select使用val指定選中項,改為按照option selected,使用正則表達式替換,代碼如下:
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的問題。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。