UEditor由百度開發
官網 https://ueditor.baidu.com/web...
github https://github.com/fex-team/u...
官方文檔 http://fex.baidu.com/ueditor/...javascript
官網下載連接 https://ueditor.baidu.com/web...
筆者後端使用JAVA,因此下載 jsp版本,UTF-8版php
開發版下載地址
https://github.com/fex-team/u...css
下載後目錄結構 html
common-fileupload.jar 包存在 ddos 漏洞,請儘快升級到最新的版本,直達連接:Apache fileupload jar
https://commons.apache.org/pr...前端
使用eclipse的import
右擊->Import->Install or deploy an aitifact to Maven repository->輸入相關信息java
生成的文件很是全jquery
若是不添加,須要將jar包放到lib下,在pom.xml中引入以下 <dependency> <groupId>com.baidu.ueditor</groupId> <artifactId>ueditor</artifactId> <version>1.1.2</version> <scope>system</scope> <systemPath>${project.basedir}/lib/ueditor-1.1.2.jar</systemPath> </dependency>
建立spring-boot項目,pom.xml文件以下git
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> </parent> <packaging>jar</packaging> <properties> <!-- 文件拷貝時的編碼 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!--繼承spring-boot時纔有效 --> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- tomcat解析jsp依賴 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.Application</mainClass> </configuration> </plugin> </plugins> </build>
添加依賴 ueditor依賴程序員
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> </dependency> <dependency> <groupId>com.baidu.ueditor</groupId> <artifactId>ueditor</artifactId> <version>1.1.2</version> </dependency>
將下載後的文件夾名爲ueditor-1.4放到webapps下
在ueditor-1.4下編寫ueditor01.html 內容以下github
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <!--加載編輯器的容器--> <script id="container" name="content" type="text/plain"> 這裏寫你的初始化內容 </script> <!--配置文件--> <script src="ueditor.config.js" type="text/javascript" charset="utf-8"></script> <!--編輯器源碼文件--> <script src="ueditor.all.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> <!--實例化編輯器--> var ue = UE.getEditor('container'); </script> </body> </html>
顯示以下
必定要啓動項後端目,須要加載controller.jsp文件
不啓動項目報錯如以下
解決辦法有2個,若是不使用先後端分離,要保證jsp有controller.jsp和config.json
先後端分離目的是爲了刪除tomcat-embed-jasper的依賴
編寫controller
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.baidu.ueditor.ActionEnter; @Controller @RequestMapping("ueditor-1.4") public class UeditorController { @RequestMapping("ueditor/controller") @ResponseBody public void getConfigInfo(HttpServletRequest request, HttpServletResponse response) { response.setContentType("application/json;charset=utf-8"); String rootPath = request.getSession().getServletContext().getRealPath("/"); try { String exec = new ActionEnter(request, rootPath).exec(); PrintWriter writer = response.getWriter(); writer.write(exec); writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); } } }
修改editor.config.js
// 服務器統一請求接口路徑 , serverUrl: URL +"ueditor/controller" /*"jsp/controller.jsp"*/
發送的參數
ueditor-1.4/ueditor/controller?action=config&&noCache=1591844726761
返回的參數
{state:配置文件初始化失敗}
分析源碼
com.baidu.ueditor.ActionEnter.ActionEnter(HttpServletRequest, String) public ActionEnter(HttpServletRequest request, String rootPath) { this.request = request; this.rootPath = rootPath; this.actionType = request.getParameter("action"); this.contextPath = request.getContextPath(); this.configManager = ConfigManager.getInstance(this.rootPath, this.contextPath, request.getRequestURI()); }
ConfigManager.getInstance
ConfigManager的構造方法
initEnv方法
看到了沒有到originalPapt同級的文件夾下找config.json
orginPath的值以下
if (contextPath.length() > 0) { this.originalPath = this.rootPath + uri.substring(contextPath.length()); } else { this.originalPath = this.rootPath + uri; }
那麼rootPath的是什麼呢?
C:\Users\Administrator\AppData\Local\Temp\tomcat-docbase.3976607370684852948.11025\
uri的值
/litongjava-spring-boot-ueditor/ueditor-1.4/ueditor/controller
contextPath的值
/litongjava-spring-boot-ueditor
解決辦法,獲取靜態目錄做爲rootPath,將config.json放到靜態目錄的ueditor-1.4/ueditor下面
配置成功後返回的數據以下
{"videoMaxSize":102400000,"videoActionName":"uploadvideo","fileActionName":"uploadfile","fileManagerListPath":"/ueditor/jsp/upload/file/","imageCompressBorder":1600,"imageManagerAllowFiles":[".png",".jpg",".jpeg",".gif",".bmp"],"imageManagerListPath":"/ueditor/jsp/upload/image/","fileMaxSize":51200000,"fileManagerAllowFiles":[".png",".jpg",".jpeg",".gif",".bmp",".flv",".swf",".mkv",".avi",".rm",".rmvb",".mpeg",".mpg",".ogg",".ogv",".mov",".wmv",".mp4",".webm",".mp3",".wav",".mid",".rar",".zip",".tar",".gz",".7z",".bz2",".cab",".iso",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".pdf",".txt",".md",".xml"],"fileManagerActionName":"listfile","snapscreenInsertAlign":"none","scrawlActionName":"uploadscrawl","videoFieldName":"upfile","imageCompressEnable":true,"videoUrlPrefix":"","fileManagerUrlPrefix":"","catcherAllowFiles":[".png",".jpg",".jpeg",".gif",".bmp"],"imageManagerActionName":"listimage","snapscreenPathFormat":"/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}","scrawlPathFormat":"/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}","scrawlMaxSize":2048000,"imageInsertAlign":"none","catcherPathFormat":"/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}","catcherMaxSize":2048000,"snapscreenUrlPrefix":"","imagePathFormat":"/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}","imageManagerUrlPrefix":"","scrawlUrlPrefix":"","scrawlFieldName":"upfile","imageMaxSize":2048000,"imageAllowFiles":[".png",".jpg",".jpeg",".gif",".bmp"],"snapscreenActionName":"uploadimage","catcherActionName":"catchimage","fileFieldName":"upfile","fileUrlPrefix":"","imageManagerInsertAlign":"none","catcherLocalDomain":["127.0.0.1","localhost","img.baidu.com"],"filePathFormat":"/ueditor/jsp/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}","videoPathFormat":"/ueditor/jsp/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}","fileManagerListSize":20,"imageActionName":"uploadimage","imageFieldName":"upfile","imageUrlPrefix":"","scrawlInsertAlign":"none","fileAllowFiles":[".png",".jpg",".jpeg",".gif",".bmp",".flv",".swf",".mkv",".avi",".rm",".rmvb",".mpeg",".mpg",".ogg",".ogv",".mov",".wmv",".mp4",".webm",".mp3",".wav",".mid",".rar",".zip",".tar",".gz",".7z",".bz2",".cab",".iso",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".pdf",".txt",".md",".xml"],"catcherUrlPrefix":"","imageManagerListSize":20,"catcherFieldName":"source","videoAllowFiles":[".flv",".swf",".mkv",".avi",".rm",".rmvb",".mpeg",".mpg",".ogg",".ogv",".mov",".wmv",".mp4",".webm",".mp3",".wav",".mid"]}
筆者測試圖片上傳是出現問題如
請求
ueditor/controller?action=uploadimage&encode=utf-8
響應
{state: "未找到上傳數據"}
上傳源碼分析
Uploader
BinaryUploader
那麼HttpServletRequest到底有沒有數據呢?有數據代碼也沒有問題,可是爲何就是不行呢?
緣由:ueditor自事的fileupload組件與spring的有衝突
解決辦法,使用Servlet
編寫Servlet
import java.io.IOException; import java.io.PrintWriter; import java.net.URL; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.baidu.ueditor.ActionEnter; //使用註解測試無效 //@WebServlet(name = "UEditorServlet", urlPatterns = "/UEditor") public class UEditorServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setHeader("Content-Type", "text/html"); PrintWriter out = response.getWriter(); ServletContext application = this.getServletContext(); URL systemResource = ClassLoader.getSystemResource(""); String rootPath = systemResource.getFile(); //String rootPath = application.getRealPath("/"); String action = request.getParameter("action"); String result = new ActionEnter(request, rootPath).exec(); if (action != null && (action.equals("listfile") || action.equals("listimage"))) { rootPath = rootPath.replace("\\", "/"); result = result.replaceAll(rootPath, "/"); } out.write(result); } } @Bean public ServletRegistrationBean servletRegistrationBean() { return new ServletRegistrationBean(new UEditorServlet(), "/ueditor-1.4/UEditor"); }
config.json路徑:srcmainresourcesueditor-1.4config.json
測試上傳文件的,上傳成功,成功後的路徑是targetclassesueditorjspuploadimage20200615
訪問路徑是
默認的訪問路徑是http://127.0.0.1/ueditor/jsp/...
修改config.json中的上傳保存路徑
將/ueditor/jsp/upload替換爲/litongjava-spring-boot-ueditor/ueditor/jsp/upload,一種有8處
傳入自定義的參數
編輯器有不少可自定義的參數項,在實例化的時候能夠傳入給編輯器:
var ue = UE.getEditor('container', {
autoHeight: false
});
配置項也能夠經過 ueditor.config.js 文件修改,具體的配置方法請看前端配置項說明http://fex.baidu.com/ueditor/...
initialFrameHeight: window.screen.availHeight-300,
通 getContent 和 setContent 方法能夠設置和讀取編輯器的內容
//對編輯器的操做最好在編輯器ready以後再作 ue.ready(function() { //設置編輯器的內容 ue.setContent('hello'); //獲取html內容,返回: <p>hello</p> var html = ue.getContent(); //獲取純文本內容,返回: hello var txt = ue.getContentTxt(); });
詳細文檔
UEditor 官網:http://ueditor.baidu.com
UEditor API 文檔:http://ueditor.baidu.com/doc
UEditor Github 地址:http://github.com/fex-team/ue...
定製工具欄圖標
UEditor 工具欄上的按鈕列表能夠自定義配置,只須要經過修改配置項就能夠實現需求
配置項修改說明
修改配置項的方法:
1.方法一:修改 ueditor.config.js 裏面的 toolbars
2.方法二:實例化編輯器的時候傳入 toolbars 參數
var ue = UE.getEditor('container'{toolbars:[]});
其餘配置項:配置項說明
簡單列表
toolbars: [ ['fullscreen', 'source', 'undo', 'redo', 'bold'] ]
多行列表
toolbars: [ ['fullscreen', 'source', 'undo', 'redo'], ['bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc'] ]
兩行的例子: 自定義工具欄
工具欄按鈕分割線
配置項裏用豎線 '|' 表明分割線
完整的按鈕列表
toolbars: [ [ 'anchor', //錨點 'undo', //撤銷 'redo', //重作 'bold', //加粗 'indent', //首行縮進 'snapscreen', //截圖 'italic', //斜體 'underline', //下劃線 'strikethrough', //刪除線 'subscript', //下標 'fontborder', //字符邊框 'superscript', //上標 'formatmatch', //格式刷 'source', //源代碼 'blockquote', //引用 'pasteplain', //純文本粘貼模式 'selectall', //全選 'print', //打印 'preview', //預覽 'horizontal', //分隔線 'removeformat', //清除格式 'time', //時間 'date', //日期 'unlink', //取消連接 'insertrow', //前插入行 'insertcol', //前插入列 'mergeright', //右合併單元格 'mergedown', //下合併單元格 'deleterow', //刪除行 'deletecol', //刪除列 'splittorows', //拆分紅行 'splittocols', //拆分紅列 'splittocells', //徹底拆分單元格 'deletecaption', //刪除表格標題 'inserttitle', //插入標題 'mergecells', //合併多個單元格 'deletetable', //刪除表格 'cleardoc', //清空文檔 'insertparagraphbeforetable', //"表格前插入行" 'insertcode', //代碼語言 'fontfamily', //字體 'fontsize', //字號 'paragraph', //段落格式 'simpleupload', //單圖上傳 'insertimage', //多圖上傳 'edittable', //表格屬性 'edittd', //單元格屬性 'link', //超連接 'emotion', //表情 'spechars', //特殊字符 'searchreplace', //查詢替換 'map', //Baidu地圖 'gmap', //Google地圖 'insertvideo', //視頻 'help', //幫助 'justifyleft', //居左對齊 'justifyright', //居右對齊 'justifycenter', //居中對齊 'justifyjustify', //兩端對齊 'forecolor', //字體顏色 'backcolor', //背景色 'insertorderedlist', //有序列表 'insertunorderedlist', //無序列表 'fullscreen', //全屏 'directionalityltr', //從左向右輸入 'directionalityrtl', //從右向左輸入 'rowspacingtop', //段前距 'rowspacingbottom', //段後距 'pagebreak', //分頁 'insertframe', //插入Iframe 'imagenone', //默認 'imageleft', //左浮動 'imageright', //右浮動 'attachment', //附件 'imagecenter', //居中 'wordimage', //圖片轉存 'lineheight', //行間距 'edittip ', //編輯提示 'customstyle', //自定義標題 'autotypeset', //自動排版 'webapp', //百度應用 'touppercase', //字母大寫 'tolowercase', //字母小寫 'background', //背景 'template', //模板 'scrawl', //塗鴉 'music', //音樂 'inserttable', //插入表格 'drafts', // 從草稿箱加載 'charts', // 圖表 ] ]
實例化時設置配置項
var ue = UE.getEditor('container', { toolbars: [ ['fullscreen', 'source', 'undo', 'redo', 'bold'] ], autoHeightEnabled: true, autoFloatEnabled: true });
讀取配置項
讀取配置項能夠經過getOpt方法讀取
var lang = ue.getOpt('lang'); //默認返回:zh-cn
前端配置項說明
UEDITOR_HOME_URL {Path String} [默認值:根據config文件路徑自動獲取] // 爲編輯器實例添加一個路徑,這個不能被註釋,筆者使用的值http://localhost:8080/ueditor-1.4/
UEditor 下載包有兩個類型: 源碼包 和 部署包
源碼包包含了 UEditor 的源碼、各後臺的代碼和使用的例子
部署包解壓後的文件目錄結構以下所示
ueditor解壓後的目錄列表
dialogs: 彈出對話框對應的資源和JS文件
lang: 編輯器國際化顯示的文件
php或jsp或asp或net: 涉及到服務器端操做的後臺文件
themes: 樣式圖片和樣式文件
third-party: 第三方插件(包括代碼高亮,源碼編輯等組件)
ueditor.all.js: 開發版代碼合併的結果,目錄下全部文件的打包文件
ueditor.all.min.js: ueditor.all.js文件的壓縮版,建議在正式部署時採用
ueditor.config.js: 編輯器的配置文件,建議和編輯器實例化頁面置於同一目錄
ueditor.parse.js: 編輯的內容顯示頁面引用,會自動加載表格、列表、代碼高亮等樣式,具體看內容展現文檔
ueditor.parse.min.js: ueditor.parse.js文件的壓縮版,建議在內容展現頁正式部署時採用
源碼包解壓後的文件目錄結構以下所示
ueditor解壓後的目錄列表
源碼包部分目錄和文件與部署包名稱一致,用途也會是一致,具體說明以下:
_doc: 部分markdown格式的文檔
_example: ueditor的使用例子
_parse: ueditor.parse.js的源碼,parse的用途具體看內容展現文檔
_src: ueditor.all.js的源碼,打包方法看grunt打包文檔
_srccore: ueditor核心代碼
_srcplugins: 插件文件
_srcui: ui相關文件
_srcadapter: 橋接層文件,對接ueditor核心和ui代碼
php: php後臺文件的目錄
phpconfig.json: 後端配置文件,全部先後端相關配置項,都放在這裏
phpcontroller.php: 接收全部請求的接口文件,經過它判斷action參數,分發具體任務給其餘php文件
phpaction_crawler: 撞去遠程文件的代碼,轉存文件使用
phpaction_upload: 上傳圖片、附件、視頻的處理代碼
phpaction_list: 列出在線的圖片或者是附件
phpUpload.class.php: 上傳文件使用的類
jsp: jsp後臺文件的目錄
jspconfig.json: 後端配置文件,全部先後端相關配置項,都放在這裏
jspcontrooler.jsp: 接收全部請求的接口文件
jsplib: 全部用到的jar包,其中的ueditor-*.jar包是ueditor全部後臺相關處理邏輯的工具
jspsrc: lib裏面的uedior-*jar文件的java源碼
asp: asp後臺文件的目錄
net: .net後臺文件的目錄
App_Code: 上的文件是應用程序的源碼。
Bin: 裏面的是應用程序的依賴庫,當前依賴 Newtonsoft 的 Json 庫。Bin 目錄和 App_Code 目錄受應用程序保護,不用擔憂被用戶訪問到。
config.json: 是 UEditor 後端的配置文件,上一節已經介紹了比較重要的配置項。
controller.ashx: 是 UEditor 請求的入口,它把不一樣的 action 分發到不一樣的 Handler 來處理。
net.sln: 是項目的解決方案文件,安裝 Visual Studio 2013 或以上的機器能夠打開進行項目的改造。
README.md: 是net後臺使用文件。
Web.config: 是應用程序的配置文件
dialogs: 同部署包說明
lang: 同部署包說明
themes: 同部署包說明
third-party: 同部署包說明
changelog.md: 各版本的ueditor更新記錄
Gruntfile.js: grunt執行的任務文件,用來把源碼包打包成部署版本,打包方法看grunt打包文檔
LICENSE: 開源協議說明證書,ueditor使用MIT開源協議
ueditor.config.js: 前端配置文件
ueditor.parse.js: 還沒合併時使用的parse文件,會自動加載_parse裏面的文件
1.按照部署編輯器的教程,完成編輯器加載
2.把容器放到form表單裏面,設置好要提交的路徑,以下面代碼中的<form>標籤
3.在script 中添加一個name值
<body> <form action="server.php" method="post"> <!-- 加載編輯器的容器 --> <script id="container" name="content" type="text/plain"> 這裏寫你的初始化內容 </script> </form> <!-- 配置文件 --> <script type="text/javascript" src="ueditor.config.js"></script> <!-- 編輯器源碼文件 --> <script type="text/javascript" src="ueditor.all.js"></script> <!-- 實例化編輯器 --> <script type="text/javascript"> var editor = UE.getEditor('container'); </script> </body>
你們使用 UEditor 是爲了讓用戶能在頁面中編輯富文本內容,但這應該只是手段方法。咱們最終的目的是爲了呈現用戶編輯的內容。也就是內容的展現。原來咱們對這塊是不考慮的,只關注在編輯端。但隨着編輯器產出內容的增長和複雜化,好比圖表展現,代碼高亮,自定義的列表標號等等,若是都在最終產出的編輯數據中處理,那勢必會致使產出數據帶有冗餘內容,並且也很大程度上硬編碼了展現時定製效果。基於這些問題,uparse產生了。
1.在下載包中找到ueditor.parse.js
2.根據你的路徑加載uparse.js
<head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <script src="../ueditor.parse.js"></script> <title></title> </head>
將uparse.js記載到頁面,不一樣目錄結構,路徑不一樣.
當加載了uparse.js後,就能夠調用uParse這個函數,執行內容解析了。
//uParse的語法 uParse(cssSelector,[options]) cssSelector,是告訴uParse你將編輯數據放到那個容器裏了,好比你放到一個div裏 <div id="content"> <p>dsfsdF</p> <p>sdsdf</p> </div>
cssSelector就是#content,如今支持3種格式,tag,id,class.也就是你能夠渲染頁面中多個地方。options是個json對象。基於1.3.5版本,可配置的參數。
{ rootPath: '', //ueditor所在的路徑,這個要給出,讓uparse能找到third-party目錄 //由於須要引入目錄下的那些js文件,固然會根據你的編輯數據,按需加載 liiconpath: 'http://bs.baidu.com/listicon/', //自定義列表標號圖片的地址,默認是這個地址 listDefaultPaddingLeft: '20' //自定義列表標號與文字的橫向間距 }
通常只要給個rootPath就夠了,其餘的均可以使用默認值。通常在頁面底部加入以下代碼
uParse('.content', { rootPath: '../' })
這個表示對於className是content的容器裏邊的內容進行解析。
完整js以下
<head> <meta charset="UTF-8"> <title></title> <script src="ueditor-1.4/ueditor.parse.js" type="text/javascript" charset="utf-8"></script> </head> <body> <div id="content"> <p>我是李通</p> <p>我是一個90後程序員</p> </div> <script type="text/javascript"> uParse('content', { rootPaht: './ueditor-1.4' }) </script> </body>
顯示以下
生產環境中確定是從後端獲取內容添加div中進行展現
界面內容以下
<!DOCTYPE html> <html> <!-- 做者:litongjava@qq.com 時間:2019-02-21 描述:收集用戶的不滿意緣由 --> <head> <meta charset="UTF-8"> <!--編輯器默認配置文件--> <script src="../ueditor-1.4/ueditor.config.js" type="text/javascript" charset="utf-8"></script> <!--編輯器源碼文件--> <script src="../ueditor-1.4/ueditor.all.js" type="text/javascript" charset="utf-8"></script> <!--jquery--> <script src="../js/jquery-1.9.1.min.js" type="text/javascript" charset="utf-8"></script> <!--工程變量--> <script src="../js/project.js" type="text/javascript" charset="utf-8"></script> <!--base64 client--> <script src="../js/base64Client.js" type="text/javascript" charset="utf-8"></script> <!--ajax--> <script src="../js/ajax.js" type="text/javascript" charset="utf-8"></script> <!--郵箱提示--> <script src="../js/autofillmail.js" type="text/javascript" charset="utf-8"></script> <link rel="stylesheet" href="../layui/css/layui.css" media="all" /> <style> * { font-family: "微軟雅黑"; margin: 0; padding: 0; } ul, li { list-style: none; } .inputElem { height: 22px; line-height: 22px; border: 1px solid #ff4455; } .auto-tip li { width: 100%; height: 30px; line-height: 30px; font-size: 16px; background: #eee; } .auto-tip li.hoverBg { background: #ddd; cursor: pointer; } .auto-tip li .em { color: #FF0000; } .red { color: #000000; } .hidden { display: none; } form { padding: 15px; } </style> <script type="text/javascript"> window.onload = function() { //初始化提示插件 new EmailAutoComplete({ parentCls: '.parentemail', // 當前input元素的父級類 targetCls: '.email', // 目標input元素 }); } </script> </head> <body> <form class="layui-form" action="reason" method="post"> <input type="hidden" name="sessionid" /> <div class="layui-form-item"> <label class="layui-form-label">郵箱</label> <div class="layui-input-block"> <div class="parentemail"> <input type="text" name="email" lay-verify="title" autocomplete="off" placeholder="請輸入郵箱" class="layui-input email"> </div> </div> </div> <div class="layui-form-item" id="phone"> <label class="layui-form-label">手機號</label> <div class="layui-input-block"> <input type="text" name="phone" lay-verify="title" autocomplete="off" placeholder="請輸入手機號" class="layui-input"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">用戶問題</label> <div class="layui-input-block"> <input type="text" name="userQuestion" lay-verify="title" autocomplete="off" placeholder="請輸入標題" class="layui-input" readonly="readonly"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">標準問題</label> <div class="layui-input-block"> <input type="text" name="question" lay-verify="title" autocomplete="off" placeholder="請輸入標題" class="layui-input" readonly="readonly"> </div> </div> <div class="layui-form-item layui-form-text"> <label class="layui-form-label">答案</label> <div class="layui-input-block"> <textarea placeholder="請輸入內容" name="answer" class="layui-textarea" readonly="readonly"></textarea> </div> </div> <div class="layui-form-item layui-form-text"> <label class="layui-form-label">緣由</label> <div class="layui-input-block"> <script id="container" name="reason" type="text/plain"></script> </div> </div> <div class="layui-form-item"> <div class="layui-input-block"> <button class="layui-btn" lay-submit="" lay-filter="demo1">當即提交</button> </div> </div> </form> </body> <script src="../layui/layui.all.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> $(function() { layui.form.render(); }) UE.Editor.prototype.placeholder = function(justPlainText) { var _editor = this; _editor.addListener("focus", function() { var localHtml = _editor.getPlainTxt(); if($.trim(localHtml) === $.trim(justPlainText)) { _editor.setContent(" "); } }); _editor.addListener("blur", function() { var localHtml = _editor.getContent(); if(!localHtml) { _editor.setContent(justPlainText); } }); _editor.ready(function() { _editor.fireEvent("blur"); }); }; var ue = UE.getEditor('container'); ue.placeholder("請輸入你不滿意的緣由"); var msg = getQueryVariable("msg"); fill(msg); var sessionid = getQueryVariable("sessionid"); if(project.dev()) { console.log("sessionid=" + sessionid); } document.getElementsByName("sessionid")[0].value = sessionid; /** * 獲取http請求參數 * @param {Object} variable */ function getQueryVariable(variable) { var query = window.location.search.substring(1); var vars = query.split("&"); for(var i = 0; i < vars.length; i++) { var pair = vars[i].split("="); if(pair[0] == variable) { //base64編碼以後包含==號 var retval = ""; for(var j = 1; j < pair.length; j++) { retval += pair[j]; } retval = decodeURIComponent(retval); //進行URL解碼 return retval; } } return(false); } /** * 填充問題和答案 * @param {Object} msg */ function fill(msg) { if(!msg) { return false; } var array = msg.split(' '); //split char space var userQuestionBase64 = array[2]; var questionBase64 = array[3]; var answerBase64 = array[4]; if(project.dev()) { console.log("user question:" + userQuestionBase64); console.log("question:" + questionBase64); console.log("answer:" + answerBase64); } base64Client.decode(userQuestionBase64, 'GBK', function(text) { document.getElementsByName("userQuestion")[0].value = text; }); base64Client.decode(questionBase64, 'GBK', function(text) { document.getElementsByName("question")[0].value = text; }); base64Client.decode(answerBase64, 'GBK', function(text) { document.getElementsByName("answer")[0].value = text; }); } $(function() { var uri = ajax.getRootName() + "/config/getProjectVariable?key=project.collect.phone"; ajax.get(uri, function(data) { if(data === 'false') { $("#phone").hide(); } }); })