示例:使用quill富文本編輯器的插件,自定義formData圖片上傳
>[info]官網地址:[https://quilljs.com](https://quilljs.com/)
項目需求:自帶的上傳圖片是base64,直接入庫的話,請求頭太長,導致網頁十分十分的卡,所以才改用formData自定義上傳(改完之后,相當于覆蓋了他本身自帶的上傳按鈕,圖標是一樣的,就是說在外觀上看不出來變化)
[toc]
## :-: **效果圖**
- 剛引入好,的效果圖

- 當文本框中沒有任何內容的時候,`quill.container.firstChild.innerHTML`默認為 `<p><br></p>`

- 上傳圖片后,的效果
代碼是沒問題的,因為我這是本地測試,圖片只能傳到固定的某個盤了,懶的改了...

- 上傳視頻后,的效果

## :-: **前端代碼**
``` html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title>QuillDemo</title>
<link href="//cdn.quilljs.com/1.3.6/quill.snow.css" rel="stylesheet">
<link href="//cdn.quilljs.com/1.3.6/quill.bubble.css" rel="stylesheet">
<style>
body {
padding: 10px 30px;
}
#editor {
min-height: 180px;
}
</style>
</head>
<body>
<form method="POST" action="test.php">
<div>
<!--當toolbar以container的形式注冊時需要顯式地寫出這些標簽-->
<div id="editor_header" style="display: none;">
<!--字體大小-->
<select class="ql-size">
<option value="small"></option>
<!-- 默認按鈕 -->
<option selected></option>
<option value="large"></option>
<option value="huge"></option>
</select>
<!--加粗按鈕-->
<button class="ql-bold"></button>
<!--上標、下標按鈕-->
<button class="ql-script" value="sub"></button>
<button class="ql-script" value="super"></button>
<!--自定義按鈕-->
<button id="my_button"></button>
</div>
<div id="editor" class="showContent">
<!--回顯的內容,庫中查出來的放這-->
<!--可以直接在指定元素內加入文本或者html標簽-->
哈哈哈哈
</div>
<input type="hidden" id="richText" name="richText" style="display: none;" value="" /> <!--用于form表單提交-->
</div>
<form enctype="multipart/form-data" id="imgFrom">
<!-- this.files[0] 圖片列表的第0項,也就是當前選擇的圖片 -->
<input type="file" onchange="updateImg(this.files[0])" id="imgData" style="display: none;">
</form>
<br />
<input type="submit" value="提交" id="su" onclick="submitData()" /> <!--id用于form表單時,將富文本編輯器的值,賦給隱藏域-->
</form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
<script src="//cdn.quilljs.com/1.3.6/quill.js"></script>
<script>
/* 編輯器操作條選項 */
var toolbarOptions = [
['bold', 'italic', 'underline', 'strike'], //開關按鈕
['blockquote', 'code-block'],
[{'header': 1}, {'header': 2}], //自定義按鈕值
[{'list': 'ordered'}, {'list': 'bullet'}],
[{'script': 'sub'}, {'script': 'super'}], // 上標/下標
[{'indent': '-1'}, {'indent': '+1'}], // 減少縮進/縮進
[{'direction': 'rtl'}], // 文本方向
[{'size': ['small', false, 'large', 'huge']}], // 自定義下拉
[{'header': [1, 2, 3, 4, 5, 6, false]}],
[{'color': []}, {'background': []}], //使用主題的默認下拉
[{'font': []}],
[{'align': []}],
['clean'], //移除格式化
['image'],
['video'],
['formula'] //需要加載cdnjs.cloudflare.com/ajax/libs/KaTeX/0.7.1/katex.min.js
];
/* 實例化編輯器 */
var quill = new Quill('#editor', {
/*debug: 'info',*/
modules: {
//formula: true, //公式;需要加載cdnjs.cloudflare.com/ajax/libs/KaTeX/0.7.1/katex.min.js
//syntax: true, //高亮;需要加載cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js
/*toolbar: {
container:"#editor_header"
}*/ // 或者 toolbar :'#editor_header'
toolbar:toolbarOptions //指定編輯器操作條
},
theme: 'snow', //主題,有兩種,snow和bubble
placeholder:'請輸入',
readOnly: false
});
//修改樣式
var Align = Quill.import('attributors/style/align');
Align.whitelist = ['right', 'center', 'justify'];
Quill.register(Align, true);
/* 傳入布爾值,控制編輯器是否可用 */
quill.enable();
//quill.blur(); //失去焦點
//quill.focus(); //獲得焦點
/* 事件的綁定;注意:text-change這個獲取值放這的話是編輯器內容發生改變的時候才能獲取到值,如果想每次提交都有值,要放到提交那 */
quill.on('text-change', function(delta, oldDelta, source) {
// console.log(delta); //當前輸入的
// console.log(oldDelta); //上一次輸入的
// console.log(source);
//res = quill.container.firstChild.innerHTML; //獲取當前富文本編輯器實例的內容(帶html標簽)
//console.log(res);
});
/* 自定義按鈕 */
var myBtn = document.querySelector("#my_button");
myBtn.addEventListener("click",function(){
//console.log('my-btn')
});
//【自定義上傳圖片1】通過addHander來監聽image事件
let toolbar = quill.getModule('toolbar');
toolbar.addHandler('image', () => {
document.getElementById('imgData').click();
});
//【自定義上傳圖片2】發送ajax處理好圖片
function updateImg(file){
var formData = new FormData();
formData.append('avatar', file); //追加的自定義節點,第一個參數:php用$_FILES接收時的key;第2個參數:當前圖片
console.log(formData.get("avatar")); //打印當前圖片的信息
$.ajax({ //發送ajax
url:'index.php', //url
type:'post', //以post發送
data:formData, //要發送的數據。后端接收$_POST['user']
dataType:'json', //返回的數據類型
cache:false,
traditional: true,
contentType: false,
processData: false,
success:function(res){
console.log(res);
//圖片上傳成功之后的回調
const range = quill.getSelection();
if (range) {
quill.insertEmbed(range.index, 'image',""+res); //將上傳好的圖片,插入到富文本的range.index(當前光標處)
}
}
});
};
//form表單的提交
function submitData(){
res = quill.container.firstChild.innerHTML; //獲取當前富文本編輯器實例的內容(帶html標簽)
console.log(res); //獲取當前富文本編輯器實例的內容(帶html標簽)
$("#richText").val(res);
};
</script>
</body>
</html>
```
## :-: **后端代碼**
~~~ php
<?php
//header("content-type:text/html;charset=utf-8"); //設置編碼
$filePath = 'e:/'.date("Y-m-d").'.png'; //上傳到哪個位置
$uploadUrl = move_uploaded_file($_FILES['avatar']['tmp_name'],$filePath); //【關鍵在這,上傳文件】
$addr = 'http://'.$filePath;
echo json_encode($addr);
?>
~~~
后端接收到的,整個富文本編輯器中的內容(帶html標簽的),直接入庫即可
- 雜談
- 開發 & 維護的工作流程
- 新手如何看php手冊 和 框架手冊
- 開發 & 維護的不同點
- 從0到1,搭建新項目的工作流程
- 從1到N,維護的工作流程
- 優化流程
- 生成錯誤日志和慢日志的方法
- 查錯思路
- 怎么快速接手一個項目
- 前端常用知識點
- javascript
- 自己封裝的函數
- 處理數字
- 功能代碼
- 動態添加圖片
- 判斷是手機端還是pc端
- javascript:;是什么意思?怎么用呢
- html & h5
- a標簽中target設置為blank和_blank有什么區別?
- 亂碼
- 提交方式:button標簽 和 input
- 塊元素
- 內聯元素
- h5特有屬性
- h5的localStorage【增、刪、改、查】
- jquery
- 常用方法
- 功能代碼
- 動態刪除圖片
- 一個按鈕,切換2種狀態
- 換膚
- 深入理解(function(){... })();
- json & xml
- json
- 語法速記
- json對象取值
- 字符串、對象、數組的區別
- xml
- [CDATA[%s]]的作用是什么
- 轉義字符
- CDATA 想被xml解析的文本數據
- CDATA 不想被xml解析的文本數據
- 微信小程序
- 其他
- websocket
- 跨域
- css
- 行內 & 內連 & 外連 寫法
- 優先級
- 更加精準的匹配
- 使用百分比如何生效
- php在html、js、jq中的的原生寫法
- *php在html中的語法
- php在js中的語法
- php在jq中的語法
- 正則表達式
- php常用基礎知識(思想為主)
- php為什么是“邊編譯邊運行”
- 冒號、endif、endwhile、endfor使用
- 遞歸思想(速記法)
- cookie和session的理解
- php常用內置(系統)函數
- 常量
- 字符串
- 數組
- 日期時間
- 文件 & 目錄
- 數學
- 程序執行
- 判斷
- 選項和信息(修改配置文件的)
- 錯誤處理 & 日志記錄
- 編碼格式
- session
- IP相關
- 類 & 對象
- 性能
- 其他函數
- 魔術方法
- $_SERVER
- 變量處理
- php自己封裝的一些函數
- 導入、導出、生成文件
- 數組
- 數字
- 字符串
- 其他
- 獲取linux硬件信息
- 常見插件/類庫使用
- 前端-框架/插件
- bootstrap 學習筆記
- layer 學習筆記
- layDate 學習筆記
- 百度ueditor1.4.4.3富文本編輯器
- quill富文本編輯器
- 百度ECharts圖形報表
- webuploader上傳圖片
- 后端類庫
- workerman 聊天室
- QRCODE 二維碼
- redis
- seaslog 日志
- phpspider 爬蟲
- Mailer 發送郵件
- simple_html_dom
- phpstorm使用
- 快捷鍵
- 連接mysql數據庫
- 斷點 + debug調試
- 運行內存不夠
- wamp環境
- yii、laravel、tp、開發自己的php框架
- 看框架源碼的思路
- tp5框架的使用
- 1、助手函數原理解析
- 開發自己的php框架
- 常用的開發思路 和 小功能實現代碼
- 爬蟲思路
- 功能點思路
- tp5判斷是不是異地登錄(簡單版)
- 微信開發,反向代理
- 微信開發,關閉當前頁面
- 消息隊列的實現
- 頁面靜態化
- session串號
- 站內信設計思路
- web在線管理器
- 語言相關(開發有關)
- 接收json(text/xml)格式數據
- 原生文件上傳(狀態碼)
- openssl擴展
- 打印對象 和 遍歷對象
- 使用OB緩存的幾個原則
- CLI模式執行php文件
- foreach時,添加元素 或 修改元素的值
- 功能點 代碼實現
- 生成url目錄樹(沒有pid)
- 多圖上傳(vue傳base64)
- 下載文件,耗時算法
- 生成商品二維碼
- 導出excel
- 搜索
- 阿里大魚發短信
- 使用阿里云oss
- location.href跳轉后,丟失用戶的session
- “\r ” “\r\n” “\t”的區別
- php的配置文件詳解
- 開啟錯誤日志
- 開啟慢日志
- 開啟短標簽
- 分析php-fpm.conf中的request_terminate_timeout參數