久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

laravel-admin引用wangEditor编辑器 使用二:上传视频/音频(2)

發(fā)布時(shí)間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 laravel-admin引用wangEditor编辑器 使用二:上传视频/音频(2) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

完整的wangEditor.js代碼

(function (global, factory) {typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :typeof define === 'function' && define.amd ? define(factory) :(global.wangEditor = factory()); }(this, (function () { 'use strict';/*poly-fill */var polyfill = function () {// Object.assignif (typeof Object.assign != 'function') {Object.assign = function (target, varArgs) {// .length of function is 2if (target == null) {// TypeError if undefined or nullthrow new TypeError('Cannot convert undefined or null to object');}var to = Object(target);for (var index = 1; index < arguments.length; index++) {var nextSource = arguments[index];if (nextSource != null) {// Skip over if undefined or nullfor (var nextKey in nextSource) {// Avoid bugs when hasOwnProperty is shadowedif (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {to[nextKey] = nextSource[nextKey];}}}}return to;};}// IE 中兼容 Element.prototype.matchesif (!Element.prototype.matches) {Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) {var matches = (this.document || this.ownerDocument).querySelectorAll(s),i = matches.length;while (--i >= 0 && matches.item(i) !== this) {}return i > -1;};}};/*DOM 操作 API */// 根據(jù) html 代碼片段創(chuàng)建 dom 對(duì)象function createElemByHTML(html) {var div = void 0;div = document.createElement('div');div.innerHTML = html;return div.children;}// 是否是 DOM Listfunction isDOMList(selector) {if (!selector) {return false;}if (selector instanceof HTMLCollection || selector instanceof NodeList) {return true;}return false;}// 封裝 document.querySelectorAllfunction querySelectorAll(selector) {var result = document.querySelectorAll(selector);if (isDOMList(result)) {return result;} else {return [result];}}// 記錄所有的事件綁定var eventList = [];// 創(chuàng)建構(gòu)造函數(shù)function DomElement(selector) {if (!selector) {return;}// selector 本來(lái)就是 DomElement 對(duì)象,直接返回if (selector instanceof DomElement) {return selector;}this.selector = selector;var nodeType = selector.nodeType;// 根據(jù) selector 得出的結(jié)果(如 DOM,DOM List)var selectorResult = [];if (nodeType === 9) {// document 節(jié)點(diǎn)selectorResult = [selector];} else if (nodeType === 1) {// 單個(gè) DOM 節(jié)點(diǎn)selectorResult = [selector];} else if (isDOMList(selector) || selector instanceof Array) {// DOM List 或者數(shù)組selectorResult = selector;} else if (typeof selector === 'string') {// 字符串selector = selector.replace('/\n/mg', '').trim();if (selector.indexOf('<') === 0) {// 如 <div>selectorResult = createElemByHTML(selector);} else {// 如 #id .classselectorResult = querySelectorAll(selector);}}var length = selectorResult.length;if (!length) {// 空數(shù)組return this;}// 加入 DOM 節(jié)點(diǎn)var i = void 0;for (i = 0; i < length; i++) {this[i] = selectorResult[i];}this.length = length;}// 修改原型DomElement.prototype = {constructor: DomElement,// 類數(shù)組,forEachforEach: function forEach(fn) {var i = void 0;for (i = 0; i < this.length; i++) {var elem = this[i];var result = fn.call(elem, elem, i);if (result === false) {break;}}return this;},// cloneclone: function clone(deep) {var cloneList = [];this.forEach(function (elem) {cloneList.push(elem.cloneNode(!!deep));});return $(cloneList);},// 獲取第幾個(gè)元素get: function get(index) {var length = this.length;if (index >= length) {index = index % length;}return $(this[index]);},// 第一個(gè)first: function first() {return this.get(0);},// 最后一個(gè)last: function last() {var length = this.length;return this.get(length - 1);},// 綁定事件on: function on(type, selector, fn) {// selector 不為空,證明綁定事件要加代理if (!fn) {fn = selector;selector = null;}// type 是否有多個(gè)var types = [];types = type.split(/\s+/);return this.forEach(function (elem) {types.forEach(function (type) {if (!type) {return;}// 記錄下,方便后面解綁eventList.push({elem: elem,type: type,fn: fn});if (!selector) {// 無(wú)代理elem.addEventListener(type, fn);return;}// 有代理elem.addEventListener(type, function (e) {var target = e.target;if (target.matches(selector)) {fn.call(target, e);}});});});},// 取消事件綁定off: function off(type, fn) {return this.forEach(function (elem) {elem.removeEventListener(type, fn);});},// 獲取/設(shè)置 屬性attr: function attr(key, val) {if (val == null) {// 獲取值return this[0].getAttribute(key);} else {// 設(shè)置值return this.forEach(function (elem) {elem.setAttribute(key, val);});}},// 添加 classaddClass: function addClass(className) {if (!className) {return this;}return this.forEach(function (elem) {var arr = void 0;if (elem.className) {// 解析當(dāng)前 className 轉(zhuǎn)換為數(shù)組arr = elem.className.split(/\s/);arr = arr.filter(function (item) {return !!item.trim();});// 添加 classif (arr.indexOf(className) < 0) {arr.push(className);}// 修改 elem.classelem.className = arr.join(' ');} else {elem.className = className;}});},// 刪除 classremoveClass: function removeClass(className) {if (!className) {return this;}return this.forEach(function (elem) {var arr = void 0;if (elem.className) {// 解析當(dāng)前 className 轉(zhuǎn)換為數(shù)組arr = elem.className.split(/\s/);arr = arr.filter(function (item) {item = item.trim();// 刪除 classif (!item || item === className) {return false;}return true;});// 修改 elem.classelem.className = arr.join(' ');}});},// 修改 csscss: function css(key, val) {var currentStyle = key + ':' + val + ';';return this.forEach(function (elem) {var style = (elem.getAttribute('style') || '').trim();var styleArr = void 0,resultArr = [];if (style) {// 將 style 按照 ; 拆分為數(shù)組styleArr = style.split(';');styleArr.forEach(function (item) {// 對(duì)每項(xiàng)樣式,按照 : 拆分為 key 和 valuevar arr = item.split(':').map(function (i) {return i.trim();});if (arr.length === 2) {resultArr.push(arr[0] + ':' + arr[1]);}});// 替換或者新增resultArr = resultArr.map(function (item) {if (item.indexOf(key) === 0) {return currentStyle;} else {return item;}});if (resultArr.indexOf(currentStyle) < 0) {resultArr.push(currentStyle);}// 結(jié)果elem.setAttribute('style', resultArr.join('; '));} else {// style 無(wú)值elem.setAttribute('style', currentStyle);}});},// 顯示show: function show() {return this.css('display', 'block');},// 隱藏hide: function hide() {return this.css('display', 'none');},// 獲取子節(jié)點(diǎn)children: function children() {var elem = this[0];if (!elem) {return null;}return $(elem.children);},// 獲取子節(jié)點(diǎn)(包括文本節(jié)點(diǎn))childNodes: function childNodes() {var elem = this[0];if (!elem) {return null;}return $(elem.childNodes);},// 增加子節(jié)點(diǎn)append: function append($children) {return this.forEach(function (elem) {$children.forEach(function (child) {elem.appendChild(child);});});},// 移除當(dāng)前節(jié)點(diǎn)remove: function remove() {return this.forEach(function (elem) {if (elem.remove) {elem.remove();} else {var parent = elem.parentElement;parent && parent.removeChild(elem);}});},// 是否包含某個(gè)子節(jié)點(diǎn)isContain: function isContain($child) {var elem = this[0];var child = $child[0];return elem.contains(child);},// 尺寸數(shù)據(jù)getSizeData: function getSizeData() {var elem = this[0];return elem.getBoundingClientRect(); // 可得到 bottom height left right top width 的數(shù)據(jù)},// 封裝 nodeNamegetNodeName: function getNodeName() {var elem = this[0];return elem.nodeName;},// 從當(dāng)前元素查找find: function find(selector) {var elem = this[0];return $(elem.querySelectorAll(selector));},// 獲取當(dāng)前元素的 texttext: function text(val) {if (!val) {// 獲取 textvar elem = this[0];return elem.innerHTML.replace(/<.*?>/g, function () {return '';});} else {// 設(shè)置 textreturn this.forEach(function (elem) {elem.innerHTML = val;});}},// 獲取 htmlhtml: function html(value) {var elem = this[0];if (value == null) {return elem.innerHTML;} else {elem.innerHTML = value;return this;}},// 獲取 valueval: function val() {var elem = this[0];return elem.value.trim();},// focusfocus: function focus() {return this.forEach(function (elem) {elem.focus();});},// parentparent: function parent() {var elem = this[0];return $(elem.parentElement);},// parentUntil 找到符合 selector 的父節(jié)點(diǎn)parentUntil: function parentUntil(selector, _currentElem) {var results = document.querySelectorAll(selector);var length = results.length;if (!length) {// 傳入的 selector 無(wú)效return null;}var elem = _currentElem || this[0];if (elem.nodeName === 'BODY') {return null;}var parent = elem.parentElement;var i = void 0;for (i = 0; i < length; i++) {if (parent === results[i]) {// 找到,并返回return $(parent);}}// 繼續(xù)查找return this.parentUntil(selector, parent);},// 判斷兩個(gè) elem 是否相等equal: function equal($elem) {if ($elem.nodeType === 1) {return this[0] === $elem;} else {return this[0] === $elem[0];}},// 將該元素插入到某個(gè)元素前面insertBefore: function insertBefore(selector) {var $referenceNode = $(selector);var referenceNode = $referenceNode[0];if (!referenceNode) {return this;}return this.forEach(function (elem) {var parent = referenceNode.parentNode;parent.insertBefore(elem, referenceNode);});},// 將該元素插入到某個(gè)元素后面insertAfter: function insertAfter(selector) {var $referenceNode = $(selector);var referenceNode = $referenceNode[0];if (!referenceNode) {return this;}return this.forEach(function (elem) {var parent = referenceNode.parentNode;if (parent.lastChild === referenceNode) {// 最后一個(gè)元素parent.appendChild(elem);} else {// 不是最后一個(gè)元素parent.insertBefore(elem, referenceNode.nextSibling);}});}};// new 一個(gè)對(duì)象function $(selector) {return new DomElement(selector);}// 解綁所有事件,用于銷毀編輯器$.offAll = function () {eventList.forEach(function (item) {var elem = item.elem;var type = item.type;var fn = item.fn;// 解綁elem.removeEventListener(type, fn);});};/*配置信息 */var config = {// 默認(rèn)菜單配置menus: ['head', 'bold', 'italic', 'underline', 'strikeThrough', 'foreColor', 'backColor', 'link', 'list', 'justify', 'quote', 'emoticon', 'image', 'table', 'video', 'code', 'undo', 'redo'],colors: ['#000000', '#eeece0', '#1c487f', '#4d80bf', '#c24f4a', '#8baa4a', '#7b5ba1', '#46acc8', '#f9963b', '#ffffff'],// // 語(yǔ)言配置// lang: {// '設(shè)置標(biāo)題': 'title',// '正文': 'p',// '鏈接文字': 'link text',// '鏈接': 'link',// '插入': 'insert',// '創(chuàng)建': 'init'// },// 表情emotions: [{// tab 的標(biāo)題title: '默認(rèn)',// type -> 'emoji' / 'image'type: 'image',// content -> 數(shù)組content: [{alt: '[壞笑]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/50/pcmoren_huaixiao_org.png'}, {alt: '[舔屏]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/40/pcmoren_tian_org.png'}, {alt: '[污]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/pcmoren_wu_org.png'}, {alt: '[允悲]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/2c/moren_yunbei_org.png'}, {alt: '[笑而不語(yǔ)]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3a/moren_xiaoerbuyu_org.png'}, {alt: '[費(fèi)解]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/moren_feijie_org.png'}, {alt: '[憧憬]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/37/moren_chongjing_org.png'}, {alt: '[并不簡(jiǎn)單]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/fc/moren_bbjdnew_org.png'}, {alt: '[微笑]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/5c/huanglianwx_org.gif'}, {alt: '[酷]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/8a/pcmoren_cool2017_org.png'}, {alt: '[嘻嘻]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/0b/tootha_org.gif'}, {alt: '[哈哈]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6a/laugh.gif'}, {alt: '[可愛(ài)]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/14/tza_org.gif'}, {alt: '[可憐]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/af/kl_org.gif'}, {alt: '[挖鼻]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/0b/wabi_org.gif'}, {alt: '[吃驚]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/f4/cj_org.gif'}, {alt: '[害羞]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6e/shamea_org.gif'}, {alt: '[擠眼]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/c3/zy_org.gif'}, {alt: '[閉嘴]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/29/bz_org.gif'}, {alt: '[鄙視]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/71/bs2_org.gif'}, {alt: '[愛(ài)你]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6d/lovea_org.gif'}, {alt: '[淚]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/9d/sada_org.gif'}, {alt: '[偷笑]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/19/heia_org.gif'}, {alt: '[親親]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/8f/qq_org.gif'}, {alt: '[生病]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/b6/sb_org.gif'}, {alt: '[太開(kāi)心]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/58/mb_org.gif'}, {alt: '[白眼]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/d9/landeln_org.gif'}, {alt: '[右哼哼]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/98/yhh_org.gif'}, {alt: '[左哼哼]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6d/zhh_org.gif'}, {alt: '[噓]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/a6/x_org.gif'}, {alt: '[衰]',src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/af/cry.gif'}]}// , {// // tab 的標(biāo)題// title: '新浪',// // type -> 'emoji' / 'image'// type: 'image',// // content -> 數(shù)組// content: [{// src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/7a/shenshou_thumb.gif',// alt: '[草泥馬]'// }, {// src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/60/horse2_thumb.gif',// alt: '[神馬]'// }, {// src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/bc/fuyun_thumb.gif',// alt: '[浮云]'// }, {// src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/c9/geili_thumb.gif',// alt: '[給力]'// }, {// src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/f2/wg_thumb.gif',// alt: '[圍觀]'// }, {// src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/70/vw_thumb.gif',// alt: '[威武]'// }, {// src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/6e/panda_thumb.gif',// alt: '[熊貓]'// }, {// src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/81/rabbit_thumb.gif',// alt: '[兔子]'// }, {// src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/bc/otm_thumb.gif',// alt: '[奧特曼]'// }, {// src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/15/j_thumb.gif',// alt: '[囧]'// }, {// src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/89/hufen_thumb.gif',// alt: '[互粉]'// }, {// src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/c4/liwu_thumb.gif',// alt: '[禮物]'// }]// }, {// // tab 的標(biāo)題// title: 'emoji',// // type -> 'emoji' / 'image'// type: 'emoji',// // content -> 數(shù)組// content: '\ud83d\ude05 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'.split(/\s/)// }],// 編輯區(qū)域的 z-indexzIndex: 10000,// 是否開(kāi)啟 debug 模式(debug 模式下錯(cuò)誤會(huì) throw error 形式拋出)debug: false,// 插入鏈接時(shí)候的格式校驗(yàn)linkCheck: function linkCheck(text, link) {// text 是插入的文字// link 是插入的鏈接return true; // 返回 true 即表示成功// return '校驗(yàn)失敗' // 返回字符串即表示失敗的提示信息},// 插入網(wǎng)絡(luò)圖片的校驗(yàn)linkImgCheck: function linkImgCheck(src) {// src 即圖片的地址return true; // 返回 true 即表示成功// return '校驗(yàn)失敗' // 返回字符串即表示失敗的提示信息},// 粘貼過(guò)濾樣式,默認(rèn)開(kāi)啟pasteFilterStyle: true,// 對(duì)粘貼的文字進(jìn)行自定義處理,返回處理后的結(jié)果。編輯器會(huì)將處理后的結(jié)果粘貼到編輯區(qū)域中。// IE 暫時(shí)不支持pasteTextHandle: function pasteTextHandle(content) {// content 即粘貼過(guò)來(lái)的內(nèi)容(html 或 純文本),可進(jìn)行自定義處理然后返回return content;},// onchange 事件// onchange: function (html) {// // html 即變化之后的內(nèi)容// console.log(html)// },// 是否顯示添加網(wǎng)絡(luò)圖片的 tabshowLinkImg: true,// 插入網(wǎng)絡(luò)圖片的回調(diào)linkImgCallback: function linkImgCallback(url) {// console.log(url) // url 即插入圖片的地址},// 默認(rèn)上傳圖片 max size: 5MuploadImgMaxSize: 100 * 1024 * 1024,// 配置一次最多上傳幾個(gè)圖片// uploadImgMaxLength: 5,// 上傳圖片,是否顯示 base64 格式uploadImgShowBase64: false,// 上傳圖片,server 地址(如果有值,則 base64 格式的配置則失效)// uploadImgServer: '/upload',// 自定義配置 filenameuploadFileName: '',// 上傳圖片的自定義參數(shù)uploadImgParams: {// token: 'abcdef12345'},// 上傳圖片的自定義headeruploadImgHeaders: {// 'Accept': 'text/x-json'},// 配置 XHR withCredentialswithCredentials: false,// 自定義上傳圖片超時(shí)時(shí)間 msuploadImgTimeout: 5*60*1000,// 上傳圖片 hookuploadImgHooks: {// customInsert: function (insertLinkImg, result, editor) {// console.log('customInsert')// // 圖片上傳并返回結(jié)果,自定義插入圖片的事件,而不是編輯器自動(dòng)插入圖片// const data = result.data1 || []// data.forEach(link => {// insertLinkImg(link)// })// },before: function before(xhr, editor, files) {// 圖片上傳之前觸發(fā)// 如果返回的結(jié)果是 {prevent: true, msg: 'xxxx'} 則表示用戶放棄上傳// return {// prevent: true,// msg: '放棄上傳'// }},success: function success(xhr, editor, result) {// 圖片上傳并返回結(jié)果,圖片插入成功之后觸發(fā)},fail: function fail(xhr, editor, result) {// 圖片上傳并返回結(jié)果,但圖片插入錯(cuò)誤時(shí)觸發(fā)},error: function error(xhr, editor) {// 圖片上傳出錯(cuò)時(shí)觸發(fā)},timeout: function timeout(xhr, editor) {// 圖片上傳超時(shí)時(shí)觸發(fā)}},// 是否上傳七牛云,默認(rèn)為 falseqiniu: false};/*工具 */// 和 UA 相關(guān)的屬性var UA = {_ua: navigator.userAgent,// 是否 webkitisWebkit: function isWebkit() {var reg = /webkit/i;return reg.test(this._ua);},// 是否 IEisIE: function isIE() {return 'ActiveXObject' in window;}};// 遍歷對(duì)象function objForEach(obj, fn) {var key = void 0,result = void 0;for (key in obj) {if (obj.hasOwnProperty(key)) {result = fn.call(obj, key, obj[key]);if (result === false) {break;}}}}// 遍歷類數(shù)組function arrForEach(fakeArr, fn) {var i = void 0,item = void 0,result = void 0;var length = fakeArr.length || 0;for (i = 0; i < length; i++) {item = fakeArr[i];result = fn.call(fakeArr, item, i);if (result === false) {break;}}}// 獲取隨機(jī)數(shù)function getRandom(prefix) {return prefix + Math.random().toString().slice(2);}// 替換 html 特殊字符function replaceHtmlSymbol(html) {if (html == null) {return '';}return html.replace(/</gm, '&lt;').replace(/>/gm, '&gt;').replace(/"/gm, '&quot;');}// 返回百分比的格式/*bold-menu */ // 構(gòu)造函數(shù)function Bold(editor) {this.editor = editor;this.$elem = $('<div class="w-e-menu">\n <i class="w-e-icon-bold"><i/>\n </div>');this.type = 'click';// 當(dāng)前是否 active 狀態(tài)this._active = false;}// 原型Bold.prototype = {constructor: Bold,// 點(diǎn)擊事件onClick: function onClick(e) {// 點(diǎn)擊菜單將觸發(fā)這里var editor = this.editor;var isSeleEmpty = editor.selection.isSelectionEmpty();if (isSeleEmpty) {// 選區(qū)是空的,插入并選中一個(gè)“空白”editor.selection.createEmptyRange();}// 執(zhí)行 bold 命令editor.cmd.do('bold');if (isSeleEmpty) {// 需要將選取折疊起來(lái)editor.selection.collapseRange();editor.selection.restoreSelection();}},// 試圖改變 active 狀態(tài)tryChangeActive: function tryChangeActive(e) {var editor = this.editor;var $elem = this.$elem;if (editor.cmd.queryCommandState('bold')) {this._active = true;$elem.addClass('w-e-active');} else {this._active = false;$elem.removeClass('w-e-active');}}};/*替換多語(yǔ)言*/var replaceLang = function (editor, str) {var langArgs = editor.config.langArgs || [];var result = str;langArgs.forEach(function (item) {var reg = item.reg;var val = item.val;if (reg.test(result)) {result = result.replace(reg, function () {return val;});}});return result;};/*droplist */var _emptyFn = function _emptyFn() {};// 構(gòu)造函數(shù)function DropList(menu, opt) {var _this = this;// droplist 所依附的菜單var editor = menu.editor;this.menu = menu;this.opt = opt;// 容器var $container = $('<div class="w-e-droplist"></div>');// 標(biāo)題var $title = opt.$title;var titleHtml = void 0;if ($title) {// 替換多語(yǔ)言titleHtml = $title.html();titleHtml = replaceLang(editor, titleHtml);$title.html(titleHtml);$title.addClass('w-e-dp-title');$container.append($title);}var list = opt.list || [];var type = opt.type || 'list'; // 'list' 列表形式(如“標(biāo)題”菜單) / 'inline-block' 塊狀形式(如“顏色”菜單)var onClick = opt.onClick || _emptyFn;// 加入 DOM 并綁定事件var $list = $('<ul class="' + (type === 'list' ? 'w-e-list' : 'w-e-block') + '"></ul>');$container.append($list);list.forEach(function (item) {var $elem = item.$elem;// 替換多語(yǔ)言var elemHtml = $elem.html();elemHtml = replaceLang(editor, elemHtml);$elem.html(elemHtml);var value = item.value;var $li = $('<li class="w-e-item"></li>');if ($elem) {$li.append($elem);$list.append($li);$elem.on('click', function (e) {onClick(value);// 隱藏_this.hideTimeoutId = setTimeout(function () {_this.hide();}, 0);});}});// 綁定隱藏事件$container.on('mouseleave', function (e) {_this.hideTimeoutId = setTimeout(function () {_this.hide();}, 0);});// 記錄屬性this.$container = $container;// 基本屬性this._rendered = false;this._show = false;}// 原型DropList.prototype = {constructor: DropList,// 顯示(插入DOM)show: function show() {if (this.hideTimeoutId) {// 清除之前的定時(shí)隱藏clearTimeout(this.hideTimeoutId);}var menu = this.menu;var $menuELem = menu.$elem;var $container = this.$container;if (this._show) {return;}if (this._rendered) {// 顯示$container.show();} else {// 加入 DOM 之前先定位位置var menuHeight = $menuELem.getSizeData().height || 0;var width = this.opt.width || 100; // 默認(rèn)為 100$container.css('margin-top', menuHeight + 'px').css('width', width + 'px');// 加入到 DOM$menuELem.append($container);this._rendered = true;}// 修改屬性this._show = true;},// 隱藏(移除DOM)hide: function hide() {if (this.showTimeoutId) {// 清除之前的定時(shí)顯示clearTimeout(this.showTimeoutId);}var $container = this.$container;if (!this._show) {return;}// 隱藏并需改屬性$container.hide();this._show = false;}};/*menu - header */ // 構(gòu)造函數(shù)function Head(editor) {var _this = this;this.editor = editor;this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-header"><i/></div>');this.type = 'droplist';// 當(dāng)前是否 active 狀態(tài)this._active = false;// 初始化 droplistthis.droplist = new DropList(this, {width: 100,$title: $('<p>設(shè)置標(biāo)題</p>'),type: 'list', // droplist 以列表形式展示list: [{ $elem: $('<h1>H1</h1>'), value: '<h1>' }, { $elem: $('<h2>H2</h2>'), value: '<h2>' }, { $elem: $('<h3>H3</h3>'), value: '<h3>' }, { $elem: $('<h4>H4</h4>'), value: '<h4>' }, { $elem: $('<h5>H5</h5>'), value: '<h5>' }, { $elem: $('<p>正文</p>'), value: '<p>' }],onClick: function onClick(value) {// 注意 this 是指向當(dāng)前的 Head 對(duì)象_this._command(value);}});}// 原型Head.prototype = {constructor: Head,// 執(zhí)行命令_command: function _command(value) {var editor = this.editor;var $selectionElem = editor.selection.getSelectionContainerElem();if (editor.$textElem.equal($selectionElem)) {// 不能選中多行來(lái)設(shè)置標(biāo)題,否則會(huì)出現(xiàn)問(wèn)題// 例如選中的是 <p>xxx</p><p>yyy</p> 來(lái)設(shè)置標(biāo)題,設(shè)置之后會(huì)成為 <h1>xxx<br>yyy</h1> 不符合預(yù)期return;}editor.cmd.do('formatBlock', value);},// 試圖改變 active 狀態(tài)tryChangeActive: function tryChangeActive(e) {var editor = this.editor;var $elem = this.$elem;var reg = /^h/i;var cmdValue = editor.cmd.queryCommandValue('formatBlock');if (reg.test(cmdValue)) {this._active = true;$elem.addClass('w-e-active');} else {this._active = false;$elem.removeClass('w-e-active');}}};/*panel */var emptyFn = function emptyFn() {};// 記錄已經(jīng)顯示 panel 的菜單var _isCreatedPanelMenus = [];// 構(gòu)造函數(shù)function Panel(menu, opt) {this.menu = menu;this.opt = opt;}// 原型Panel.prototype = {constructor: Panel,// 顯示(插入DOM)show: function show() {var _this = this;var menu = this.menu;if (_isCreatedPanelMenus.indexOf(menu) >= 0) {// 該菜單已經(jīng)創(chuàng)建了 panel 不能再創(chuàng)建return;}var editor = menu.editor;var $body = $('body');var $textContainerElem = editor.$textContainerElem;var opt = this.opt;// panel 的容器var $container = $('<div class="w-e-panel-container"></div>');var width = opt.width || 300; // 默認(rèn) 300px$container.css('width', width + 'px').css('margin-left', (0 - width) / 2 + 'px');// 添加關(guān)閉按鈕var $closeBtn = $('<i class="w-e-icon-close w-e-panel-close"></i>');$container.append($closeBtn);$closeBtn.on('click', function () {_this.hide();});// 準(zhǔn)備 tabs 容器var $tabTitleContainer = $('<ul class="w-e-panel-tab-title"></ul>');var $tabContentContainer = $('<div class="w-e-panel-tab-content"></div>');$container.append($tabTitleContainer).append($tabContentContainer);// 設(shè)置高度var height = opt.height;if (height) {$tabContentContainer.css('height', height + 'px').css('overflow-y', 'auto');}// tabsvar tabs = opt.tabs || [];var tabTitleArr = [];var tabContentArr = [];tabs.forEach(function (tab, tabIndex) {if (!tab) {return;}var title = tab.title || '';var tpl = tab.tpl || '';// 替換多語(yǔ)言title = replaceLang(editor, title);tpl = replaceLang(editor, tpl);// 添加到 DOMvar $title = $('<li class="w-e-item">' + title + '</li>');$tabTitleContainer.append($title);var $content = $(tpl);$tabContentContainer.append($content);// 記錄到內(nèi)存$title._index = tabIndex;tabTitleArr.push($title);tabContentArr.push($content);// 設(shè)置 active 項(xiàng)if (tabIndex === 0) {$title._active = true;$title.addClass('w-e-active');} else {$content.hide();}// 綁定 tab 的事件$title.on('click', function (e) {if ($title._active) {return;}// 隱藏所有的 tabtabTitleArr.forEach(function ($title) {$title._active = false;$title.removeClass('w-e-active');});tabContentArr.forEach(function ($content) {$content.hide();});// 顯示當(dāng)前的 tab$title._active = true;$title.addClass('w-e-active');$content.show();});});// 綁定關(guān)閉事件$container.on('click', function (e) {// 點(diǎn)擊時(shí)阻止冒泡e.stopPropagation();});$body.on('click', function (e) {_this.hide();});// 添加到 DOM$textContainerElem.append($container);// 綁定 opt 的事件,只有添加到 DOM 之后才能綁定成功tabs.forEach(function (tab, index) {if (!tab) {return;}var events = tab.events || [];events.forEach(function (event) {var selector = event.selector;var type = event.type;var fn = event.fn || emptyFn;var $content = tabContentArr[index];$content.find(selector).on(type, function (e) {e.stopPropagation();var needToHide = fn(e);// 執(zhí)行完事件之后,是否要關(guān)閉 panelif (needToHide) {_this.hide();}});});});// focus 第一個(gè) elemvar $inputs = $container.find('input[type=text],textarea');if ($inputs.length) {$inputs.get(0).focus();}// 添加到屬性this.$container = $container;// 隱藏其他 panelthis._hideOtherPanels();// 記錄該 menu 已經(jīng)創(chuàng)建了 panel_isCreatedPanelMenus.push(menu);},// 隱藏(移除DOM)hide: function hide() {var menu = this.menu;var $container = this.$container;if ($container) {$container.remove();}// 將該 menu 記錄中移除_isCreatedPanelMenus = _isCreatedPanelMenus.filter(function (item) {if (item === menu) {return false;} else {return true;}});},// 一個(gè) panel 展示時(shí),隱藏其他 panel_hideOtherPanels: function _hideOtherPanels() {if (!_isCreatedPanelMenus.length) {return;}_isCreatedPanelMenus.forEach(function (menu) {var panel = menu.panel || {};if (panel.hide) {panel.hide();}});}};/*menu - link */ // 構(gòu)造函數(shù)function Link(editor) {this.editor = editor;this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-link"><i/></div>');this.type = 'panel';// 當(dāng)前是否 active 狀態(tài)this._active = false;}// 原型Link.prototype = {constructor: Link,// 點(diǎn)擊事件onClick: function onClick(e) {var editor = this.editor;var $linkelem = void 0;if (this._active) {// 當(dāng)前選區(qū)在鏈接里面$linkelem = editor.selection.getSelectionContainerElem();if (!$linkelem) {return;}// 將該元素都包含在選取之內(nèi),以便后面整體替換editor.selection.createRangeByElem($linkelem);editor.selection.restoreSelection();// 顯示 panelthis._createPanel($linkelem.text(), $linkelem.attr('href'));} else {// 當(dāng)前選區(qū)不在鏈接里面if (editor.selection.isSelectionEmpty()) {// 選區(qū)是空的,未選中內(nèi)容this._createPanel('', '');} else {// 選中內(nèi)容了this._createPanel(editor.selection.getSelectionText(), '');}}},// 創(chuàng)建 panel_createPanel: function _createPanel(text, link) {var _this = this;// panel 中需要用到的idvar inputLinkId = getRandom('input-link');var inputTextId = getRandom('input-text');var btnOkId = getRandom('btn-ok');var btnDelId = getRandom('btn-del');// 是否顯示“刪除鏈接”var delBtnDisplay = this._active ? 'inline-block' : 'none';// 初始化并顯示 panelvar panel = new Panel(this, {width: 300,// panel 中可包含多個(gè) tabtabs: [{// tab 的標(biāo)題title: '鏈接',// 模板tpl: '<div>\n <input id="' + inputTextId + '" type="text" class="block" value="' + text + '" placeholder="\u94FE\u63A5\u6587\u5B57"/></td>\n <input id="' + inputLinkId + '" type="text" class="block" value="' + link + '" placeholder="http://..."/></td>\n <div class="w-e-button-container">\n <button id="' + btnOkId + '" class="right">\u63D2\u5165</button>\n <button id="' + btnDelId + '" class="gray right" style="display:' + delBtnDisplay + '">\u5220\u9664\u94FE\u63A5</button>\n </div>\n </div>',// 事件綁定events: [// 插入鏈接{selector: '#' + btnOkId,type: 'click',fn: function fn() {// 執(zhí)行插入鏈接var $link = $('#' + inputLinkId);var $text = $('#' + inputTextId);var link = $link.val();var text = $text.val();_this._insertLink(text, link);// 返回 true,表示該事件執(zhí)行完之后,panel 要關(guān)閉。否則 panel 不會(huì)關(guān)閉return true;}},// 刪除鏈接{selector: '#' + btnDelId,type: 'click',fn: function fn() {// 執(zhí)行刪除鏈接_this._delLink();// 返回 true,表示該事件執(zhí)行完之后,panel 要關(guān)閉。否則 panel 不會(huì)關(guān)閉return true;}}]} // tab end] // tabs end});// 顯示 panelpanel.show();// 記錄屬性this.panel = panel;},// 刪除當(dāng)前鏈接_delLink: function _delLink() {if (!this._active) {return;}var editor = this.editor;var $selectionELem = editor.selection.getSelectionContainerElem();if (!$selectionELem) {return;}var selectionText = editor.selection.getSelectionText();editor.cmd.do('insertHTML', '<span>' + selectionText + '</span>');},// 插入鏈接_insertLink: function _insertLink(text, link) {if (!text || !link) {return;}var editor = this.editor;var config = editor.config;var linkCheck = config.linkCheck;var checkResult = true; // 默認(rèn)為 trueif (linkCheck && typeof linkCheck === 'function') {checkResult = linkCheck(text, link);}if (checkResult === true) {editor.cmd.do('insertHTML', '<a href="' + link + '" target="_blank">' + text + '</a>');} else {alert(checkResult);}},// 試圖改變 active 狀態(tài)tryChangeActive: function tryChangeActive(e) {var editor = this.editor;var $elem = this.$elem;var $selectionELem = editor.selection.getSelectionContainerElem();if (!$selectionELem) {return;}if ($selectionELem.getNodeName() === 'A') {this._active = true;$elem.addClass('w-e-active');} else {this._active = false;$elem.removeClass('w-e-active');}}};/*italic-menu */ // 構(gòu)造函數(shù)function Italic(editor) {this.editor = editor;this.$elem = $('<div class="w-e-menu">\n <i class="w-e-icon-italic"><i/>\n </div>');this.type = 'click';// 當(dāng)前是否 active 狀態(tài)this._active = false;}// 原型Italic.prototype = {constructor: Italic,// 點(diǎn)擊事件onClick: function onClick(e) {// 點(diǎn)擊菜單將觸發(fā)這里var editor = this.editor;var isSeleEmpty = editor.selection.isSelectionEmpty();if (isSeleEmpty) {// 選區(qū)是空的,插入并選中一個(gè)“空白”editor.selection.createEmptyRange();}// 執(zhí)行 italic 命令editor.cmd.do('italic');if (isSeleEmpty) {// 需要將選取折疊起來(lái)editor.selection.collapseRange();editor.selection.restoreSelection();}},// 試圖改變 active 狀態(tài)tryChangeActive: function tryChangeActive(e) {var editor = this.editor;var $elem = this.$elem;if (editor.cmd.queryCommandState('italic')) {this._active = true;$elem.addClass('w-e-active');} else {this._active = false;$elem.removeClass('w-e-active');}}};/*redo-menu */ // 構(gòu)造函數(shù)function Redo(editor) {this.editor = editor;this.$elem = $('<div class="w-e-menu">\n <i class="w-e-icon-redo"><i/>\n </div>');this.type = 'click';// 當(dāng)前是否 active 狀態(tài)this._active = false;}// 原型Redo.prototype = {constructor: Redo,// 點(diǎn)擊事件onClick: function onClick(e) {// 點(diǎn)擊菜單將觸發(fā)這里var editor = this.editor;// 執(zhí)行 redo 命令editor.cmd.do('redo');}};/*strikeThrough-menu */ // 構(gòu)造函數(shù)function StrikeThrough(editor) {this.editor = editor;this.$elem = $('<div class="w-e-menu">\n <i class="w-e-icon-strikethrough"><i/>\n </div>');this.type = 'click';// 當(dāng)前是否 active 狀態(tài)this._active = false;}// 原型StrikeThrough.prototype = {constructor: StrikeThrough,// 點(diǎn)擊事件onClick: function onClick(e) {// 點(diǎn)擊菜單將觸發(fā)這里var editor = this.editor;var isSeleEmpty = editor.selection.isSelectionEmpty();if (isSeleEmpty) {// 選區(qū)是空的,插入并選中一個(gè)“空白”editor.selection.createEmptyRange();}// 執(zhí)行 strikeThrough 命令editor.cmd.do('strikeThrough');if (isSeleEmpty) {// 需要將選取折疊起來(lái)editor.selection.collapseRange();editor.selection.restoreSelection();}},// 試圖改變 active 狀態(tài)tryChangeActive: function tryChangeActive(e) {var editor = this.editor;var $elem = this.$elem;if (editor.cmd.queryCommandState('strikeThrough')) {this._active = true;$elem.addClass('w-e-active');} else {this._active = false;$elem.removeClass('w-e-active');}}};/*underline-menu */ // 構(gòu)造函數(shù)function Underline(editor) {this.editor = editor;this.$elem = $('<div class="w-e-menu">\n <i class="w-e-icon-underline"><i/>\n </div>');this.type = 'click';// 當(dāng)前是否 active 狀態(tài)this._active = false;}// 原型Underline.prototype = {constructor: Underline,// 點(diǎn)擊事件onClick: function onClick(e) {// 點(diǎn)擊菜單將觸發(fā)這里var editor = this.editor;var isSeleEmpty = editor.selection.isSelectionEmpty();if (isSeleEmpty) {// 選區(qū)是空的,插入并選中一個(gè)“空白”editor.selection.createEmptyRange();}// 執(zhí)行 underline 命令editor.cmd.do('underline');if (isSeleEmpty) {// 需要將選取折疊起來(lái)editor.selection.collapseRange();editor.selection.restoreSelection();}},// 試圖改變 active 狀態(tài)tryChangeActive: function tryChangeActive(e) {var editor = this.editor;var $elem = this.$elem;if (editor.cmd.queryCommandState('underline')) {this._active = true;$elem.addClass('w-e-active');} else {this._active = false;$elem.removeClass('w-e-active');}}};/*undo-menu */ // 構(gòu)造函數(shù)function Undo(editor) {this.editor = editor;this.$elem = $('<div class="w-e-menu">\n <i class="w-e-icon-undo"><i/>\n </div>');this.type = 'click';// 當(dāng)前是否 active 狀態(tài)this._active = false;}// 原型Undo.prototype = {constructor: Undo,// 點(diǎn)擊事件onClick: function onClick(e) {// 點(diǎn)擊菜單將觸發(fā)這里var editor = this.editor;// 執(zhí)行 undo 命令editor.cmd.do('undo');}};/*menu - list */ // 構(gòu)造函數(shù)function List(editor) {var _this = this;this.editor = editor;this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-list2"><i/></div>');this.type = 'droplist';// 當(dāng)前是否 active 狀態(tài)this._active = false;// 初始化 droplistthis.droplist = new DropList(this, {width: 120,$title: $('<p>設(shè)置列表</p>'),type: 'list', // droplist 以列表形式展示list: [{ $elem: $('<span><i class="w-e-icon-list-numbered"></i> 有序列表</span>'), value: 'insertOrderedList' }, { $elem: $('<span><i class="w-e-icon-list2"></i> 無(wú)序列表</span>'), value: 'insertUnorderedList' }],onClick: function onClick(value) {// 注意 this 是指向當(dāng)前的 List 對(duì)象_this._command(value);}});}// 原型List.prototype = {constructor: List,// 執(zhí)行命令_command: function _command(value) {var editor = this.editor;var $textElem = editor.$textElem;editor.selection.restoreSelection();if (editor.cmd.queryCommandState(value)) {return;}editor.cmd.do(value);// 驗(yàn)證列表是否被包裹在 <p> 之內(nèi)var $selectionElem = editor.selection.getSelectionContainerElem();if ($selectionElem.getNodeName() === 'LI') {$selectionElem = $selectionElem.parent();}if (/^ol|ul$/i.test($selectionElem.getNodeName()) === false) {return;}if ($selectionElem.equal($textElem)) {// 證明是頂級(jí)標(biāo)簽,沒(méi)有被 <p> 包裹return;}var $parent = $selectionElem.parent();if ($parent.equal($textElem)) {// $parent 是頂級(jí)標(biāo)簽,不能刪除return;}$selectionElem.insertAfter($parent);$parent.remove();},// 試圖改變 active 狀態(tài)tryChangeActive: function tryChangeActive(e) {var editor = this.editor;var $elem = this.$elem;if (editor.cmd.queryCommandState('insertUnOrderedList') || editor.cmd.queryCommandState('insertOrderedList')) {this._active = true;$elem.addClass('w-e-active');} else {this._active = false;$elem.removeClass('w-e-active');}}};/*menu - justify */ // 構(gòu)造函數(shù)function Justify(editor) {var _this = this;this.editor = editor;this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-paragraph-left"><i/></div>');this.type = 'droplist';// 當(dāng)前是否 active 狀態(tài)this._active = false;// 初始化 droplistthis.droplist = new DropList(this, {width: 100,$title: $('<p>對(duì)齊方式</p>'),type: 'list', // droplist 以列表形式展示list: [{ $elem: $('<span><i class="w-e-icon-paragraph-left"></i> 靠左</span>'), value: 'justifyLeft' }, { $elem: $('<span><i class="w-e-icon-paragraph-center"></i> 居中</span>'), value: 'justifyCenter' }, { $elem: $('<span><i class="w-e-icon-paragraph-right"></i> 靠右</span>'), value: 'justifyRight' }],onClick: function onClick(value) {// 注意 this 是指向當(dāng)前的 List 對(duì)象_this._command(value);}});}// 原型Justify.prototype = {constructor: Justify,// 執(zhí)行命令_command: function _command(value) {var editor = this.editor;editor.cmd.do(value);}};/*menu - Forecolor */ // 構(gòu)造函數(shù)function ForeColor(editor) {var _this = this;this.editor = editor;this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-pencil2"><i/></div>');this.type = 'droplist';// 獲取配置的顏色var config = editor.config;var colors = config.colors || [];// 當(dāng)前是否 active 狀態(tài)this._active = false;// 初始化 droplistthis.droplist = new DropList(this, {width: 120,$title: $('<p>文字顏色</p>'),type: 'inline-block', // droplist 內(nèi)容以 block 形式展示list: colors.map(function (color) {return { $elem: $('<i style="color:' + color + ';" class="w-e-icon-pencil2"></i>'), value: color };}),onClick: function onClick(value) {// 注意 this 是指向當(dāng)前的 ForeColor 對(duì)象_this._command(value);}});}// 原型ForeColor.prototype = {constructor: ForeColor,// 執(zhí)行命令_command: function _command(value) {var editor = this.editor;editor.cmd.do('foreColor', value);}};/*menu - BackColor */ // 構(gòu)造函數(shù)function BackColor(editor) {var _this = this;this.editor = editor;this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-paint-brush"><i/></div>');this.type = 'droplist';// 獲取配置的顏色var config = editor.config;var colors = config.colors || [];// 當(dāng)前是否 active 狀態(tài)this._active = false;// 初始化 droplistthis.droplist = new DropList(this, {width: 120,$title: $('<p>背景色</p>'),type: 'inline-block', // droplist 內(nèi)容以 block 形式展示list: colors.map(function (color) {return { $elem: $('<i style="color:' + color + ';" class="w-e-icon-paint-brush"></i>'), value: color };}),onClick: function onClick(value) {// 注意 this 是指向當(dāng)前的 BackColor 對(duì)象_this._command(value);}});}// 原型BackColor.prototype = {constructor: BackColor,// 執(zhí)行命令_command: function _command(value) {var editor = this.editor;editor.cmd.do('backColor', value);}};/*menu - quote */ // 構(gòu)造函數(shù)function Quote(editor) {this.editor = editor;this.$elem = $('<div class="w-e-menu">\n <i class="w-e-icon-quotes-left"><i/>\n </div>');this.type = 'click';// 當(dāng)前是否 active 狀態(tài)this._active = false;}// 原型Quote.prototype = {constructor: Quote,onClick: function onClick(e) {var editor = this.editor;var $selectionElem = editor.selection.getSelectionContainerElem();var nodeName = $selectionElem.getNodeName();if (!UA.isIE()) {if (nodeName === 'BLOCKQUOTE') {// 撤銷 quoteeditor.cmd.do('formatBlock', '<P>');} else {// 轉(zhuǎn)換為 quoteeditor.cmd.do('formatBlock', '<BLOCKQUOTE>');}return;}// IE 中不支持 formatBlock <BLOCKQUOTE> ,要用其他方式兼容var content = void 0,$targetELem = void 0;if (nodeName === 'P') {// 將 P 轉(zhuǎn)換為 quotecontent = $selectionElem.text();$targetELem = $('<blockquote>' + content + '</blockquote>');$targetELem.insertAfter($selectionElem);$selectionElem.remove();return;}if (nodeName === 'BLOCKQUOTE') {// 撤銷 quotecontent = $selectionElem.text();$targetELem = $('<p>' + content + '</p>');$targetELem.insertAfter($selectionElem);$selectionElem.remove();}},tryChangeActive: function tryChangeActive(e) {var editor = this.editor;var $elem = this.$elem;var reg = /^BLOCKQUOTE$/i;var cmdValue = editor.cmd.queryCommandValue('formatBlock');if (reg.test(cmdValue)) {this._active = true;$elem.addClass('w-e-active');} else {this._active = false;$elem.removeClass('w-e-active');}}};/*menu - code */ // 構(gòu)造函數(shù)function Code(editor) {this.editor = editor;this.$elem = $('<div class="w-e-menu">\n <i class="w-e-icon-terminal"><i/>\n </div>');this.type = 'panel';// 當(dāng)前是否 active 狀態(tài)this._active = false;}// 原型Code.prototype = {constructor: Code,onClick: function onClick(e) {var editor = this.editor;var $startElem = editor.selection.getSelectionStartElem();var $endElem = editor.selection.getSelectionEndElem();var isSeleEmpty = editor.selection.isSelectionEmpty();var selectionText = editor.selection.getSelectionText();var $code = void 0;if (!$startElem.equal($endElem)) {// 跨元素選擇,不做處理editor.selection.restoreSelection();return;}if (!isSeleEmpty) {// 選取不是空,用 <code> 包裹即可$code = $('<code>' + selectionText + '</code>');editor.cmd.do('insertElem', $code);editor.selection.createRangeByElem($code, false);editor.selection.restoreSelection();return;}// 選取是空,且沒(méi)有夸元素選擇,則插入 <pre><code></code></prev>if (this._active) {// 選中狀態(tài),將編輯內(nèi)容this._createPanel($startElem.html());} else {// 未選中狀態(tài),將創(chuàng)建內(nèi)容this._createPanel();}},_createPanel: function _createPanel(value) {var _this = this;// value - 要編輯的內(nèi)容value = value || '';var type = !value ? 'new' : 'edit';var textId = getRandom('texxt');var btnId = getRandom('btn');var panel = new Panel(this, {width: 500,// 一個(gè) Panel 包含多個(gè) tabtabs: [{// 標(biāo)題title: '插入代碼',// 模板tpl: '<div>\n <textarea id="' + textId + '" style="height:145px;;">' + value + '</textarea>\n <div class="w-e-button-container">\n <button id="' + btnId + '" class="right">\u63D2\u5165</button>\n </div>\n <div>',// 事件綁定events: [// 插入代碼{selector: '#' + btnId,type: 'click',fn: function fn() {var $text = $('#' + textId);var text = $text.val() || $text.html();text = replaceHtmlSymbol(text);if (type === 'new') {// 新插入_this._insertCode(text);} else {// 編輯更新_this._updateCode(text);}// 返回 true,表示該事件執(zhí)行完之后,panel 要關(guān)閉。否則 panel 不會(huì)關(guān)閉return true;}}]} // first tab end] // tabs end}); // new Panel end// 顯示 panelpanel.show();// 記錄屬性this.panel = panel;},// 插入代碼_insertCode: function _insertCode(value) {var editor = this.editor;editor.cmd.do('insertHTML', '<pre><code>' + value + '</code></pre><p><br></p>');},// 更新代碼_updateCode: function _updateCode(value) {var editor = this.editor;var $selectionELem = editor.selection.getSelectionContainerElem();if (!$selectionELem) {return;}$selectionELem.html(value);editor.selection.restoreSelection();},// 試圖改變 active 狀態(tài)tryChangeActive: function tryChangeActive(e) {var editor = this.editor;var $elem = this.$elem;var $selectionELem = editor.selection.getSelectionContainerElem();if (!$selectionELem) {return;}var $parentElem = $selectionELem.parent();if ($selectionELem.getNodeName() === 'CODE' && $parentElem.getNodeName() === 'PRE') {this._active = true;$elem.addClass('w-e-active');} else {this._active = false;$elem.removeClass('w-e-active');}}};/*menu - emoticon */ // 構(gòu)造函數(shù)function Emoticon(editor) {this.editor = editor;this.$elem = $('<div class="w-e-menu">\n <i class="w-e-icon-happy"><i/>\n </div>');this.type = 'panel';// 當(dāng)前是否 active 狀態(tài)this._active = false;}// 原型Emoticon.prototype = {constructor: Emoticon,onClick: function onClick() {this._createPanel();},_createPanel: function _createPanel() {var _this = this;var editor = this.editor;var config = editor.config;// 獲取表情配置var emotions = config.emotions || [];// 創(chuàng)建表情 dropPanel 的配置var tabConfig = [];emotions.forEach(function (emotData) {var emotType = emotData.type;var content = emotData.content || [];// 這一組表情最終拼接出來(lái)的 htmlvar faceHtml = '';// emoji 表情if (emotType === 'emoji') {content.forEach(function (item) {if (item) {faceHtml += '<span class="w-e-item">' + item + '</span>';}});}// 圖片表情if (emotType === 'image') {content.forEach(function (item) {var src = item.src;var alt = item.alt;if (src) {// 加一個(gè) data-w-e 屬性,點(diǎn)擊圖片的時(shí)候不再提示編輯圖片faceHtml += '<span class="w-e-item"><img src="' + src + '" alt="' + alt + '" data-w-e="1"/></span>';}});}tabConfig.push({title: emotData.title,tpl: '<div class="w-e-emoticon-container">' + faceHtml + '</div>',events: [{selector: 'span.w-e-item',type: 'click',fn: function fn(e) {var target = e.target;var $target = $(target);var nodeName = $target.getNodeName();var insertHtml = void 0;if (nodeName === 'IMG') {// 插入圖片insertHtml = $target.parent().html();} else {// 插入 emojiinsertHtml = '<span>' + $target.html() + '</span>';}_this._insert(insertHtml);// 返回 true,表示該事件執(zhí)行完之后,panel 要關(guān)閉。否則 panel 不會(huì)關(guān)閉return true;}}]});});var panel = new Panel(this, {width: 300,height: 200,// 一個(gè) Panel 包含多個(gè) tabtabs: tabConfig});// 顯示 panelpanel.show();// 記錄屬性this.panel = panel;},// 插入表情_(kāi)insert: function _insert(emotHtml) {var editor = this.editor;editor.cmd.do('insertHTML', emotHtml);}};/*menu - table */ // 構(gòu)造函數(shù)function Table(editor) {this.editor = editor;this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-table2"><i/></div>');this.type = 'panel';// 當(dāng)前是否 active 狀態(tài)this._active = false;}// 原型Table.prototype = {constructor: Table,onClick: function onClick() {if (this._active) {// 編輯現(xiàn)有表格this._createEditPanel();} else {// 插入新表格this._createInsertPanel();}},// 創(chuàng)建插入新表格的 panel_createInsertPanel: function _createInsertPanel() {var _this = this;// 用到的 idvar btnInsertId = getRandom('btn');var textRowNum = getRandom('row');var textColNum = getRandom('col');var panel = new Panel(this, {width: 250,// panel 包含多個(gè) tabtabs: [{// 標(biāo)題title: '插入表格',// 模板tpl: '<div>\n <p style="text-align:left; padding:5px 0;">\n \u521B\u5EFA\n <input id="' + textRowNum + '" type="text" value="5" style="width:40px;text-align:center;"/>\n \u884C\n <input id="' + textColNum + '" type="text" value="5" style="width:40px;text-align:center;"/>\n \u5217\u7684\u8868\u683C\n </p>\n <div class="w-e-button-container">\n <button id="' + btnInsertId + '" class="right">\u63D2\u5165</button>\n </div>\n </div>',// 事件綁定events: [{// 點(diǎn)擊按鈕,插入表格selector: '#' + btnInsertId,type: 'click',fn: function fn() {var rowNum = parseInt($('#' + textRowNum).val());var colNum = parseInt($('#' + textColNum).val());if (rowNum && colNum && rowNum > 0 && colNum > 0) {// form 數(shù)據(jù)有效_this._insert(rowNum, colNum);}// 返回 true,表示該事件執(zhí)行完之后,panel 要關(guān)閉。否則 panel 不會(huì)關(guān)閉return true;}}]} // first tab end] // tabs end}); // panel end// 展示 panelpanel.show();// 記錄屬性this.panel = panel;},// 插入表格_insert: function _insert(rowNum, colNum) {// 拼接 table 模板var r = void 0,c = void 0;var html = '<table border="0" width="100%" cellpadding="0" cellspacing="0">';for (r = 0; r < rowNum; r++) {html += '<tr>';if (r === 0) {for (c = 0; c < colNum; c++) {html += '<th>&nbsp;</th>';}} else {for (c = 0; c < colNum; c++) {html += '<td>&nbsp;</td>';}}html += '</tr>';}html += '</table><p><br></p>';// 執(zhí)行命令var editor = this.editor;editor.cmd.do('insertHTML', html);// 防止 firefox 下出現(xiàn) resize 的控制點(diǎn)editor.cmd.do('enableObjectResizing', false);editor.cmd.do('enableInlineTableEditing', false);},// 創(chuàng)建編輯表格的 panel_createEditPanel: function _createEditPanel() {var _this2 = this;// 可用的 idvar addRowBtnId = getRandom('add-row');var addColBtnId = getRandom('add-col');var delRowBtnId = getRandom('del-row');var delColBtnId = getRandom('del-col');var delTableBtnId = getRandom('del-table');// 創(chuàng)建 panel 對(duì)象var panel = new Panel(this, {width: 320,// panel 包含多個(gè) tabtabs: [{// 標(biāo)題title: '編輯表格',// 模板tpl: '<div>\n <div class="w-e-button-container" style="border-bottom:1px solid #f1f1f1;padding-bottom:5px;margin-bottom:5px;">\n <button id="' + addRowBtnId + '" class="left">\u589E\u52A0\u884C</button>\n <button id="' + delRowBtnId + '" class="red left">\u5220\u9664\u884C</button>\n <button id="' + addColBtnId + '" class="left">\u589E\u52A0\u5217</button>\n <button id="' + delColBtnId + '" class="red left">\u5220\u9664\u5217</button>\n </div>\n <div class="w-e-button-container">\n <button id="' + delTableBtnId + '" class="gray left">\u5220\u9664\u8868\u683C</button>\n </dv>\n </div>',// 事件綁定events: [{// 增加行selector: '#' + addRowBtnId,type: 'click',fn: function fn() {_this2._addRow();// 返回 true,表示該事件執(zhí)行完之后,panel 要關(guān)閉。否則 panel 不會(huì)關(guān)閉return true;}}, {// 增加列selector: '#' + addColBtnId,type: 'click',fn: function fn() {_this2._addCol();// 返回 true,表示該事件執(zhí)行完之后,panel 要關(guān)閉。否則 panel 不會(huì)關(guān)閉return true;}}, {// 刪除行selector: '#' + delRowBtnId,type: 'click',fn: function fn() {_this2._delRow();// 返回 true,表示該事件執(zhí)行完之后,panel 要關(guān)閉。否則 panel 不會(huì)關(guān)閉return true;}}, {// 刪除列selector: '#' + delColBtnId,type: 'click',fn: function fn() {_this2._delCol();// 返回 true,表示該事件執(zhí)行完之后,panel 要關(guān)閉。否則 panel 不會(huì)關(guān)閉return true;}}, {// 刪除表格selector: '#' + delTableBtnId,type: 'click',fn: function fn() {_this2._delTable();// 返回 true,表示該事件執(zhí)行完之后,panel 要關(guān)閉。否則 panel 不會(huì)關(guān)閉return true;}}]}]});// 顯示 panelpanel.show();},// 獲取選中的單元格的位置信息_getLocationData: function _getLocationData() {var result = {};var editor = this.editor;var $selectionELem = editor.selection.getSelectionContainerElem();if (!$selectionELem) {return;}var nodeName = $selectionELem.getNodeName();if (nodeName !== 'TD' && nodeName !== 'TH') {return;}// 獲取 td indexvar $tr = $selectionELem.parent();var $tds = $tr.children();var tdLength = $tds.length;$tds.forEach(function (td, index) {if (td === $selectionELem[0]) {// 記錄并跳出循環(huán)result.td = {index: index,elem: td,length: tdLength};return false;}});// 獲取 tr indexvar $tbody = $tr.parent();var $trs = $tbody.children();var trLength = $trs.length;$trs.forEach(function (tr, index) {if (tr === $tr[0]) {// 記錄并跳出循環(huán)result.tr = {index: index,elem: tr,length: trLength};return false;}});// 返回結(jié)果return result;},// 增加行_addRow: function _addRow() {// 獲取當(dāng)前單元格的位置信息var locationData = this._getLocationData();if (!locationData) {return;}var trData = locationData.tr;var $currentTr = $(trData.elem);var tdData = locationData.td;var tdLength = tdData.length;// 拼接即將插入的字符串var newTr = document.createElement('tr');var tpl = '',i = void 0;for (i = 0; i < tdLength; i++) {tpl += '<td>&nbsp;</td>';}newTr.innerHTML = tpl;// 插入$(newTr).insertAfter($currentTr);},// 增加列_addCol: function _addCol() {// 獲取當(dāng)前單元格的位置信息var locationData = this._getLocationData();if (!locationData) {return;}var trData = locationData.tr;var tdData = locationData.td;var tdIndex = tdData.index;var $currentTr = $(trData.elem);var $trParent = $currentTr.parent();var $trs = $trParent.children();// 遍歷所有行$trs.forEach(function (tr) {var $tr = $(tr);var $tds = $tr.children();var $currentTd = $tds.get(tdIndex);var name = $currentTd.getNodeName().toLowerCase();// new 一個(gè) td,并插入var newTd = document.createElement(name);$(newTd).insertAfter($currentTd);});},// 刪除行_delRow: function _delRow() {// 獲取當(dāng)前單元格的位置信息var locationData = this._getLocationData();if (!locationData) {return;}var trData = locationData.tr;var $currentTr = $(trData.elem);$currentTr.remove();},// 刪除列_delCol: function _delCol() {// 獲取當(dāng)前單元格的位置信息var locationData = this._getLocationData();if (!locationData) {return;}var trData = locationData.tr;var tdData = locationData.td;var tdIndex = tdData.index;var $currentTr = $(trData.elem);var $trParent = $currentTr.parent();var $trs = $trParent.children();// 遍歷所有行$trs.forEach(function (tr) {var $tr = $(tr);var $tds = $tr.children();var $currentTd = $tds.get(tdIndex);// 刪除$currentTd.remove();});},// 刪除表格_delTable: function _delTable() {var editor = this.editor;var $selectionELem = editor.selection.getSelectionContainerElem();if (!$selectionELem) {return;}var $table = $selectionELem.parentUntil('table');if (!$table) {return;}$table.remove();},// 試圖改變 active 狀態(tài)tryChangeActive: function tryChangeActive(e) {var editor = this.editor;var $elem = this.$elem;var $selectionELem = editor.selection.getSelectionContainerElem();if (!$selectionELem) {return;}var nodeName = $selectionELem.getNodeName();if (nodeName === 'TD' || nodeName === 'TH') {this._active = true;$elem.addClass('w-e-active');} else {this._active = false;$elem.removeClass('w-e-active');}}};/*menu - video */ // 構(gòu)造函數(shù)function Video(editor) {this.editor = editor;this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-play"><i/></div>');this.type = 'panel';// 當(dāng)前是否 active 狀態(tài)this._active = false;}// 原型Video.prototype = {constructor: Video,onClick: function onClick() {this._createInsertPanel();},_createInsertPanel: function _createInsertPanel() {var editor = this.editor;var uploadVideo = editor.uploadVideo;var config = editor.config;// idvar upTriggerId = getRandom('up-trigger');var upFileId = getRandom('up-file');// tabs 的配置var tabsConfig = [{title: '上傳 video',tpl: '<div class="w-e-up-img-container">\n ' +'<div id="' + upTriggerId + '" class="w-e-up-btn">\n ' +'<i class="w-e-icon-upload2"></i>\n </div>\n ' +'<div style="display:none;">\n <input id="' + upFileId + '" type="file" multiple="multiple" accept="audio/mp3, video/mp4"/>\n ' +'</div>\n </div>',events: [{// 觸發(fā)選擇視頻selector: '#' + upTriggerId,type: 'click',fn: function fn() {var $file = $('#' + upFileId);var fileElem = $file[0];if (fileElem) {fileElem.click();} else {// 返回 true 可關(guān)閉 panelreturn true;}}}, {// 選擇視頻完畢selector: '#' + upFileId,type: 'change',fn: function fn() {var $file = $('#' + upFileId);var fileElem = $file[0];if (!fileElem) {// 返回 true 可關(guān)閉 panelreturn true;}// 獲取選中的 file 對(duì)象列表var fileList = fileElem.files;if (fileList.length) {uploadVideo.uploadVideo(fileList);}// 返回 true 可關(guān)閉 panelreturn true;}}]}]; // tabs end// 判斷 tabs 的顯示var tabsConfigResult = [];tabsConfigResult.push(tabsConfig[0]);// 創(chuàng)建 panel 并顯示var panel = new Panel(this, {width: 300,tabs: tabsConfigResult});panel.show();// 記錄屬性this.panel = panel;},// 試圖改變 active 狀態(tài)tryChangeActive: function tryChangeActive(e) {var editor = this.editor;var $elem = this.$elem;if (editor._selectedImg) {this._active = true;$elem.addClass('w-e-active');} else {this._active = false;$elem.removeClass('w-e-active');}}// constructor: Video,//// onClick: function onClick() {// this._createPanel();// },//// _createPanel: function _createPanel() {// var _this = this;//// // 創(chuàng)建 id// var textValId = getRandom('text-val');// var btnId = getRandom('btn');//// // 創(chuàng)建 panel// var panel = new Panel(this, {// width: 350,// // 一個(gè) panel 多個(gè) tab// tabs: [{// // 標(biāo)題// title: '插入視頻',// // 模板// tpl: '<div>\n <input id="' + textValId + '" type="text" class="block" placeholder="\u683C\u5F0F\u5982\uFF1A<iframe src=... ></iframe>"/>\n <div class="w-e-button-container">\n <button id="' + btnId + '" class="right">\u63D2\u5165</button>\n </div>\n </div>',// // 事件綁定// events: [{// selector: '#' + btnId,// type: 'click',// fn: function fn() {// var $text = $('#' + textValId);// var val = $text.val().trim();//// // 測(cè)試用視頻地址// // <iframe height=498 width=510 src='http://player.youku.com/embed/XMjcwMzc3MzM3Mg==' frameborder=0 'allowfullscreen'></iframe>//// if (val) {// // 插入視頻// _this._insert(val);// }//// // 返回 true,表示該事件執(zhí)行完之后,panel 要關(guān)閉。否則 panel 不會(huì)關(guān)閉// return true;// }// }]// } // first tab end// ] // tabs end// }); // panel end//// // 顯示 panel// panel.show();//// // 記錄屬性// this.panel = panel;// },//// // 插入視頻// _insert: function _insert(val) {// var editor = this.editor;// editor.cmd.do('insertHTML', val + '<p><br></p>');// }};/*menu - img */ // 構(gòu)造函數(shù)function Image(editor) {this.editor = editor;var imgMenuId = getRandom('w-e-img');this.$elem = $('<div class="w-e-menu" id="' + imgMenuId + '"><i class="w-e-icon-image"><i/></div>');editor.imgMenuId = imgMenuId;this.type = 'panel';// 當(dāng)前是否 active 狀態(tài)this._active = false;}// 原型Image.prototype = {constructor: Image,onClick: function onClick() {var editor = this.editor;var config = editor.config;if (config.qiniu) {return;}if (this._active) {this._createEditPanel();} else {this._createInsertPanel();}},_createEditPanel: function _createEditPanel() {var editor = this.editor;// idvar width30 = getRandom('width-30');var width50 = getRandom('width-50');var width100 = getRandom('width-100');var delBtn = getRandom('del-btn');// tab 配置var tabsConfig = [{title: '編輯圖片',tpl: '<div>\n <div class="w-e-button-container" style="border-bottom:1px solid #f1f1f1;padding-bottom:5px;margin-bottom:5px;">\n <span style="float:left;font-size:14px;margin:4px 5px 0 5px;color:#333;">\u6700\u5927\u5BBD\u5EA6\uFF1A</span>\n <button id="' + width30 + '" class="left">30%</button>\n <button id="' + width50 + '" class="left">50%</button>\n <button id="' + width100 + '" class="left">100%</button>\n </div>\n <div class="w-e-button-container">\n <button id="' + delBtn + '" class="gray left">\u5220\u9664\u56FE\u7247</button>\n </dv>\n </div>',events: [{selector: '#' + width30,type: 'click',fn: function fn() {var $img = editor._selectedImg;if ($img) {$img.css('max-width', '30%');}// 返回 true,表示該事件執(zhí)行完之后,panel 要關(guān)閉。否則 panel 不會(huì)關(guān)閉return true;}}, {selector: '#' + width50,type: 'click',fn: function fn() {var $img = editor._selectedImg;if ($img) {$img.css('max-width', '50%');}// 返回 true,表示該事件執(zhí)行完之后,panel 要關(guān)閉。否則 panel 不會(huì)關(guān)閉return true;}}, {selector: '#' + width100,type: 'click',fn: function fn() {var $img = editor._selectedImg;if ($img) {$img.css('max-width', '100%');}// 返回 true,表示該事件執(zhí)行完之后,panel 要關(guān)閉。否則 panel 不會(huì)關(guān)閉return true;}}, {selector: '#' + delBtn,type: 'click',fn: function fn() {var $img = editor._selectedImg;if ($img) {$img.remove();}// 返回 true,表示該事件執(zhí)行完之后,panel 要關(guān)閉。否則 panel 不會(huì)關(guān)閉return true;}}]}];// 創(chuàng)建 panel 并顯示var panel = new Panel(this, {width: 300,tabs: tabsConfig});panel.show();// 記錄屬性this.panel = panel;},_createInsertPanel: function _createInsertPanel() {var editor = this.editor;var uploadImg = editor.uploadImg;var config = editor.config;// idvar upTriggerId = getRandom('up-trigger');var upFileId = getRandom('up-file');var linkUrlId = getRandom('link-url');var linkBtnId = getRandom('link-btn');// tabs 的配置var tabsConfig = [{title: '上傳圖片',tpl: '<div class="w-e-up-img-container">\n <div id="' + upTriggerId + '" class="w-e-up-btn">\n <i class="w-e-icon-upload2"></i>\n </div>\n <div style="display:none;">\n <input id="' + upFileId + '" type="file" multiple="multiple" accept="image/jpg,image/jpeg,image/png,image/gif,image/bmp"/>\n </div>\n </div>',events: [{// 觸發(fā)選擇圖片selector: '#' + upTriggerId,type: 'click',fn: function fn() {var $file = $('#' + upFileId);var fileElem = $file[0];if (fileElem) {fileElem.click();} else {// 返回 true 可關(guān)閉 panelreturn true;}}}, {// 選擇圖片完畢selector: '#' + upFileId,type: 'change',fn: function fn() {var $file = $('#' + upFileId);var fileElem = $file[0];if (!fileElem) {// 返回 true 可關(guān)閉 panelreturn true;}// 獲取選中的 file 對(duì)象列表var fileList = fileElem.files;if (fileList.length) {uploadImg.uploadImg(fileList);}// 返回 true 可關(guān)閉 panelreturn true;}}]}, // first tab end{title: '網(wǎng)絡(luò)圖片',tpl: '<div>\n <input id="' + linkUrlId + '" type="text" class="block" placeholder="\u56FE\u7247\u94FE\u63A5"/></td>\n <div class="w-e-button-container">\n <button id="' + linkBtnId + '" class="right">\u63D2\u5165</button>\n </div>\n </div>',events: [{selector: '#' + linkBtnId,type: 'click',fn: function fn() {var $linkUrl = $('#' + linkUrlId);var url = $linkUrl.val().trim();if (url) {uploadImg.insertLinkImg(url);}// 返回 true 表示函數(shù)執(zhí)行結(jié)束之后關(guān)閉 panelreturn true;}}]} // second tab end]; // tabs end// 判斷 tabs 的顯示var tabsConfigResult = [];if ((config.uploadImgShowBase64 || config.uploadImgServer || config.customUploadImg) && window.FileReader) {// 顯示“上傳圖片”tabsConfigResult.push(tabsConfig[0]);}if (config.showLinkImg) {// 顯示“網(wǎng)絡(luò)圖片”tabsConfigResult.push(tabsConfig[1]);}// 創(chuàng)建 panel 并顯示var panel = new Panel(this, {width: 300,tabs: tabsConfigResult});panel.show();// 記錄屬性this.panel = panel;},// 試圖改變 active 狀態(tài)tryChangeActive: function tryChangeActive(e) {var editor = this.editor;var $elem = this.$elem;if (editor._selectedImg) {this._active = true;$elem.addClass('w-e-active');} else {this._active = false;$elem.removeClass('w-e-active');}}};/*所有菜單的匯總 */// 存儲(chǔ)菜單的構(gòu)造函數(shù)var MenuConstructors = {};MenuConstructors.bold = Bold;MenuConstructors.head = Head;MenuConstructors.link = Link;MenuConstructors.italic = Italic;MenuConstructors.redo = Redo;MenuConstructors.strikeThrough = StrikeThrough;MenuConstructors.underline = Underline;MenuConstructors.undo = Undo;MenuConstructors.list = List;MenuConstructors.justify = Justify;MenuConstructors.foreColor = ForeColor;MenuConstructors.backColor = BackColor;MenuConstructors.quote = Quote;MenuConstructors.code = Code;MenuConstructors.emoticon = Emoticon;MenuConstructors.table = Table;MenuConstructors.video = Video;MenuConstructors.image = Image;/*菜單集合 */ // 構(gòu)造函數(shù)function Menus(editor) {this.editor = editor;this.menus = {};}// 修改原型Menus.prototype = {constructor: Menus,// 初始化菜單init: function init() {var _this = this;var editor = this.editor;var config = editor.config || {};var configMenus = config.menus || []; // 獲取配置中的菜單// 根據(jù)配置信息,創(chuàng)建菜單configMenus.forEach(function (menuKey) {var MenuConstructor = MenuConstructors[menuKey];if (MenuConstructor && typeof MenuConstructor === 'function') {// 創(chuàng)建單個(gè)菜單_this.menus[menuKey] = new MenuConstructor(editor);}});// 添加到菜單欄this._addToToolbar();// 綁定事件this._bindEvent();},// 添加到菜單欄_addToToolbar: function _addToToolbar() {var editor = this.editor;var $toolbarElem = editor.$toolbarElem;var menus = this.menus;var config = editor.config;// config.zIndex 是配置的編輯區(qū)域的 z-index,菜單的 z-index 得在其基礎(chǔ)上 +1var zIndex = config.zIndex + 1;objForEach(menus, function (key, menu) {var $elem = menu.$elem;if ($elem) {// 設(shè)置 z-index$elem.css('z-index', zIndex);$toolbarElem.append($elem);}});},// 綁定菜單 click mouseenter 事件_bindEvent: function _bindEvent() {var menus = this.menus;var editor = this.editor;objForEach(menus, function (key, menu) {var type = menu.type;if (!type) {return;}var $elem = menu.$elem;var droplist = menu.droplist;var panel = menu.panel;// 點(diǎn)擊類型,例如 boldif (type === 'click' && menu.onClick) {$elem.on('click', function (e) {if (editor.selection.getRange() == null) {return;}menu.onClick(e);});}// 下拉框,例如 headif (type === 'droplist' && droplist) {$elem.on('mouseenter', function (e) {if (editor.selection.getRange() == null) {return;}// 顯示droplist.showTimeoutId = setTimeout(function () {droplist.show();}, 200);}).on('mouseleave', function (e) {// 隱藏droplist.hideTimeoutId = setTimeout(function () {droplist.hide();}, 0);});}// 彈框類型,例如 linkif (type === 'panel' && menu.onClick) {$elem.on('click', function (e) {e.stopPropagation();if (editor.selection.getRange() == null) {return;}// 在自定義事件中顯示 panelmenu.onClick(e);});}});},// 嘗試修改菜單狀態(tài)changeActive: function changeActive() {var menus = this.menus;objForEach(menus, function (key, menu) {if (menu.tryChangeActive) {setTimeout(function () {menu.tryChangeActive();}, 100);}});}};/*粘貼信息的處理 */// 獲取粘貼的純文本function getPasteText(e) {var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData;var pasteText = void 0;if (clipboardData == null) {pasteText = window.clipboardData && window.clipboardData.getData('text');} else {pasteText = clipboardData.getData('text/plain');}return replaceHtmlSymbol(pasteText);}// 獲取粘貼的htmlfunction getPasteHtml(e, filterStyle) {var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData;var pasteText = void 0,pasteHtml = void 0;if (clipboardData == null) {pasteText = window.clipboardData && window.clipboardData.getData('text');} else {pasteText = clipboardData.getData('text/plain');pasteHtml = clipboardData.getData('text/html');}if (!pasteHtml && pasteText) {pasteHtml = '<p>' + replaceHtmlSymbol(pasteText) + '</p>';}if (!pasteHtml) {return;}// 過(guò)濾word中狀態(tài)過(guò)來(lái)的無(wú)用字符var docSplitHtml = pasteHtml.split('</html>');if (docSplitHtml.length === 2) {pasteHtml = docSplitHtml[0];}// 過(guò)濾無(wú)用標(biāo)簽pasteHtml = pasteHtml.replace(/<(meta|script|link).+?>/igm, '');// 去掉注釋pasteHtml = pasteHtml.replace(/<!--.*?-->/mg, '');if (filterStyle) {// 過(guò)濾樣式pasteHtml = pasteHtml.replace(/\s?(class|style)=('|").+?('|")/igm, '');} else {// 保留樣式pasteHtml = pasteHtml.replace(/\s?class=('|").+?('|")/igm, '');}return pasteHtml;}// 獲取粘貼的圖片文件function getPasteImgs(e) {var result = [];var txt = getPasteText(e);if (txt) {// 有文字,就忽略圖片return result;}var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData || {};var items = clipboardData.items;if (!items) {return result;}objForEach(items, function (key, value) {var type = value.type;if (/image/i.test(type)) {result.push(value.getAsFile());}});return result;}/*編輯區(qū)域 */// 獲取一個(gè) elem.childNodes 的 JSON 數(shù)據(jù)function getChildrenJSON($elem) {var result = [];var $children = $elem.childNodes() || []; // 注意 childNodes() 可以獲取文本節(jié)點(diǎn)$children.forEach(function (curElem) {var elemResult = void 0;var nodeType = curElem.nodeType;// 文本節(jié)點(diǎn)if (nodeType === 3) {elemResult = curElem.textContent;}// 普通 DOM 節(jié)點(diǎn)if (nodeType === 1) {elemResult = {};// tagelemResult.tag = curElem.nodeName.toLowerCase();// attrvar attrData = [];var attrList = curElem.attributes || {};var attrListLength = attrList.length || 0;for (var i = 0; i < attrListLength; i++) {var attr = attrList[i];attrData.push({name: attr.name,value: attr.value});}elemResult.attrs = attrData;// children(遞歸)elemResult.children = getChildrenJSON($(curElem));}result.push(elemResult);});return result;}// 構(gòu)造函數(shù)function Text(editor) {this.editor = editor;}// 修改原型Text.prototype = {constructor: Text,// 初始化init: function init() {// 綁定事件this._bindEvent();},// 清空內(nèi)容clear: function clear() {this.html('<p><br></p>');},// 獲取 設(shè)置 htmlhtml: function html(val) {var editor = this.editor;var $textElem = editor.$textElem;if (val == null) {return $textElem.html();} else {$textElem.html(val);// 初始化選取,將光標(biāo)定位到內(nèi)容尾部editor.initSelection();}},// 獲取 JSONgetJSON: function getJSON() {var editor = this.editor;var $textElem = editor.$textElem;return getChildrenJSON($textElem);},// 獲取 設(shè)置 texttext: function text(val) {var editor = this.editor;var $textElem = editor.$textElem;if (val == null) {return $textElem.text();} else {$textElem.text('<p>' + val + '</p>');// 初始化選取,將光標(biāo)定位到內(nèi)容尾部editor.initSelection();}},// 追加內(nèi)容append: function append(html) {var editor = this.editor;var $textElem = editor.$textElem;$textElem.append($(html));// 初始化選取,將光標(biāo)定位到內(nèi)容尾部editor.initSelection();},// 綁定事件_bindEvent: function _bindEvent() {// 實(shí)時(shí)保存選取this._saveRangeRealTime();// 按回車建時(shí)的特殊處理this._enterKeyHandle();// 清空時(shí)保留 <p><br></p>this._clearHandle();// 粘貼事件(粘貼文字,粘貼圖片)this._pasteHandle();// tab 特殊處理this._tabHandle();// img 點(diǎn)擊this._imgHandle();// 拖拽事件this._dragHandle();},// 實(shí)時(shí)保存選取_saveRangeRealTime: function _saveRangeRealTime() {var editor = this.editor;var $textElem = editor.$textElem;// 保存當(dāng)前的選區(qū)function saveRange(e) {// 隨時(shí)保存選區(qū)editor.selection.saveRange();// 更新按鈕 ative 狀態(tài)editor.menus.changeActive();}// 按鍵后保存$textElem.on('keyup', saveRange);$textElem.on('mousedown', function (e) {// mousedown 狀態(tài)下,鼠標(biāo)滑動(dòng)到編輯區(qū)域外面,也需要保存選區(qū)$textElem.on('mouseleave', saveRange);});$textElem.on('mouseup', function (e) {saveRange();// 在編輯器區(qū)域之內(nèi)完成點(diǎn)擊,取消鼠標(biāo)滑動(dòng)到編輯區(qū)外面的事件$textElem.off('mouseleave', saveRange);});},// 按回車鍵時(shí)的特殊處理_enterKeyHandle: function _enterKeyHandle() {var editor = this.editor;var $textElem = editor.$textElem;function insertEmptyP($selectionElem) {var $p = $('<p><br></p>');$p.insertBefore($selectionElem);editor.selection.createRangeByElem($p, true);editor.selection.restoreSelection();$selectionElem.remove();}// 將回車之后生成的非 <p> 的頂級(jí)標(biāo)簽,改為 <p>function pHandle(e) {var $selectionElem = editor.selection.getSelectionContainerElem();var $parentElem = $selectionElem.parent();if ($parentElem.html() === '<code><br></code>') {// 回車之前光標(biāo)所在一個(gè) <p><code>.....</code></p> ,忽然回車生成一個(gè)空的 <p><code><br></code></p>// 而且繼續(xù)回車跳不出去,因此只能特殊處理insertEmptyP($selectionElem);return;}if (!$parentElem.equal($textElem)) {// 不是頂級(jí)標(biāo)簽return;}var nodeName = $selectionElem.getNodeName();if (nodeName === 'P') {// 當(dāng)前的標(biāo)簽是 P ,不用做處理return;}if ($selectionElem.text()) {// 有內(nèi)容,不做處理return;}// 插入 <p> ,并將選取定位到 <p>,刪除當(dāng)前標(biāo)簽insertEmptyP($selectionElem);}$textElem.on('keyup', function (e) {if (e.keyCode !== 13) {// 不是回車鍵return;}// 將回車之后生成的非 <p> 的頂級(jí)標(biāo)簽,改為 <p>pHandle(e);});// <pre><code></code></pre> 回車時(shí) 特殊處理function codeHandle(e) {var $selectionElem = editor.selection.getSelectionContainerElem();if (!$selectionElem) {return;}var $parentElem = $selectionElem.parent();var selectionNodeName = $selectionElem.getNodeName();var parentNodeName = $parentElem.getNodeName();if (selectionNodeName !== 'CODE' || parentNodeName !== 'PRE') {// 不符合要求 忽略return;}if (!editor.cmd.queryCommandSupported('insertHTML')) {// 必須原生支持 insertHTML 命令return;}// 處理:光標(biāo)定位到代碼末尾,聯(lián)系點(diǎn)擊兩次回車,即跳出代碼塊if (editor._willBreakCode === true) {// 此時(shí)可以跳出代碼塊// 插入 <p> ,并將選取定位到 <p>var $p = $('<p><br></p>');$p.insertAfter($parentElem);editor.selection.createRangeByElem($p, true);editor.selection.restoreSelection();// 修改狀態(tài)editor._willBreakCode = false;e.preventDefault();return;}var _startOffset = editor.selection.getRange().startOffset;// 處理:回車時(shí),不能插入 <br> 而是插入 \n ,因?yàn)槭窃?pre 標(biāo)簽里面editor.cmd.do('insertHTML', '\n');editor.selection.saveRange();if (editor.selection.getRange().startOffset === _startOffset) {// 沒(méi)起作用,再來(lái)一遍editor.cmd.do('insertHTML', '\n');}var codeLength = $selectionElem.html().length;if (editor.selection.getRange().startOffset + 1 === codeLength) {// 說(shuō)明光標(biāo)在代碼最后的位置,執(zhí)行了回車操作// 記錄下來(lái),以便下次回車時(shí)候跳出 codeeditor._willBreakCode = true;}// 阻止默認(rèn)行為e.preventDefault();}$textElem.on('keydown', function (e) {if (e.keyCode !== 13) {// 不是回車鍵// 取消即將跳轉(zhuǎn)代碼塊的記錄editor._willBreakCode = false;return;}// <pre><code></code></pre> 回車時(shí) 特殊處理codeHandle(e);});},// 清空時(shí)保留 <p><br></p>_clearHandle: function _clearHandle() {var editor = this.editor;var $textElem = editor.$textElem;$textElem.on('keydown', function (e) {if (e.keyCode !== 8) {return;}var txtHtml = $textElem.html().toLowerCase().trim();if (txtHtml === '<p><br></p>') {// 最后剩下一個(gè)空行,就不再刪除了e.preventDefault();return;}});$textElem.on('keyup', function (e) {if (e.keyCode !== 8) {return;}var $p = void 0;var txtHtml = $textElem.html().toLowerCase().trim();// firefox 時(shí)用 txtHtml === '<br>' 判斷,其他用 !txtHtml 判斷if (!txtHtml || txtHtml === '<br>') {// 內(nèi)容空了$p = $('<p><br/></p>');$textElem.html(''); // 一定要先清空,否則在 firefox 下有問(wèn)題$textElem.append($p);editor.selection.createRangeByElem($p, false, true);editor.selection.restoreSelection();}});},// 粘貼事件(粘貼文字 粘貼圖片)_pasteHandle: function _pasteHandle() {var editor = this.editor;var config = editor.config;var pasteFilterStyle = config.pasteFilterStyle;var pasteTextHandle = config.pasteTextHandle;var $textElem = editor.$textElem;// 粘貼圖片、文本的事件,每次只能執(zhí)行一個(gè)// 判斷該次粘貼事件是否可以執(zhí)行var pasteTime = 0;function canDo() {var now = Date.now();var flag = false;if (now - pasteTime >= 500) {// 間隔大于 500 ms ,可以執(zhí)行flag = true;}pasteTime = now;return flag;}// 粘貼文字$textElem.on('paste', function (e) {if (UA.isIE()) {return;} else {// 阻止默認(rèn)行為,使用 execCommand 的粘貼命令e.preventDefault();}// 粘貼圖片和文本,只能同時(shí)使用一個(gè)if (!canDo()) {return;}// 獲取粘貼的文字var pasteHtml = getPasteHtml(e, pasteFilterStyle);var pasteText = getPasteText(e);pasteText = pasteText.replace(/\n/gm, '<br>');// 自定義處理粘貼的內(nèi)容if (pasteTextHandle && typeof pasteTextHandle === 'function') {pasteHtml = '' + (pasteTextHandle(pasteHtml) || '');pasteText = '' + (pasteTextHandle(pasteText) || '');}var $selectionElem = editor.selection.getSelectionContainerElem();if (!$selectionElem) {return;}var nodeName = $selectionElem.getNodeName();// code 中只能粘貼純文本if (nodeName === 'CODE' || nodeName === 'PRE') {editor.cmd.do('insertHTML', '<p>' + pasteText + '</p>');return;}// 先放開(kāi)注釋,有問(wèn)題再追查 ————// // 表格中忽略,可能會(huì)出現(xiàn)異常問(wèn)題// if (nodeName === 'TD' || nodeName === 'TH') {// return// }if (!pasteHtml) {return;}try {// firefox 中,獲取的 pasteHtml 可能是沒(méi)有 <ul> 包裹的 <li>// 因此執(zhí)行 insertHTML 會(huì)報(bào)錯(cuò)editor.cmd.do('insertHTML', pasteHtml);} catch (ex) {// 此時(shí)使用 pasteText 來(lái)兼容一下editor.cmd.do('insertHTML', '<p>' + pasteText + '</p>');}});// 粘貼圖片$textElem.on('paste', function (e) {if (UA.isIE()) {return;} else {e.preventDefault();}// 粘貼圖片和文本,只能同時(shí)使用一個(gè)if (!canDo()) {return;}// 獲取粘貼的圖片var pasteFiles = getPasteImgs(e);if (!pasteFiles || !pasteFiles.length) {return;}// 獲取當(dāng)前的元素var $selectionElem = editor.selection.getSelectionContainerElem();if (!$selectionElem) {return;}var nodeName = $selectionElem.getNodeName();// code 中粘貼忽略if (nodeName === 'CODE' || nodeName === 'PRE') {return;}// 上傳圖片var uploadImg = editor.uploadImg;uploadImg.uploadImg(pasteFiles);});},// tab 特殊處理_tabHandle: function _tabHandle() {var editor = this.editor;var $textElem = editor.$textElem;$textElem.on('keydown', function (e) {if (e.keyCode !== 9) {return;}if (!editor.cmd.queryCommandSupported('insertHTML')) {// 必須原生支持 insertHTML 命令return;}var $selectionElem = editor.selection.getSelectionContainerElem();if (!$selectionElem) {return;}var $parentElem = $selectionElem.parent();var selectionNodeName = $selectionElem.getNodeName();var parentNodeName = $parentElem.getNodeName();if (selectionNodeName === 'CODE' && parentNodeName === 'PRE') {// <pre><code> 里面editor.cmd.do('insertHTML', ' ');} else {// 普通文字editor.cmd.do('insertHTML', '&nbsp;&nbsp;&nbsp;&nbsp;');}e.preventDefault();});},// img 點(diǎn)擊_imgHandle: function _imgHandle() {var editor = this.editor;var $textElem = editor.$textElem;// 為圖片增加 selected 樣式$textElem.on('click', 'img', function (e) {var img = this;var $img = $(img);if ($img.attr('data-w-e') === '1') {// 是表情圖片,忽略return;}// 記錄當(dāng)前點(diǎn)擊過(guò)的圖片editor._selectedImg = $img;// 修改選區(qū)并 restore ,防止用戶此時(shí)點(diǎn)擊退格鍵,會(huì)刪除其他內(nèi)容editor.selection.createRangeByElem($img);editor.selection.restoreSelection();});// 去掉圖片的 selected 樣式$textElem.on('click keyup', function (e) {if (e.target.matches('img')) {// 點(diǎn)擊的是圖片,忽略return;}// 刪除記錄editor._selectedImg = null;});},// 拖拽事件_dragHandle: function _dragHandle() {var editor = this.editor;// 禁用 document 拖拽事件var $document = $(document);$document.on('dragleave drop dragenter dragover', function (e) {e.preventDefault();});// 添加編輯區(qū)域拖拽事件var $textElem = editor.$textElem;$textElem.on('drop', function (e) {e.preventDefault();var files = e.dataTransfer && e.dataTransfer.files;if (!files || !files.length) {return;}// 上傳圖片var uploadImg = editor.uploadImg;uploadImg.uploadImg(files);});}};/*命令,封裝 document.execCommand */// 構(gòu)造函數(shù)function Command(editor) {this.editor = editor;}// 修改原型Command.prototype = {constructor: Command,// 執(zhí)行命令do: function _do(name, value) {var editor = this.editor;// 如果無(wú)選區(qū),忽略if (!editor.selection.getRange()) {return;}// 恢復(fù)選取editor.selection.restoreSelection();// 執(zhí)行var _name = '_' + name;if (this[_name]) {// 有自定義事件this[_name](value);} else {// 默認(rèn) commandthis._execCommand(name, value);}// 修改菜單狀態(tài)editor.menus.changeActive();// 最后,恢復(fù)選取保證光標(biāo)在原來(lái)的位置閃爍editor.selection.saveRange();editor.selection.restoreSelection();// 觸發(fā) onchangeeditor.change && editor.change();},// 自定義 insertHTML 事件_insertHTML: function _insertHTML(html) {var editor = this.editor;var range = editor.selection.getRange();if (this.queryCommandSupported('insertHTML')) {// W3Cthis._execCommand('insertHTML', html);} else if (range.insertNode) {// IErange.deleteContents();range.insertNode($(html)[0]);} else if (range.pasteHTML) {// IE <= 10range.pasteHTML(html);}},// 插入 elem_insertElem: function _insertElem($elem) {var editor = this.editor;var range = editor.selection.getRange();if (range.insertNode) {range.deleteContents();range.insertNode($elem[0]);}},// 封裝 execCommand_execCommand: function _execCommand(name, value) {document.execCommand(name, false, value);},// 封裝 document.queryCommandValuequeryCommandValue: function queryCommandValue(name) {return document.queryCommandValue(name);},// 封裝 document.queryCommandStatequeryCommandState: function queryCommandState(name) {return document.queryCommandState(name);},// 封裝 document.queryCommandSupportedqueryCommandSupported: function queryCommandSupported(name) {return document.queryCommandSupported(name);}};/*selection range API */// 構(gòu)造函數(shù)function API(editor) {this.editor = editor;this._currentRange = null;}// 修改原型API.prototype = {constructor: API,// 獲取 range 對(duì)象getRange: function getRange() {return this._currentRange;},// 保存選區(qū)saveRange: function saveRange(_range) {if (_range) {// 保存已有選區(qū)this._currentRange = _range;return;}// 獲取當(dāng)前的選區(qū)var selection = window.getSelection();if (selection.rangeCount === 0) {return;}var range = selection.getRangeAt(0);// 判斷選區(qū)內(nèi)容是否在編輯內(nèi)容之內(nèi)var $containerElem = this.getSelectionContainerElem(range);if (!$containerElem) {return;}var editor = this.editor;var $textElem = editor.$textElem;if ($textElem.isContain($containerElem)) {// 是編輯內(nèi)容之內(nèi)的this._currentRange = range;}},// 折疊選區(qū)collapseRange: function collapseRange(toStart) {if (toStart == null) {// 默認(rèn)為 falsetoStart = false;}var range = this._currentRange;if (range) {range.collapse(toStart);}},// 選中區(qū)域的文字getSelectionText: function getSelectionText() {var range = this._currentRange;if (range) {return this._currentRange.toString();} else {return '';}},// 選區(qū)的 $ElemgetSelectionContainerElem: function getSelectionContainerElem(range) {range = range || this._currentRange;var elem = void 0;if (range) {elem = range.commonAncestorContainer;return $(elem.nodeType === 1 ? elem : elem.parentNode);}},getSelectionStartElem: function getSelectionStartElem(range) {range = range || this._currentRange;var elem = void 0;if (range) {elem = range.startContainer;return $(elem.nodeType === 1 ? elem : elem.parentNode);}},getSelectionEndElem: function getSelectionEndElem(range) {range = range || this._currentRange;var elem = void 0;if (range) {elem = range.endContainer;return $(elem.nodeType === 1 ? elem : elem.parentNode);}},// 選區(qū)是否為空isSelectionEmpty: function isSelectionEmpty() {var range = this._currentRange;if (range && range.startContainer) {if (range.startContainer === range.endContainer) {if (range.startOffset === range.endOffset) {return true;}}}return false;},// 恢復(fù)選區(qū)restoreSelection: function restoreSelection() {var selection = window.getSelection();selection.removeAllRanges();selection.addRange(this._currentRange);},// 創(chuàng)建一個(gè)空白(即 &#8203 字符)選區(qū)createEmptyRange: function createEmptyRange() {var editor = this.editor;var range = this.getRange();var $elem = void 0;if (!range) {// 當(dāng)前無(wú) rangereturn;}if (!this.isSelectionEmpty()) {// 當(dāng)前選區(qū)必須沒(méi)有內(nèi)容才可以return;}try {// 目前只支持 webkit 內(nèi)核if (UA.isWebkit()) {// 插入 &#8203editor.cmd.do('insertHTML', '&#8203;');// 修改 offset 位置range.setEnd(range.endContainer, range.endOffset + 1);// 存儲(chǔ)this.saveRange(range);} else {$elem = $('<strong>&#8203;</strong>');editor.cmd.do('insertElem', $elem);this.createRangeByElem($elem, true);}} catch (ex) {// 部分情況下會(huì)報(bào)錯(cuò),兼容一下}},// 根據(jù) $Elem 設(shè)置選區(qū)createRangeByElem: function createRangeByElem($elem, toStart, isContent) {// $elem - 經(jīng)過(guò)封裝的 elem// toStart - true 開(kāi)始位置,false 結(jié)束位置// isContent - 是否選中Elem的內(nèi)容if (!$elem.length) {return;}var elem = $elem[0];var range = document.createRange();if (isContent) {range.selectNodeContents(elem);} else {range.selectNode(elem);}if (typeof toStart === 'boolean') {range.collapse(toStart);}// 存儲(chǔ) rangethis.saveRange(range);}};/*上傳進(jìn)度條 */function Progress(editor) {this.editor = editor;this._time = 0;this._isShow = false;this._isRender = false;this._timeoutId = 0;this.$textContainer = editor.$textContainerElem;this.$bar = $('<div class="w-e-progress"></div>');}Progress.prototype = {constructor: Progress,show: function show(progress) {var _this = this;// 狀態(tài)處理if (this._isShow) {return;}this._isShow = true;// 渲染var $bar = this.$bar;if (!this._isRender) {var $textContainer = this.$textContainer;$textContainer.append($bar);} else {this._isRender = true;}// 改變進(jìn)度(節(jié)流,100ms 渲染一次)if (Date.now() - this._time > 100) {if (progress <= 1) {$bar.css('width', progress * 100 + '%');this._time = Date.now();}}// 隱藏var timeoutId = this._timeoutId;if (timeoutId) {clearTimeout(timeoutId);}timeoutId = setTimeout(function () {_this._hide();}, 500);},_hide: function _hide() {var $bar = this.$bar;$bar.remove();// 修改狀態(tài)this._time = 0;this._isShow = false;this._isRender = false;}};var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {return typeof obj;} : function (obj) {return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;};/*上傳視頻*/// 構(gòu)造函數(shù)function UploadVideo(editor) {this.editor = editor;}// 原型UploadVideo.prototype = {constructor: UploadVideo,// 根據(jù) debug 彈出不同的信息_alert: function _alert(alertInfo, debugInfo) {var editor = this.editor;var debug = editor.config.debug;// var debug = true;var customAlert = editor.config.customAlert;if (debug) {throw new Error('wangEditor: ' + (debugInfo || alertInfo));} else {if (customAlert && typeof customAlert === 'function') {customAlert(alertInfo);} else {alert(alertInfo);}}},//插入視頻的方法 需要單獨(dú)定義insertLinkVideo:function(link){var _this3 = this;if (!link) {return;}var editor = this.editor;var config = editor.config;// 校驗(yàn)格式var linkVideoCheck = config.linkVideoCheck;var checkResult = void 0;if (linkVideoCheck && linkVideoCheck === 'function') {checkResult = linkVideoCheck(link);if (typeof checkResult === 'string') {// 校驗(yàn)失敗,提示信息alert(checkResult);return;}}editor.cmd.do('insertHTML', '<video src="' + link + '" controls/>');// 驗(yàn)證視頻 url 是否有效,無(wú)效的話給出提示var video = document.createElement('video');video.onload = function () {var callback = config.linkVideoCallback;if (callback && typeof callback === 'function') {callback(link);}video = null;};video.onerror = function () {video = null;// 無(wú)法成功下載圖片_this2._alert('插入視頻錯(cuò)誤', 'wangEditor: \u63D2\u5165\u56FE\u7247\u51FA\u9519\uFF0C\u56FE\u7247\u94FE\u63A5\u662F "' + link + '"\uFF0C\u4E0B\u8F7D\u8BE5\u94FE\u63A5\u5931\u8D25');return;};video.onabort = function () {video = null;};video.src = link;},// 上傳視頻uploadVideo: function uploadVideo(files) {var _this3 = this;if (!files || !files.length) {return;}// ------------------------------ 獲取配置信息 ------------------------------var editor = this.editor;var config = editor.config;var uploadVideoServer = "/uploadVideo";//上傳地址var maxSize = 100 * 1024 * 1024; //100Mvar maxSizeM = maxSize / 1000 / 1000;var maxLength = 1;var uploadFileName = "myvideo";var uploadVideoParams = config.uploadVideoParams || {};var uploadVideoHeaders = {};var hooks =config.uploadImgHooks || {};var timeout = 5 * 60 * 1000; //5 minvar withCredentials = config.withCredentials;if (withCredentials == null) {withCredentials = false;}// ------------------------------ 驗(yàn)證文件信息 ------------------------------var resultFiles = [];var errInfo = [];arrForEach(files, function (file) {var name = file.name;var size = file.size;// chrome 低版本 name === undefinedif (!name || !size) {return;}if (/\.(mp4)$/i.test(name) === false && /\.(mp3)$/i.test(name) === false) {// 后綴名不合法,不是視頻errInfo.push('\u3010' + name + '\u3011\u4e0d\u662f\u89c6\u9891');return;}if (maxSize < size) {// 上傳視頻過(guò)大errInfo.push('\u3010' + name + '\u3011\u5927\u4E8E ' + maxSizeM + 'M');return;}// 驗(yàn)證通過(guò)的加入結(jié)果列表resultFiles.push(file);});// 拋出驗(yàn)證信息if (errInfo.length) {this._alert('視頻/音頻 驗(yàn)證未通過(guò): \n' + errInfo.join('\n'));return;}if (resultFiles.length > maxLength) {this._alert('一次最多上傳' + maxLength + '個(gè)視頻');return;}// ------------------------------ 自定義上傳 ------------------------------// 添加視頻數(shù)據(jù)var formdata = new FormData();arrForEach(resultFiles, function (file) {var name = uploadFileName || file.name;formdata.append(name, file);});// ------------------------------ 上傳視頻 ------------------------------if (uploadVideoServer && typeof uploadVideoServer === 'string') {// 添加參數(shù)var uploadVideoServer = uploadVideoServer.split('#');uploadVideoServer = uploadVideoServer[0];var uploadVideoServerHash = uploadVideoServer[1] || '';objForEach(uploadVideoParams, function (key, val) {val = encodeURIComponent(val);// 第一,將參數(shù)拼接到 url 中if (uploadVideoParamsWithUrl) {if (uploadVideoServer.indexOf('?') > 0) {uploadVideoServer += '&';} else {uploadVideoServer += '?';}uploadVideoServer = uploadVideoServer + key + '=' + val;}// 第二,將參數(shù)添加到 formdata 中formdata.append(key, val);});if (uploadVideoServerHash) {uploadVideoServer += '#' + uploadVideoServerHash;}// 定義 xhrvar xhr = new XMLHttpRequest();xhr.open('POST', uploadVideoServer);// 設(shè)置超時(shí)xhr.timeout = timeout;xhr.ontimeout = function () {// hook - timeoutif (hooks.timeout && typeof hooks.timeout === 'function') {hooks.timeout(xhr, editor);}_this3._alert('上傳視頻/音頻 超時(shí)');};// 監(jiān)控 progressif (xhr.upload) {xhr.upload.onprogress = function (e) {var percent = void 0;// 進(jìn)度條var progressBar = new Progress(editor);if (e.lengthComputable) {percent = e.loaded / e.total;progressBar.show(percent);}};}// 返回?cái)?shù)據(jù)xhr.onreadystatechange = function () {var result = void 0;if (xhr.readyState === 4) {if (xhr.status < 200 || xhr.status >= 300) {// hook - errorif (hooks.error && typeof hooks.error === 'function') {hooks.error(xhr, editor);}// xhr 返回狀態(tài)錯(cuò)誤_this3._alert('上傳視頻/音頻發(fā)生錯(cuò)誤', '\u4E0A\u4F20\u56FE\u7247\u53D1\u751F\u9519\u8BEF\uFF0C\u670D\u52A1\u5668\u8FD4\u56DE\u72B6\u6001\u662F ' + xhr.status);return;}result = xhr.responseText;if ((typeof result === 'undefined' ? 'undefined' : _typeof(result)) !== 'object') {try {console.log(result);result = JSON.parse(result);} catch (ex) {// hook - failif (hooks.fail && typeof hooks.fail === 'function') {hooks.fail(xhr, editor, result);}_this3._alert('上傳視頻/音頻失敗', '上傳視頻/音頻返回結(jié)果錯(cuò)誤,返回結(jié)果是: ' + result);return;}}if (!hooks.customInsert && result.errno == '0') {// hook - failif (hooks.fail && typeof hooks.fail === 'function') {hooks.fail(xhr, editor, result);}// 數(shù)據(jù)錯(cuò)誤_this3._alert('上傳視頻/音頻失敗', '上傳視頻/音頻返回結(jié)果錯(cuò)誤,返回結(jié)果 errno=' + result.errno);} else {if (hooks.customInsert && typeof hooks.customInsert === 'function') {hooks.customInsert(_this3.insertLinkVideo.bind(_this3), result, editor);} else {// 將視頻插入編輯器var data = result || [];// data.forEach(function (link) {// console.log(link);//// });_this3.insertLinkVideo(data.url);}// hook - successif (hooks.success && typeof hooks.success === 'function') {hooks.success(xhr, editor, result);}}}};// hook - beforeif (hooks.before && typeof hooks.before === 'function') {var beforeResult = hooks.before(xhr, editor, resultFiles);if (beforeResult && (typeof beforeResult === 'undefined' ? 'undefined' : _typeof(beforeResult)) === 'object') {if (beforeResult.prevent) {// 如果返回的結(jié)果是 {prevent: true, msg: 'xxxx'} 則表示用戶放棄上傳this._alert(beforeResult.msg);return;}}}// 自定義 headersobjForEach(uploadVideoHeaders, function (key, val) {xhr.setRequestHeader(key, val);});// 跨域傳 cookiexhr.withCredentials = withCredentials;// 發(fā)送請(qǐng)求xhr.send(formdata);// 注意,要 return 。不去操作接下來(lái)的 base64 顯示方式return;}}};/*上傳圖片 */// 構(gòu)造函數(shù)function UploadImg(editor) {this.editor = editor;}// 原型UploadImg.prototype = {constructor: UploadImg,// 根據(jù) debug 彈出不同的信息_alert: function _alert(alertInfo, debugInfo) {var editor = this.editor;var debug = editor.config.debug;var customAlert = editor.config.customAlert;if (debug) {throw new Error('wangEditor: ' + (debugInfo || alertInfo));} else {if (customAlert && typeof customAlert === 'function') {customAlert(alertInfo);} else {alert(alertInfo);}}},// 根據(jù)鏈接插入圖片insertLinkImg: function insertLinkImg(link) {var _this2 = this;if (!link) {return;}var editor = this.editor;var config = editor.config;// 校驗(yàn)格式var linkImgCheck = config.linkImgCheck;var checkResult = void 0;if (linkImgCheck && typeof linkImgCheck === 'function') {checkResult = linkImgCheck(link);if (typeof checkResult === 'string') {// 校驗(yàn)失敗,提示信息alert(checkResult);return;}}editor.cmd.do('insertHTML', '<img src="' + link + '" style="max-width:100%;"/>');// 驗(yàn)證圖片 url 是否有效,無(wú)效的話給出提示var img = document.createElement('img');img.onload = function () {var callback = config.linkImgCallback;if (callback && typeof callback === 'function') {callback(link);}img = null;};img.onerror = function () {img = null;// 無(wú)法成功下載圖片_this2._alert('插入圖片錯(cuò)誤', 'wangEditor: \u63D2\u5165\u56FE\u7247\u51FA\u9519\uFF0C\u56FE\u7247\u94FE\u63A5\u662F "' + link + '"\uFF0C\u4E0B\u8F7D\u8BE5\u94FE\u63A5\u5931\u8D25');return;};img.onabort = function () {img = null;};img.src = link;},// 上傳圖片uploadImg: function uploadImg(files) {var _this3 = this;if (!files || !files.length) {return;}// ------------------------------ 獲取配置信息 ------------------------------var editor = this.editor;var config = editor.config;var uploadImgServer = config.uploadImgServer;var uploadImgShowBase64 = config.uploadImgShowBase64;var maxSize = config.uploadImgMaxSize;var maxSizeM = maxSize / 1000 / 1000;var maxLength = config.uploadImgMaxLength || 10000;var uploadFileName = config.uploadFileName || '';var uploadImgParams = config.uploadImgParams || {};var uploadImgParamsWithUrl = config.uploadImgParamsWithUrl;var uploadImgHeaders = config.uploadImgHeaders || {};var hooks = config.uploadImgHooks || {};var timeout = config.uploadImgTimeout || 3000;var withCredentials = config.withCredentials;if (withCredentials == null) {withCredentials = false;}var customUploadImg = config.customUploadImg;if (!customUploadImg) {// 沒(méi)有 customUploadImg 的情況下,需要如下兩個(gè)配置才能繼續(xù)進(jìn)行圖片上傳if (!uploadImgServer && !uploadImgShowBase64) {return;}}// ------------------------------ 驗(yàn)證文件信息 ------------------------------var resultFiles = [];var errInfo = [];arrForEach(files, function (file) {var name = file.name;var size = file.size;// chrome 低版本 name === undefinedif (!name || !size) {return;}if (/\.(jpg|jpeg|png|bmp|gif)$/i.test(name) === false) {// 后綴名不合法,不是圖片errInfo.push('\u3010' + name + '\u3011\u4E0D\u662F\u56FE\u7247');return;}if (maxSize < size) {// 上傳圖片過(guò)大errInfo.push('\u3010' + name + '\u3011\u5927\u4E8E ' + maxSizeM + 'M');return;}// 驗(yàn)證通過(guò)的加入結(jié)果列表resultFiles.push(file);});// 拋出驗(yàn)證信息if (errInfo.length) {this._alert('圖片驗(yàn)證未通過(guò): \n' + errInfo.join('\n'));return;}if (resultFiles.length > maxLength) {this._alert('一次最多上傳' + maxLength + '張圖片');return;}// ------------------------------ 自定義上傳 ------------------------------if (customUploadImg && typeof customUploadImg === 'function') {customUploadImg(resultFiles, this.insertLinkImg.bind(this));// 阻止以下代碼執(zhí)行return;}// 添加圖片數(shù)據(jù)var formdata = new FormData();arrForEach(resultFiles, function (file) {var name = uploadFileName || file.name;formdata.append(name, file);});// ------------------------------ 上傳圖片 ------------------------------if (uploadImgServer && typeof uploadImgServer === 'string') {// 添加參數(shù)var uploadImgServerArr = uploadImgServer.split('#');uploadImgServer = uploadImgServerArr[0];var uploadImgServerHash = uploadImgServerArr[1] || '';objForEach(uploadImgParams, function (key, val) {val = encodeURIComponent(val);// 第一,將參數(shù)拼接到 url 中if (uploadImgParamsWithUrl) {if (uploadImgServer.indexOf('?') > 0) {uploadImgServer += '&';} else {uploadImgServer += '?';}uploadImgServer = uploadImgServer + key + '=' + val;}// 第二,將參數(shù)添加到 formdata 中formdata.append(key, val);});if (uploadImgServerHash) {uploadImgServer += '#' + uploadImgServerHash;}// 定義 xhrvar xhr = new XMLHttpRequest();xhr.open('POST', uploadImgServer);// 設(shè)置超時(shí)xhr.timeout = timeout;xhr.ontimeout = function () {// hook - timeoutif (hooks.timeout && typeof hooks.timeout === 'function') {hooks.timeout(xhr, editor);}_this3._alert('上傳圖片超時(shí)');};// 監(jiān)控 progressif (xhr.upload) {xhr.upload.onprogress = function (e) {var percent = void 0;// 進(jìn)度條var progressBar = new Progress(editor);if (e.lengthComputable) {percent = e.loaded / e.total;progressBar.show(percent);}};}// 返回?cái)?shù)據(jù)xhr.onreadystatechange = function () {var result = void 0;if (xhr.readyState === 4) {if (xhr.status < 200 || xhr.status >= 300) {// hook - errorif (hooks.error && typeof hooks.error === 'function') {hooks.error(xhr, editor);}// xhr 返回狀態(tài)錯(cuò)誤_this3._alert('上傳圖片發(fā)生錯(cuò)誤', '\u4E0A\u4F20\u56FE\u7247\u53D1\u751F\u9519\u8BEF\uFF0C\u670D\u52A1\u5668\u8FD4\u56DE\u72B6\u6001\u662F ' + xhr.status);return;}result = xhr.responseText;if ((typeof result === 'undefined' ? 'undefined' : _typeof(result)) !== 'object') {try {result = JSON.parse(result);} catch (ex) {// hook - failif (hooks.fail && typeof hooks.fail === 'function') {hooks.fail(xhr, editor, result);}_this3._alert('上傳圖片失敗', '上傳圖片返回結(jié)果錯(cuò)誤,返回結(jié)果是: ' + result);return;}}if (!hooks.customInsert && result.errno != '0') {// hook - failif (hooks.fail && typeof hooks.fail === 'function') {hooks.fail(xhr, editor, result);}// 數(shù)據(jù)錯(cuò)誤_this3._alert('上傳圖片失敗', '上傳圖片返回結(jié)果錯(cuò)誤,返回結(jié)果 errno=' + result.errno);} else {if (hooks.customInsert && typeof hooks.customInsert === 'function') {// 使用者自定義插入方法hooks.customInsert(_this3.insertLinkImg.bind(_this3), result, editor);} else {// 將圖片插入編輯器var data = result.data || [];data.forEach(function (link) {_this3.insertLinkImg(link);});}// hook - successif (hooks.success && typeof hooks.success === 'function') {hooks.success(xhr, editor, result);}}}};// hook - beforeif (hooks.before && typeof hooks.before === 'function') {var beforeResult = hooks.before(xhr, editor, resultFiles);if (beforeResult && (typeof beforeResult === 'undefined' ? 'undefined' : _typeof(beforeResult)) === 'object') {if (beforeResult.prevent) {// 如果返回的結(jié)果是 {prevent: true, msg: 'xxxx'} 則表示用戶放棄上傳this._alert(beforeResult.msg);return;}}}// 自定義 headersobjForEach(uploadImgHeaders, function (key, val) {xhr.setRequestHeader(key, val);});// 跨域傳 cookiexhr.withCredentials = withCredentials;// 發(fā)送請(qǐng)求xhr.send(formdata);// 注意,要 return 。不去操作接下來(lái)的 base64 顯示方式return;}// ------------------------------ 顯示 base64 格式 ------------------------------if (uploadImgShowBase64) {arrForEach(files, function (file) {var _this = _this3;var reader = new FileReader();reader.readAsDataURL(file);reader.onload = function () {_this.insertLinkImg(this.result);};});}}};/*編輯器構(gòu)造函數(shù) */// id,累加var editorId = 1;// 構(gòu)造函數(shù)function Editor(toolbarSelector, textSelector) {if (toolbarSelector == null) {// 沒(méi)有傳入任何參數(shù),報(bào)錯(cuò)throw new Error('錯(cuò)誤:初始化編輯器時(shí)候未傳入任何參數(shù),請(qǐng)查閱文檔');}// id,用以區(qū)分單個(gè)頁(yè)面不同的編輯器對(duì)象this.id = 'wangEditor-' + editorId++;this.toolbarSelector = toolbarSelector;this.textSelector = textSelector;// 自定義配置this.customConfig = {};}// 修改原型Editor.prototype = {constructor: Editor,// 初始化配置_initConfig: function _initConfig() {// _config 是默認(rèn)配置,this.customConfig 是用戶自定義配置,將它們 merge 之后再賦值var target = {};this.config = Object.assign(target, config, this.customConfig);// 將語(yǔ)言配置,生成正則表達(dá)式var langConfig = this.config.lang || {};var langArgs = [];objForEach(langConfig, function (key, val) {// key 即需要生成正則表達(dá)式的規(guī)則,如“插入鏈接”// val 即需要被替換成的語(yǔ)言,如“insert link”langArgs.push({reg: new RegExp(key, 'img'),val: val});});this.config.langArgs = langArgs;},// 初始化 DOM_initDom: function _initDom() {var _this = this;var toolbarSelector = this.toolbarSelector;var $toolbarSelector = $(toolbarSelector);var textSelector = this.textSelector;var config$$1 = this.config;var zIndex = config$$1.zIndex;// 定義變量var $toolbarElem = void 0,$textContainerElem = void 0,$textElem = void 0,$children = void 0;if (textSelector == null) {// 只傳入一個(gè)參數(shù),即是容器的選擇器或元素,toolbar 和 text 的元素自行創(chuàng)建$toolbarElem = $('<div></div>');$textContainerElem = $('<div></div>');// 將編輯器區(qū)域原有的內(nèi)容,暫存起來(lái)$children = $toolbarSelector.children();// 添加到 DOM 結(jié)構(gòu)中$toolbarSelector.append($toolbarElem).append($textContainerElem);// 自行創(chuàng)建的,需要配置默認(rèn)的樣式$toolbarElem.css('background-color', '#f1f1f1').css('border', '1px solid #ccc');$textContainerElem.css('border', '1px solid #ccc').css('border-top', 'none').css('height', '300px');} else {// toolbar 和 text 的選擇器都有值,記錄屬性$toolbarElem = $toolbarSelector;$textContainerElem = $(textSelector);// 將編輯器區(qū)域原有的內(nèi)容,暫存起來(lái)$children = $textContainerElem.children();}// 編輯區(qū)域$textElem = $('<div></div>');$textElem.attr('contenteditable', 'true').css('width', '100%').css('height', '100%');// 初始化編輯區(qū)域內(nèi)容if ($children && $children.length) {$textElem.append($children);} else {$textElem.append($('<p><br></p>'));}// 編輯區(qū)域加入DOM$textContainerElem.append($textElem);// 設(shè)置通用的 class$toolbarElem.addClass('w-e-toolbar');$textContainerElem.addClass('w-e-text-container');$textContainerElem.css('z-index', zIndex);$textElem.addClass('w-e-text');// 添加 IDvar toolbarElemId = getRandom('toolbar-elem');$toolbarElem.attr('id', toolbarElemId);var textElemId = getRandom('text-elem');$textElem.attr('id', textElemId);// 記錄屬性this.$toolbarElem = $toolbarElem;this.$textContainerElem = $textContainerElem;this.$textElem = $textElem;this.toolbarElemId = toolbarElemId;this.textElemId = textElemId;// 綁定 onchange$textContainerElem.on('click keyup', function () {_this.change && _this.change();});$toolbarElem.on('click', function () {this.change && this.change();});//綁定 onfocus 與 onblur 事件if (config$$1.onfocus || config$$1.onblur) {// 當(dāng)前編輯器是否是焦點(diǎn)狀態(tài)this.isFocus = false;$(document).on('click', function (e) {//判斷當(dāng)前點(diǎn)擊元素是否在編輯器內(nèi)var isChild = $toolbarSelector.isContain($(e.target));if (!isChild) {if (_this.isFocus) {_this.onblur && _this.onblur();}_this.isFocus = false;} else {if (!_this.isFocus) {_this.onfocus && _this.onfocus();}_this.isFocus = true;}});}},// 封裝 command_initCommand: function _initCommand() {this.cmd = new Command(this);},// 封裝 selection range API_initSelectionAPI: function _initSelectionAPI() {this.selection = new API(this);},// 添加圖片上傳_initUploadImg: function _initUploadImg() {this.uploadImg = new UploadImg(this);},// 添加視頻上傳_initUploadVideo: function _initUploadVideo() {this.uploadVideo = new UploadVideo(this);},// 初始化菜單_initMenus: function _initMenus() {this.menus = new Menus(this);this.menus.init();},// 添加 text 區(qū)域_initText: function _initText() {this.txt = new Text(this);this.txt.init();},// 初始化選區(qū),將光標(biāo)定位到內(nèi)容尾部initSelection: function initSelection(newLine) {var $textElem = this.$textElem;var $children = $textElem.children();if (!$children.length) {// 如果編輯器區(qū)域無(wú)內(nèi)容,添加一個(gè)空行,重新設(shè)置選區(qū)$textElem.append($('<p><br></p>'));this.initSelection();return;}var $last = $children.last();if (newLine) {// 新增一個(gè)空行var html = $last.html().toLowerCase();var nodeName = $last.getNodeName();if (html !== '<br>' && html !== '<br\/>' || nodeName !== 'P') {// 最后一個(gè)元素不是 <p><br></p>,添加一個(gè)空行,重新設(shè)置選區(qū)$textElem.append($('<p><br></p>'));this.initSelection();return;}}this.selection.createRangeByElem($last, false, true);this.selection.restoreSelection();},// 綁定事件_bindEvent: function _bindEvent() {// -------- 綁定 onchange 事件 --------var onChangeTimeoutId = 0;var beforeChangeHtml = this.txt.html();var config$$1 = this.config;// onchange 觸發(fā)延遲時(shí)間var onchangeTimeout = config$$1.onchangeTimeout;onchangeTimeout = parseInt(onchangeTimeout, 10);if (!onchangeTimeout || onchangeTimeout <= 0) {onchangeTimeout = 200;}var onchange = config$$1.onchange;if (onchange && typeof onchange === 'function') {// 觸發(fā) change 的有三個(gè)場(chǎng)景:// 1. $textContainerElem.on('click keyup')// 2. $toolbarElem.on('click')// 3. editor.cmd.do()this.change = function () {// 判斷是否有變化var currentHtml = this.txt.html();if (currentHtml.length === beforeChangeHtml.length) {// 需要比較每一個(gè)字符if (currentHtml === beforeChangeHtml) {return;}}// 執(zhí)行,使用節(jié)流if (onChangeTimeoutId) {clearTimeout(onChangeTimeoutId);}onChangeTimeoutId = setTimeout(function () {// 觸發(fā)配置的 onchange 函數(shù)onchange(currentHtml);beforeChangeHtml = currentHtml;}, onchangeTimeout);};}// -------- 綁定 onblur 事件 --------var onblur = config$$1.onblur;if (onblur && typeof onblur === 'function') {this.onblur = function () {var currentHtml = this.txt.html();onblur(currentHtml);};}// -------- 綁定 onfocus 事件 --------var onfocus = config$$1.onfocus;if (onfocus && typeof onfocus === 'function') {this.onfocus = function () {onfocus();};}},// 創(chuàng)建編輯器create: function create() {// 初始化配置信息this._initConfig();// 初始化 DOMthis._initDom();// 封裝 command APIthis._initCommand();// 封裝 selection range APIthis._initSelectionAPI();// 添加 textthis._initText();// 初始化菜單this._initMenus();// 添加 圖片上傳this._initUploadImg();// 添加 視頻上傳this._initUploadVideo();// 初始化選區(qū),將光標(biāo)定位到內(nèi)容尾部this.initSelection(true);// 綁定事件this._bindEvent();},// 解綁所有事件(暫時(shí)不對(duì)外開(kāi)放)_offAllEvent: function _offAllEvent() {$.offAll();}};// 檢驗(yàn)是否瀏覽器環(huán)境try {document;} catch (ex) {throw new Error('請(qǐng)?jiān)跒g覽器環(huán)境下運(yùn)行');}// polyfillpolyfill();// 這里的 `inlinecss` 將被替換成 css 代碼的內(nèi)容,詳情可去 ./gulpfile.js 中搜索 `inlinecss` 關(guān)鍵字var inlinecss = '.w-e-toolbar,.w-e-text-container,.w-e-menu-panel { padding: 0; margin: 0; box-sizing: border-box;}.w-e-toolbar *,.w-e-text-container *,.w-e-menu-panel * { padding: 0; margin: 0; box-sizing: border-box;}.w-e-clear-fix:after { content: ""; display: table; clear: both;}.w-e-toolbar .w-e-droplist { position: absolute; left: 0; top: 0; background-color: #fff; border: 1px solid #f1f1f1; border-right-color: #ccc; border-bottom-color: #ccc;}.w-e-toolbar .w-e-droplist .w-e-dp-title { text-align: center; color: #999; line-height: 2; border-bottom: 1px solid #f1f1f1; font-size: 13px;}.w-e-toolbar .w-e-droplist ul.w-e-list { list-style: none; line-height: 1;}.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item { color: #333; padding: 5px 0;}.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item:hover { background-color: #f1f1f1;}.w-e-toolbar .w-e-droplist ul.w-e-block { list-style: none; text-align: left; padding: 5px;}.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item { display: inline-block; *display: inline; *zoom: 1; padding: 3px 5px;}.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item:hover { background-color: #f1f1f1;}@font-face { font-family: \'w-e-icon\'; src: url(data:application/x-font-woff;charset=utf-8;base64,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) format(\'truetype\'); font-weight: normal; font-style: normal;}[class^="w-e-icon-"],[class*=" w-e-icon-"] { /* use !important to prevent issues with browser extensions that change fonts */ font-family: \'w-e-icon\' !important; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; /* Better Font Rendering =========== */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;}.w-e-icon-close:before { content: "\\f00d";}.w-e-icon-upload2:before { content: "\\e9c6";}.w-e-icon-trash-o:before { content: "\\f014";}.w-e-icon-header:before { content: "\\f1dc";}.w-e-icon-pencil2:before { content: "\\e906";}.w-e-icon-paint-brush:before { content: "\\f1fc";}.w-e-icon-image:before { content: "\\e90d";}.w-e-icon-play:before { content: "\\e912";}.w-e-icon-location:before { content: "\\e947";}.w-e-icon-undo:before { content: "\\e965";}.w-e-icon-redo:before { content: "\\e966";}.w-e-icon-quotes-left:before { content: "\\e977";}.w-e-icon-list-numbered:before { content: "\\e9b9";}.w-e-icon-list2:before { content: "\\e9bb";}.w-e-icon-link:before { content: "\\e9cb";}.w-e-icon-happy:before { content: "\\e9df";}.w-e-icon-bold:before { content: "\\ea62";}.w-e-icon-underline:before { content: "\\ea63";}.w-e-icon-italic:before { content: "\\ea64";}.w-e-icon-strikethrough:before { content: "\\ea65";}.w-e-icon-table2:before { content: "\\ea71";}.w-e-icon-paragraph-left:before { content: "\\ea77";}.w-e-icon-paragraph-center:before { content: "\\ea78";}.w-e-icon-paragraph-right:before { content: "\\ea79";}.w-e-icon-terminal:before { content: "\\f120";}.w-e-icon-page-break:before { content: "\\ea68";}.w-e-icon-cancel-circle:before { content: "\\ea0d";}.w-e-toolbar { display: -webkit-box; display: -ms-flexbox; display: flex; padding: 0 5px; /* 單個(gè)菜單 */}.w-e-toolbar .w-e-menu { position: relative; text-align: center; padding: 5px 10px; cursor: pointer;}.w-e-toolbar .w-e-menu i { color: #999;}.w-e-toolbar .w-e-menu:hover i { color: #333;}.w-e-toolbar .w-e-active i { color: #1e88e5;}.w-e-toolbar .w-e-active:hover i { color: #1e88e5;}.w-e-text-container .w-e-panel-container { position: absolute; top: 0; left: 50%; border: 1px solid #ccc; border-top: 0; box-shadow: 1px 1px 2px #ccc; color: #333; background-color: #fff; /* 為 emotion panel 定制的樣式 */ /* 上傳圖片的 panel 定制樣式 */}.w-e-text-container .w-e-panel-container .w-e-panel-close { position: absolute; right: 0; top: 0; padding: 5px; margin: 2px 5px 0 0; cursor: pointer; color: #999;}.w-e-text-container .w-e-panel-container .w-e-panel-close:hover { color: #333;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title { list-style: none; display: -webkit-box; display: -ms-flexbox; display: flex; font-size: 14px; margin: 2px 10px 0 10px; border-bottom: 1px solid #f1f1f1;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-item { padding: 3px 5px; color: #999; cursor: pointer; margin: 0 3px; position: relative; top: 1px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-active { color: #333; border-bottom: 1px solid #333; cursor: default; font-weight: 700;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content { padding: 10px 15px 10px 15px; font-size: 16px; /* 輸入框的樣式 */ /* 按鈕的樣式 */}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input:focus,.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus,.w-e-text-container .w-e-panel-container .w-e-panel-tab-content button:focus { outline: none;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea { width: 100%; border: 1px solid #ccc; padding: 5px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus { border-color: #1e88e5;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text] { border: none; border-bottom: 1px solid #ccc; font-size: 14px; height: 20px; color: #333; text-align: left;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].small { width: 30px; text-align: center;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].block { display: block; width: 100%; margin: 10px 0;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text]:focus { border-bottom: 2px solid #1e88e5;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button { font-size: 14px; color: #1e88e5; border: none; padding: 5px 10px; background-color: #fff; cursor: pointer; border-radius: 3px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.left { float: left; margin-right: 10px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.right { float: right; margin-left: 10px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.gray { color: #999;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.red { color: #c24f4a;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button:hover { background-color: #f1f1f1;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container:after { content: ""; display: table; clear: both;}.w-e-text-container .w-e-panel-container .w-e-emoticon-container .w-e-item { cursor: pointer; font-size: 18px; padding: 0 3px; display: inline-block; *display: inline; *zoom: 1;}.w-e-text-container .w-e-panel-container .w-e-up-img-container { text-align: center;}.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn { display: inline-block; *display: inline; *zoom: 1; color: #999; cursor: pointer; font-size: 60px; line-height: 1;}.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn:hover { color: #333;}.w-e-text-container { position: relative;}.w-e-text-container .w-e-progress { position: absolute; background-color: #1e88e5; bottom: 0; left: 0; height: 1px;}.w-e-text { padding: 0 10px; overflow-y: scroll;}.w-e-text p,.w-e-text h1,.w-e-text h2,.w-e-text h3,.w-e-text h4,.w-e-text h5,.w-e-text table,.w-e-text pre { margin: 10px 0; line-height: 1.5;}.w-e-text ul,.w-e-text ol { margin: 10px 0 10px 20px;}.w-e-text blockquote { display: block; border-left: 8px solid #d0e5f2; padding: 5px 10px; margin: 10px 0; line-height: 1.4; font-size: 100%; background-color: #f1f1f1;}.w-e-text code { display: inline-block; *display: inline; *zoom: 1; background-color: #f1f1f1; border-radius: 3px; padding: 3px 5px; margin: 0 3px;}.w-e-text pre code { display: block;}.w-e-text table { border-top: 1px solid #ccc; border-left: 1px solid #ccc;}.w-e-text table td,.w-e-text table th { border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; padding: 3px 5px;}.w-e-text table th { border-bottom: 2px solid #ccc; text-align: center;}.w-e-text:focus { outline: none;}.w-e-text img { cursor: pointer;}.w-e-text img:hover { box-shadow: 0 0 5px #333;}';// 將 css 代碼添加到 <style> 中var style = document.createElement('style');style.type = 'text/css';style.innerHTML = inlinecss;document.getElementsByTagName('HEAD').item(0).appendChild(style);// 返回var index = window.wangEditor || Editor;return index;})));

總結(jié)

以上是生活随笔為你收集整理的laravel-admin引用wangEditor编辑器 使用二:上传视频/音频(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

青春草在线视频免费观看 | 久久成人a毛片免费观看网站 | 久久久久久av无码免费看大片 | 2020久久超碰国产精品最新 | 国内精品一区二区三区不卡 | 无套内谢的新婚少妇国语播放 | 女人色极品影院 | 中文精品无码中文字幕无码专区 | 国产情侣作爱视频免费观看 | 一本大道久久东京热无码av | 国产午夜精品一区二区三区嫩草 | 青青青手机频在线观看 | 午夜精品一区二区三区的区别 | 国产办公室秘书无码精品99 | 无码人妻久久一区二区三区不卡 | 久久综合给合久久狠狠狠97色 | 国产精品对白交换视频 | 国产福利视频一区二区 | 国产色精品久久人妻 | 一本无码人妻在中文字幕免费 | 国产sm调教视频在线观看 | 又紧又大又爽精品一区二区 | 伊人久久大香线焦av综合影院 | 男女猛烈xx00免费视频试看 | 亚洲熟妇色xxxxx亚洲 | 国产无遮挡吃胸膜奶免费看 | 国产乱人无码伦av在线a | 国产成人人人97超碰超爽8 | 成人三级无码视频在线观看 | 动漫av网站免费观看 | 国产做国产爱免费视频 | 亚洲欧美色中文字幕在线 | 国产午夜亚洲精品不卡下载 | 国产女主播喷水视频在线观看 | 日本护士毛茸茸高潮 | 水蜜桃av无码 | 亚洲精品久久久久avwww潮水 | 性欧美牲交在线视频 | 国产精品亚洲lv粉色 | 美女毛片一区二区三区四区 | 久久久www成人免费毛片 | 亚洲综合无码久久精品综合 | 亚洲欧美日韩综合久久久 | 夜夜影院未满十八勿进 | 国产乱人无码伦av在线a | v一区无码内射国产 | 国产激情精品一区二区三区 | 人人妻人人澡人人爽欧美精品 | 中文字幕乱码亚洲无线三区 | 亚洲国产精品成人久久蜜臀 | 妺妺窝人体色www在线小说 | 最近的中文字幕在线看视频 | 欧美精品免费观看二区 | 天堂无码人妻精品一区二区三区 | 亚洲中文字幕在线观看 | 久久久久久亚洲精品a片成人 | 无码国模国产在线观看 | 亚洲gv猛男gv无码男同 | 日韩精品久久久肉伦网站 | 亚洲日韩精品欧美一区二区 | 一个人看的www免费视频在线观看 | 国产av一区二区精品久久凹凸 | 小泽玛莉亚一区二区视频在线 | 亚洲精品综合五月久久小说 | 无码一区二区三区在线观看 | 一区二区三区高清视频一 | 麻豆人妻少妇精品无码专区 | 一本色道婷婷久久欧美 | 欧美 日韩 亚洲 在线 | 97夜夜澡人人双人人人喊 | 亚洲欧美综合区丁香五月小说 | 午夜无码区在线观看 | 久久国产自偷自偷免费一区调 | 国产成人一区二区三区别 | 强伦人妻一区二区三区视频18 | 久久精品99久久香蕉国产色戒 | аⅴ资源天堂资源库在线 | 国产精品高潮呻吟av久久4虎 | 日日橹狠狠爱欧美视频 | 在线亚洲高清揄拍自拍一品区 | 亚洲国产精品毛片av不卡在线 | 又黄又爽又色的视频 | 欧美亚洲国产一区二区三区 | 成人精品天堂一区二区三区 | 亚洲精品鲁一鲁一区二区三区 | 熟妇人妻激情偷爽文 | 亚洲 另类 在线 欧美 制服 | 国产精品久久久 | 午夜肉伦伦影院 | 99久久久无码国产精品免费 | 国精产品一区二区三区 | 亚洲日本va中文字幕 | 无码人妻久久一区二区三区不卡 | 强奷人妻日本中文字幕 | 捆绑白丝粉色jk震动捧喷白浆 | 国产欧美精品一区二区三区 | 蜜臀aⅴ国产精品久久久国产老师 | 人妻有码中文字幕在线 | 久久五月精品中文字幕 | 久久99精品国产麻豆 | 国产成人精品视频ⅴa片软件竹菊 | 综合网日日天干夜夜久久 | 久久zyz资源站无码中文动漫 | 国产日产欧产精品精品app | 在线观看欧美一区二区三区 | 国产激情一区二区三区 | 亚洲一区av无码专区在线观看 | 日韩人妻无码中文字幕视频 | 欧美日韩一区二区三区自拍 | 日日天干夜夜狠狠爱 | 成人综合网亚洲伊人 | 亚洲一区二区三区香蕉 | 亚洲娇小与黑人巨大交 | 性做久久久久久久免费看 | 国产激情精品一区二区三区 | 久久久久成人片免费观看蜜芽 | 国产又粗又硬又大爽黄老大爷视 | 中文字幕无码免费久久9一区9 | 日韩人妻少妇一区二区三区 | 美女极度色诱视频国产 | 青草青草久热国产精品 | 婷婷五月综合激情中文字幕 | 亚洲国产高清在线观看视频 | 日韩视频 中文字幕 视频一区 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 久久国产36精品色熟妇 | 国产午夜无码视频在线观看 | 婷婷丁香六月激情综合啪 | 大胆欧美熟妇xx | 国产精品丝袜黑色高跟鞋 | 国产亚洲视频中文字幕97精品 | 国产精品无码成人午夜电影 | 捆绑白丝粉色jk震动捧喷白浆 | 午夜福利电影 | 波多野结衣 黑人 | 未满小14洗澡无码视频网站 | 国产又爽又黄又刺激的视频 | 久久亚洲日韩精品一区二区三区 | 乌克兰少妇性做爰 | 日本精品高清一区二区 | 无码中文字幕色专区 | 扒开双腿吃奶呻吟做受视频 | 精品国产青草久久久久福利 | 日本大香伊一区二区三区 | 黑人大群体交免费视频 | 日本免费一区二区三区最新 | 日本一卡二卡不卡视频查询 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 国产人成高清在线视频99最全资源 | 免费观看激色视频网站 | 乱人伦人妻中文字幕无码久久网 | 欧美人与动性行为视频 | 亚洲国产日韩a在线播放 | 在线观看免费人成视频 | 久久这里只有精品视频9 | 亚洲熟妇色xxxxx欧美老妇 | 日欧一片内射va在线影院 | 久久午夜无码鲁丝片 | 亚洲а∨天堂久久精品2021 | 东京热无码av男人的天堂 | 国产成人无码av片在线观看不卡 | 一个人看的视频www在线 | 巨爆乳无码视频在线观看 | 色综合久久久久综合一本到桃花网 | 四十如虎的丰满熟妇啪啪 | 性欧美videos高清精品 | 欧美性猛交内射兽交老熟妇 | 国产精品无码一区二区三区不卡 | 欧美日韩视频无码一区二区三 | 国产美女极度色诱视频www | 久久综合激激的五月天 | 国产亚洲人成a在线v网站 | 全球成人中文在线 | 欧美日韩在线亚洲综合国产人 | 性史性农村dvd毛片 | 无码午夜成人1000部免费视频 | 中文字幕乱码中文乱码51精品 | 欧美freesex黑人又粗又大 | 亚洲国产精品久久久天堂 | 久久zyz资源站无码中文动漫 | 国产香蕉尹人综合在线观看 | 日日麻批免费40分钟无码 | 国产亚洲美女精品久久久2020 | 在线观看国产一区二区三区 | 亚洲一区二区三区国产精华液 | 人妻少妇精品无码专区动漫 | 日本熟妇浓毛 | 欧美一区二区三区视频在线观看 | 男女爱爱好爽视频免费看 | 99久久亚洲精品无码毛片 | 97精品人妻一区二区三区香蕉 | 久久久www成人免费毛片 | 永久免费观看国产裸体美女 | 色综合视频一区二区三区 | 亚洲成熟女人毛毛耸耸多 | 亚洲大尺度无码无码专区 | 亚洲 欧美 激情 小说 另类 | 亚洲中文字幕乱码av波多ji | 国产精品久久久久久亚洲毛片 | 亚无码乱人伦一区二区 | 久久久久av无码免费网 | 国产亚洲人成a在线v网站 | 欧美性生交xxxxx久久久 | 香蕉久久久久久av成人 | 狠狠色噜噜狠狠狠7777奇米 | 国内丰满熟女出轨videos | 午夜免费福利小电影 | 亚洲色大成网站www国产 | 亚洲成av人片在线观看无码不卡 | 波多野结衣高清一区二区三区 | 亚洲精品一区二区三区在线观看 | 给我免费的视频在线观看 | 人人妻人人澡人人爽精品欧美 | 中文字幕av无码一区二区三区电影 | 欧美一区二区三区 | 老子影院午夜精品无码 | 丰腴饱满的极品熟妇 | 99久久久无码国产aaa精品 | 国产小呦泬泬99精品 | 色综合天天综合狠狠爱 | 中文亚洲成a人片在线观看 | 欧美日韩一区二区综合 | 青春草在线视频免费观看 | 毛片内射-百度 | 在线精品国产一区二区三区 | 性色av无码免费一区二区三区 | 在线天堂新版最新版在线8 | 东京一本一道一二三区 | 成人三级无码视频在线观看 | 日本精品人妻无码77777 天堂一区人妻无码 | 久久久久久九九精品久 | 熟妇人妻中文av无码 | 国产又爽又猛又粗的视频a片 | 帮老师解开蕾丝奶罩吸乳网站 | 天天综合网天天综合色 | av人摸人人人澡人人超碰下载 | 日韩精品一区二区av在线 | 色婷婷欧美在线播放内射 | 四十如虎的丰满熟妇啪啪 | 国产午夜亚洲精品不卡下载 | 欧美性生交活xxxxxdddd | 国产精品久久久久9999小说 | 美女黄网站人色视频免费国产 | 人妻少妇精品视频专区 | 国内少妇偷人精品视频 | 亚洲熟女一区二区三区 | 熟妇女人妻丰满少妇中文字幕 | 久久午夜无码鲁丝片 | 亚欧洲精品在线视频免费观看 | 亚洲中文字幕av在天堂 | 动漫av一区二区在线观看 | 久久亚洲精品成人无码 | 麻豆蜜桃av蜜臀av色欲av | 成人免费无码大片a毛片 | 女高中生第一次破苞av | 国产高潮视频在线观看 | 免费无码一区二区三区蜜桃大 | 日韩精品无码一本二本三本色 | 中文字幕无码热在线视频 | 天堂а√在线中文在线 | 久久婷婷五月综合色国产香蕉 | 亚洲爆乳精品无码一区二区三区 | 国产精品久免费的黄网站 | 成人免费视频一区二区 | 欧美日韩色另类综合 | 久久久久亚洲精品男人的天堂 | 国产97人人超碰caoprom | 国产成人无码av一区二区 | 内射欧美老妇wbb | 无码精品人妻一区二区三区av | 日本精品高清一区二区 | 麻豆蜜桃av蜜臀av色欲av | 亚洲综合精品香蕉久久网 | 在线播放无码字幕亚洲 | 色狠狠av一区二区三区 | 精品一二三区久久aaa片 | 无码一区二区三区在线观看 | 国产精品高潮呻吟av久久 | 久久综合给久久狠狠97色 | 亚洲国产一区二区三区在线观看 | 成人欧美一区二区三区 | 性欧美疯狂xxxxbbbb | 真人与拘做受免费视频 | 久久www免费人成人片 | 黑人大群体交免费视频 | 久久亚洲日韩精品一区二区三区 | 无码人妻黑人中文字幕 | 亚洲男女内射在线播放 | 亚洲中文字幕久久无码 | 国产在线无码精品电影网 | 性啪啪chinese东北女人 | 欧美激情内射喷水高潮 | 漂亮人妻洗澡被公强 日日躁 | 亚洲精品一区二区三区在线 | 日韩精品a片一区二区三区妖精 | 国产综合色产在线精品 | 在线а√天堂中文官网 | 国产精品成人av在线观看 | 无码毛片视频一区二区本码 | 美女黄网站人色视频免费国产 | 国产亚洲精品精品国产亚洲综合 | 日本大乳高潮视频在线观看 | 亚洲熟悉妇女xxx妇女av | 色婷婷久久一区二区三区麻豆 | 性欧美大战久久久久久久 | 欧洲欧美人成视频在线 | 久久99精品国产.久久久久 | 亚洲狠狠色丁香婷婷综合 | 人人超人人超碰超国产 | 亚洲国产精品久久久天堂 | 亚洲精品一区二区三区在线 | 国产午夜无码精品免费看 | 久激情内射婷内射蜜桃人妖 | 久久人妻内射无码一区三区 | 亚洲精品成人福利网站 | 精品夜夜澡人妻无码av蜜桃 | 久久国产精品精品国产色婷婷 | 波多野结衣乳巨码无在线观看 | 亚洲成a人一区二区三区 | 中文精品久久久久人妻不卡 | 日日干夜夜干 | 国内精品久久久久久中文字幕 | 色 综合 欧美 亚洲 国产 | 国产在线无码精品电影网 | 欧美猛少妇色xxxxx | 国产精品内射视频免费 | 国产疯狂伦交大片 | 人妻aⅴ无码一区二区三区 | 亚洲自偷精品视频自拍 | 国产电影无码午夜在线播放 | 天堂亚洲2017在线观看 | 亚洲精品成a人在线观看 | 久久婷婷五月综合色国产香蕉 | 久久久婷婷五月亚洲97号色 | 国产亚洲精品久久久闺蜜 | 乱码av麻豆丝袜熟女系列 | 青青青爽视频在线观看 | 国产精品亚洲一区二区三区喷水 | 成人影院yy111111在线观看 | 午夜精品久久久久久久久 | 亚洲の无码国产の无码影院 | 波多野结衣aⅴ在线 | 亚洲第一网站男人都懂 | 欧美变态另类xxxx | 又大又硬又黄的免费视频 | 亚洲色www成人永久网址 | 麻豆md0077饥渴少妇 | 色一情一乱一伦一视频免费看 | 欧美 亚洲 国产 另类 | 人妻有码中文字幕在线 | 久久精品人妻少妇一区二区三区 | 中文精品久久久久人妻不卡 | 日韩精品乱码av一区二区 | 国产精品久久久久9999小说 | 蜜桃av抽搐高潮一区二区 | 国产黑色丝袜在线播放 | 久久亚洲精品成人无码 | aa片在线观看视频在线播放 | 国产精品丝袜黑色高跟鞋 | 亚洲国产欧美国产综合一区 | 国产av无码专区亚洲awww | 丰满诱人的人妻3 | 色婷婷欧美在线播放内射 | 午夜福利不卡在线视频 | 久久精品女人的天堂av | 在线观看欧美一区二区三区 | 欧美 日韩 亚洲 在线 | 中文字幕色婷婷在线视频 | 性做久久久久久久免费看 | 人妻中文无码久热丝袜 | 性史性农村dvd毛片 | 香蕉久久久久久av成人 | 大乳丰满人妻中文字幕日本 | 暴力强奷在线播放无码 | 中文字幕 人妻熟女 | 久久综合狠狠综合久久综合88 | 久久99精品国产麻豆 | 亚洲自偷自拍另类第1页 | 99国产欧美久久久精品 | 中文字幕无码热在线视频 | 亚洲国产精品久久人人爱 | 久久精品99久久香蕉国产色戒 | 国产成人综合美国十次 | 成人欧美一区二区三区 | 377p欧洲日本亚洲大胆 | 亚洲欧美中文字幕5发布 | 久久久久亚洲精品中文字幕 | 国产在线精品一区二区三区直播 | 人人妻在人人 | 国产真人无遮挡作爱免费视频 | 亚洲国产欧美国产综合一区 | 大乳丰满人妻中文字幕日本 | 国产亚洲人成a在线v网站 | 88国产精品欧美一区二区三区 | 精品亚洲韩国一区二区三区 | 老熟妇乱子伦牲交视频 | 亚洲中文字幕在线无码一区二区 | 久久亚洲中文字幕无码 | 婷婷综合久久中文字幕蜜桃三电影 | 中文久久乱码一区二区 | 性欧美熟妇videofreesex | 中文字幕日产无线码一区 | 动漫av一区二区在线观看 | 97色伦图片97综合影院 | 国产亚洲日韩欧美另类第八页 | 精品国产青草久久久久福利 | 久久久久人妻一区精品色欧美 | 久久久国产精品无码免费专区 | 亚洲色偷偷偷综合网 | 亚洲aⅴ无码成人网站国产app | 久久精品国产日本波多野结衣 | 欧美大屁股xxxxhd黑色 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国内少妇偷人精品视频 | 欧美丰满熟妇xxxx性ppx人交 | 18精品久久久无码午夜福利 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 帮老师解开蕾丝奶罩吸乳网站 | 牲欲强的熟妇农村老妇女 | 婷婷五月综合激情中文字幕 | 中文字幕人妻无码一夲道 | 强奷人妻日本中文字幕 | 无套内谢的新婚少妇国语播放 | 久久精品国产一区二区三区 | 四虎4hu永久免费 | 国产成人无码午夜视频在线观看 | 欧美freesex黑人又粗又大 | 亚洲午夜无码久久 | 久久精品国产精品国产精品污 | 中文字幕无码av激情不卡 | 青青草原综合久久大伊人精品 | 黑人巨大精品欧美一区二区 | 国内揄拍国内精品人妻 | 国产农村乱对白刺激视频 | 国产国语老龄妇女a片 | 一本一道久久综合久久 | 夜夜高潮次次欢爽av女 | 色情久久久av熟女人妻网站 | 在线观看国产午夜福利片 | 久久精品无码一区二区三区 | 激情内射亚州一区二区三区爱妻 | 亚洲日韩一区二区 | 久久99精品国产麻豆蜜芽 | 最近中文2019字幕第二页 | 久久无码专区国产精品s | 日本熟妇乱子伦xxxx | 粉嫩少妇内射浓精videos | 日韩少妇白浆无码系列 | 亚洲成av人片在线观看无码不卡 | 中文字幕无码免费久久99 | 欧美放荡的少妇 | a片免费视频在线观看 | 国内综合精品午夜久久资源 | 久久综合给久久狠狠97色 | 久久久国产精品无码免费专区 | 久久久精品国产sm最大网站 | 欧美猛少妇色xxxxx | 又湿又紧又大又爽a视频国产 | 国产麻豆精品精东影业av网站 | 精品少妇爆乳无码av无码专区 | 日本精品人妻无码77777 天堂一区人妻无码 | 国产精品自产拍在线观看 | 国产高潮视频在线观看 | 国产97在线 | 亚洲 | 图片区 小说区 区 亚洲五月 | 久久久久se色偷偷亚洲精品av | 亚洲人成网站在线播放942 | www一区二区www免费 | 精品国偷自产在线 | 疯狂三人交性欧美 | 亚洲色大成网站www国产 | 欧美日韩一区二区免费视频 | 又粗又大又硬毛片免费看 | 秋霞特色aa大片 | 国产精品亚洲五月天高清 | 99精品无人区乱码1区2区3区 | 中国女人内谢69xxxxxa片 | 亚洲无人区午夜福利码高清完整版 | 欧美变态另类xxxx | 亚洲性无码av中文字幕 | 天堂无码人妻精品一区二区三区 | 成在人线av无码免观看麻豆 | 97精品人妻一区二区三区香蕉 | 秋霞成人午夜鲁丝一区二区三区 | 中文字幕无线码 | 无码人妻丰满熟妇区五十路百度 | 亚洲欧美精品伊人久久 | 沈阳熟女露脸对白视频 | 久久国内精品自在自线 | 人妻少妇精品久久 | 国产精品无码永久免费888 | 久久精品国产99久久6动漫 | 欧美成人高清在线播放 | 欧美xxxx黑人又粗又长 | 精品欧洲av无码一区二区三区 | 99久久精品国产一区二区蜜芽 | 国产精品对白交换视频 | 狂野欧美性猛交免费视频 | 国产人妻精品午夜福利免费 | 美女黄网站人色视频免费国产 | 亚洲欧美精品伊人久久 | 欧美人与禽猛交狂配 | 久热国产vs视频在线观看 | 欧美国产日韩久久mv | 亚洲精品国产品国语在线观看 | 乌克兰少妇性做爰 | 无遮挡国产高潮视频免费观看 | 国产成人精品一区二区在线小狼 | 中文字幕乱码人妻无码久久 | 十八禁真人啪啪免费网站 | 一本久久伊人热热精品中文字幕 | 欧美三级不卡在线观看 | 99久久婷婷国产综合精品青草免费 | 无码精品人妻一区二区三区av | 久久久国产一区二区三区 | 99久久亚洲精品无码毛片 | 国产精品办公室沙发 | 久久精品国产亚洲精品 | 一本大道久久东京热无码av | 亚洲中文字幕无码中文字在线 | 亚洲の无码国产の无码影院 | 亚洲精品综合一区二区三区在线 | 久久99热只有频精品8 | 自拍偷自拍亚洲精品被多人伦好爽 | 国内精品久久久久久中文字幕 | 亚洲另类伦春色综合小说 | 亚洲成a人片在线观看无码3d | 欧美黑人巨大xxxxx | 日韩人妻系列无码专区 | 一本加勒比波多野结衣 | 日韩精品成人一区二区三区 | 亚洲中文字幕乱码av波多ji | 午夜精品一区二区三区的区别 | 综合激情五月综合激情五月激情1 | 色一情一乱一伦一区二区三欧美 | 麻豆蜜桃av蜜臀av色欲av | 国产人妻精品一区二区三区不卡 | 无码人妻久久一区二区三区不卡 | 天天摸天天碰天天添 | 日本精品人妻无码77777 天堂一区人妻无码 | 荫蒂被男人添的好舒服爽免费视频 | 日日摸天天摸爽爽狠狠97 | 亚洲熟女一区二区三区 | 久久精品99久久香蕉国产色戒 | 国产精品沙发午睡系列 | 免费无码av一区二区 | 国产成人亚洲综合无码 | 在线a亚洲视频播放在线观看 | 欧美熟妇另类久久久久久不卡 | 四虎影视成人永久免费观看视频 | 国产成人亚洲综合无码 | 久久精品一区二区三区四区 | 国产麻豆精品精东影业av网站 | 色欲综合久久中文字幕网 | 无码人妻精品一区二区三区不卡 | 免费观看的无遮挡av | 久久综合久久自在自线精品自 | 无码任你躁久久久久久久 | 欧美日韩一区二区三区自拍 | 国产精品无码永久免费888 | 国产亚洲欧美日韩亚洲中文色 | 一二三四在线观看免费视频 | 国产精品久久久久9999小说 | 欧美兽交xxxx×视频 | 2020久久超碰国产精品最新 | 一本一道久久综合久久 | 国精品人妻无码一区二区三区蜜柚 | 亚洲国产成人av在线观看 | 奇米影视7777久久精品人人爽 | 无码人妻出轨黑人中文字幕 | 又大又黄又粗又爽的免费视频 | 国产精品无码成人午夜电影 | 欧洲极品少妇 | 亚洲va中文字幕无码久久不卡 | 亚洲s码欧洲m码国产av | 中文字幕无码日韩专区 | 国产精品对白交换视频 | 中文字幕人成乱码熟女app | 久久午夜无码鲁丝片秋霞 | 四虎影视成人永久免费观看视频 | 蜜臀av无码人妻精品 | 成 人 网 站国产免费观看 | 久久久亚洲欧洲日产国码αv | 无码午夜成人1000部免费视频 | 久久婷婷五月综合色国产香蕉 | 国产精品亚洲综合色区韩国 | 最新国产麻豆aⅴ精品无码 | 无码人妻av免费一区二区三区 | 亚洲精品一区二区三区四区五区 | 国产亚洲精品久久久久久久 | 97无码免费人妻超级碰碰夜夜 | 无码播放一区二区三区 | 精品久久久无码中文字幕 | 国产女主播喷水视频在线观看 | 亚洲国产一区二区三区在线观看 | 欧美老妇与禽交 | 成人无码精品一区二区三区 | 亚洲精品中文字幕乱码 | 国产深夜福利视频在线 | 国产精品无套呻吟在线 | 亚洲乱码日产精品bd | 精品日本一区二区三区在线观看 | 天堂亚洲免费视频 | 又色又爽又黄的美女裸体网站 | 成人免费无码大片a毛片 | 国产在线精品一区二区高清不卡 | 午夜丰满少妇性开放视频 | 亚洲色欲色欲天天天www | 国产亚洲欧美日韩亚洲中文色 | 偷窥日本少妇撒尿chinese | 亚洲精品成a人在线观看 | 日韩av无码一区二区三区 | 日产国产精品亚洲系列 | 午夜精品一区二区三区的区别 | 欧美丰满熟妇xxxx | 黄网在线观看免费网站 | 亚洲狠狠色丁香婷婷综合 | 99久久亚洲精品无码毛片 | √天堂资源地址中文在线 | 国产小呦泬泬99精品 | 99re在线播放 | 2019nv天堂香蕉在线观看 | 婷婷综合久久中文字幕蜜桃三电影 | 国产偷抇久久精品a片69 | 久久伊人色av天堂九九小黄鸭 | 国产成人无码av在线影院 | 亚洲乱亚洲乱妇50p | 国产乱人伦av在线无码 | 国产成人综合色在线观看网站 | 精品一区二区三区无码免费视频 | 国产成人精品无码播放 | 熟女少妇人妻中文字幕 | а天堂中文在线官网 | 无遮无挡爽爽免费视频 | 国产内射爽爽大片视频社区在线 | 国产av无码专区亚洲awww | 久久97精品久久久久久久不卡 | 乌克兰少妇xxxx做受 | 丝袜 中出 制服 人妻 美腿 | 欧美xxxxx精品 | 国产网红无码精品视频 | 人妻中文无码久热丝袜 | 成人影院yy111111在线观看 | 久久国产精品_国产精品 | 色一情一乱一伦一区二区三欧美 | 夜夜影院未满十八勿进 | 精品国产麻豆免费人成网站 | 综合人妻久久一区二区精品 | 中文字幕乱码人妻二区三区 | 国产麻豆精品一区二区三区v视界 | 无套内谢老熟女 | 成人aaa片一区国产精品 | 18禁黄网站男男禁片免费观看 | 熟女俱乐部五十路六十路av | 又大又黄又粗又爽的免费视频 | 国产精品免费大片 | 久久亚洲中文字幕精品一区 | 国产亚洲精品久久久久久久 | 精品水蜜桃久久久久久久 | 亚洲自偷精品视频自拍 | 内射爽无广熟女亚洲 | 99精品国产综合久久久久五月天 | 国产在线一区二区三区四区五区 | 亚洲 日韩 欧美 成人 在线观看 | 日韩欧美中文字幕公布 | av无码久久久久不卡免费网站 | 领导边摸边吃奶边做爽在线观看 | 丝袜 中出 制服 人妻 美腿 | 婷婷六月久久综合丁香 | 国精产品一品二品国精品69xx | 久久人人爽人人人人片 | 玩弄人妻少妇500系列视频 | 亚洲精品成a人在线观看 | 国语自产偷拍精品视频偷 | 欧美激情综合亚洲一二区 | 熟妇激情内射com | 日韩在线不卡免费视频一区 | 精品日本一区二区三区在线观看 | 中文字幕乱码亚洲无线三区 | 少妇性俱乐部纵欲狂欢电影 | 国产综合色产在线精品 | 中文字幕无码日韩欧毛 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲人成网站在线播放942 | 偷窥村妇洗澡毛毛多 | 亚洲熟悉妇女xxx妇女av | 成年女人永久免费看片 | 狂野欧美性猛交免费视频 | 免费中文字幕日韩欧美 | 1000部啪啪未满十八勿入下载 | 久久天天躁夜夜躁狠狠 | 午夜无码人妻av大片色欲 | 国产成人无码av一区二区 | 久久亚洲精品中文字幕无男同 | 精品无码一区二区三区的天堂 | 亚洲乱亚洲乱妇50p | 国产又爽又猛又粗的视频a片 | 国产成人精品无码播放 | 粉嫩少妇内射浓精videos | 中文字幕人妻丝袜二区 | 成 人 免费观看网站 | 精品乱子伦一区二区三区 | 亚洲国产一区二区三区在线观看 | 亚洲色在线无码国产精品不卡 | 人人妻人人藻人人爽欧美一区 | 国产成人精品久久亚洲高清不卡 | 一个人免费观看的www视频 | 欧美日本免费一区二区三区 | 日韩亚洲欧美精品综合 | 奇米影视7777久久精品 | 色妞www精品免费视频 | 成人免费视频视频在线观看 免费 | 午夜精品久久久内射近拍高清 | 色婷婷久久一区二区三区麻豆 | 亚洲天堂2017无码中文 | √天堂资源地址中文在线 | 成人无码影片精品久久久 | 久久久久久久人妻无码中文字幕爆 | 九九久久精品国产免费看小说 | 中文字幕日产无线码一区 | 国产成人人人97超碰超爽8 | 九九在线中文字幕无码 | 性欧美熟妇videofreesex | 国产精品无码一区二区三区不卡 | 麻豆精品国产精华精华液好用吗 | 精品无人区无码乱码毛片国产 | 老太婆性杂交欧美肥老太 | 亚洲欧美色中文字幕在线 | 欧美人与禽zoz0性伦交 | 色五月五月丁香亚洲综合网 | 中文字幕av伊人av无码av | 波多野结衣一区二区三区av免费 | 国产午夜亚洲精品不卡 | 国产免费久久精品国产传媒 | 在线а√天堂中文官网 | 亚洲日本一区二区三区在线 | 久久亚洲中文字幕无码 | 麻豆精产国品 | 强奷人妻日本中文字幕 | 狂野欧美激情性xxxx | 国产成人一区二区三区别 | 精品夜夜澡人妻无码av蜜桃 | 精品亚洲成av人在线观看 | 精品国精品国产自在久国产87 | 国产免费久久精品国产传媒 | 精品国产av色一区二区深夜久久 | 色偷偷人人澡人人爽人人模 | 国产成人av免费观看 | 欧美老人巨大xxxx做受 | 人妻无码久久精品人妻 | 久久久久成人片免费观看蜜芽 | 国产精品毛多多水多 | 色婷婷久久一区二区三区麻豆 | 激情爆乳一区二区三区 | 免费人成在线视频无码 | 四虎永久在线精品免费网址 | 亚洲va中文字幕无码久久不卡 | 日韩在线不卡免费视频一区 | 99在线 | 亚洲 | 欧美性生交活xxxxxdddd | 一个人看的www免费视频在线观看 | 精品一区二区三区波多野结衣 | 久久久久久九九精品久 | 日日鲁鲁鲁夜夜爽爽狠狠 | 在线观看免费人成视频 | 青青久在线视频免费观看 | 麻豆md0077饥渴少妇 | 亚洲欧美色中文字幕在线 | 亚洲欧美综合区丁香五月小说 | 免费无码av一区二区 | 婷婷色婷婷开心五月四房播播 | 日日躁夜夜躁狠狠躁 | 中文字幕无码免费久久99 | 伊人久久大香线蕉av一区二区 | 国内综合精品午夜久久资源 | 欧美性猛交xxxx富婆 | а√资源新版在线天堂 | 亚洲日韩av片在线观看 | 精品无码一区二区三区爱欲 | 狠狠色色综合网站 | 少妇性l交大片欧洲热妇乱xxx | 熟妇女人妻丰满少妇中文字幕 | 在教室伦流澡到高潮hnp视频 | 水蜜桃色314在线观看 | 美女黄网站人色视频免费国产 | 国产成人久久精品流白浆 | 丰满少妇高潮惨叫视频 | 性欧美videos高清精品 | 成人精品视频一区二区三区尤物 | 国产精品亚洲五月天高清 | 欧美午夜特黄aaaaaa片 | 99久久亚洲精品无码毛片 | 黄网在线观看免费网站 | 亚洲熟悉妇女xxx妇女av | 久久久中文久久久无码 | 婷婷综合久久中文字幕蜜桃三电影 | 国产热a欧美热a在线视频 | 国产亚洲精品久久久久久 | 日日躁夜夜躁狠狠躁 | 亚洲人成影院在线观看 | 欧美乱妇无乱码大黄a片 | 亚洲aⅴ无码成人网站国产app | 亚洲一区二区三区香蕉 | 国产三级久久久精品麻豆三级 | 国产性生大片免费观看性 | 久久综合香蕉国产蜜臀av | 荫蒂被男人添的好舒服爽免费视频 | 国产激情精品一区二区三区 | 荫蒂被男人添的好舒服爽免费视频 | 99re在线播放 | 久久国产36精品色熟妇 | 久久国产精品偷任你爽任你 | 丰满岳乱妇在线观看中字无码 | 少妇一晚三次一区二区三区 | 久激情内射婷内射蜜桃人妖 | 久久亚洲国产成人精品性色 | 国产精品无码mv在线观看 | 亚洲乱码日产精品bd | 波多野结衣av一区二区全免费观看 | 久久精品女人的天堂av | 女人高潮内射99精品 | 少妇愉情理伦片bd | 中文字幕无码热在线视频 | 偷窥日本少妇撒尿chinese | 男女爱爱好爽视频免费看 | 欧美黑人性暴力猛交喷水 | 国产精品无码mv在线观看 | 亚洲国产高清在线观看视频 | 天天躁夜夜躁狠狠是什么心态 | 亚洲区小说区激情区图片区 | 欧美激情内射喷水高潮 | 欧美黑人乱大交 | 网友自拍区视频精品 | 性色欲网站人妻丰满中文久久不卡 | 日本精品少妇一区二区三区 | 偷窥日本少妇撒尿chinese | 露脸叫床粗话东北少妇 | 中文字幕av日韩精品一区二区 | 日韩精品无码一区二区中文字幕 | 日韩 欧美 动漫 国产 制服 | 久久久精品欧美一区二区免费 | 亚洲阿v天堂在线 | 久久久精品成人免费观看 | 免费国产成人高清在线观看网站 | 久久精品国产99久久6动漫 | 国内综合精品午夜久久资源 | 天堂久久天堂av色综合 | 波多野结衣乳巨码无在线观看 | 久久无码专区国产精品s | 国产99久久精品一区二区 | 好爽又高潮了毛片免费下载 | 人人妻人人澡人人爽人人精品浪潮 | 精品国产av色一区二区深夜久久 | 永久免费精品精品永久-夜色 | 亚洲国产成人av在线观看 | 好屌草这里只有精品 | 国产av剧情md精品麻豆 | 国内综合精品午夜久久资源 | 色爱情人网站 | 人人澡人人妻人人爽人人蜜桃 | 无套内射视频囯产 | 欧美老妇交乱视频在线观看 | 午夜精品一区二区三区的区别 | 国产日产欧产精品精品app | 在线观看免费人成视频 | 亚洲s色大片在线观看 | 人人澡人人妻人人爽人人蜜桃 | 亚洲毛片av日韩av无码 | 欧美日韩久久久精品a片 | 人妻天天爽夜夜爽一区二区 | 天堂无码人妻精品一区二区三区 | 午夜精品久久久内射近拍高清 | 日本一本二本三区免费 | 麻豆国产人妻欲求不满谁演的 | 久久 国产 尿 小便 嘘嘘 | 国产亚洲欧美在线专区 | 国产激情精品一区二区三区 | 久久精品中文字幕一区 | 97久久精品无码一区二区 | 国产精品久久国产精品99 | 国产成人久久精品流白浆 | 国产人妖乱国产精品人妖 | 国产人妻大战黑人第1集 | 国产偷自视频区视频 | 亚洲国产av美女网站 | 女人被爽到呻吟gif动态图视看 | 国产精品毛多多水多 | 久久久久国色av免费观看性色 | 亚拍精品一区二区三区探花 | 久久久久久久久蜜桃 | 成人亚洲精品久久久久软件 | 亚洲国产欧美在线成人 | 欧美老妇交乱视频在线观看 | 久久精品成人欧美大片 | 亚洲综合另类小说色区 | 无套内谢的新婚少妇国语播放 | 亚洲国精产品一二二线 | 日本爽爽爽爽爽爽在线观看免 | 丰满少妇高潮惨叫视频 | 中文无码精品a∨在线观看不卡 | 亚洲自偷自拍另类第1页 | 国产成人精品三级麻豆 | 色综合久久久无码中文字幕 | 久久久国产精品无码免费专区 | 亚洲一区二区观看播放 | 熟妇人妻无码xxx视频 | 我要看www免费看插插视频 | 亚洲乱码中文字幕在线 | aa片在线观看视频在线播放 | 国产精品久久国产三级国 | 色偷偷人人澡人人爽人人模 | 蜜桃视频韩日免费播放 | 人妻人人添人妻人人爱 | 男人和女人高潮免费网站 | 久久久精品国产sm最大网站 | 中文字幕亚洲情99在线 | a片在线免费观看 | 狠狠色丁香久久婷婷综合五月 | a片在线免费观看 | 在线精品亚洲一区二区 | 久久国内精品自在自线 | 欧美日韩一区二区三区自拍 | 黑人巨大精品欧美一区二区 | 2020久久香蕉国产线看观看 | 性生交大片免费看l | a在线观看免费网站大全 | 免费观看激色视频网站 | 久久综合给久久狠狠97色 | 午夜时刻免费入口 | av无码电影一区二区三区 | ass日本丰满熟妇pics | av人摸人人人澡人人超碰下载 | 欧美日韩精品 | 亚洲欧洲日本无在线码 | 综合人妻久久一区二区精品 | aⅴ亚洲 日韩 色 图网站 播放 | 伊人久久大香线蕉午夜 | 波多野结衣乳巨码无在线观看 | 亚洲成av人在线观看网址 | 国产成人无码区免费内射一片色欲 | 亚洲七七久久桃花影院 | 亚洲精品午夜无码电影网 | 欧洲vodafone精品性 | 国内精品人妻无码久久久影院蜜桃 | 亚洲欧洲无卡二区视頻 | 国产成人无码av一区二区 | 国产精品福利视频导航 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲精品国偷拍自产在线麻豆 | 亚洲日本一区二区三区在线 | 中国女人内谢69xxxxxa片 | 国产午夜视频在线观看 | 一区二区传媒有限公司 | 高潮毛片无遮挡高清免费视频 | 国产小呦泬泬99精品 | 成人欧美一区二区三区黑人 | 国产真实夫妇视频 | 十八禁视频网站在线观看 | 天干天干啦夜天干天2017 | 久久久国产一区二区三区 | 美女毛片一区二区三区四区 | 久久亚洲中文字幕无码 | 激情人妻另类人妻伦 | 国产成人精品优优av | 亚洲日韩中文字幕在线播放 | 国产精品99久久精品爆乳 | 爆乳一区二区三区无码 | 国产精品久久国产三级国 | 国产 精品 自在自线 | 国产超碰人人爽人人做人人添 | 欧洲精品码一区二区三区免费看 | 久久亚洲国产成人精品性色 | 男女爱爱好爽视频免费看 | 久精品国产欧美亚洲色aⅴ大片 | 国产午夜精品一区二区三区嫩草 | 午夜精品一区二区三区在线观看 | 小sao货水好多真紧h无码视频 | 强辱丰满人妻hd中文字幕 | 欧美日韩一区二区三区自拍 | 亚洲欧美国产精品专区久久 | 国产肉丝袜在线观看 | √天堂资源地址中文在线 | 午夜精品久久久内射近拍高清 | 亚洲欧洲日本无在线码 | 精品国精品国产自在久国产87 | 国产精品久久久久影院嫩草 | 国产真人无遮挡作爱免费视频 | 性做久久久久久久免费看 | 欧美兽交xxxx×视频 | 超碰97人人做人人爱少妇 | 婷婷丁香六月激情综合啪 | 未满成年国产在线观看 | 综合网日日天干夜夜久久 | 欧美丰满熟妇xxxx性ppx人交 | 性欧美疯狂xxxxbbbb | 夜夜高潮次次欢爽av女 | 无码国产激情在线观看 | 特级做a爰片毛片免费69 | 日韩成人一区二区三区在线观看 | 日韩精品一区二区av在线 | 亚洲乱码中文字幕在线 | 国产性生交xxxxx无码 | 中文字幕日韩精品一区二区三区 | 丰满肥臀大屁股熟妇激情视频 | 一本久道高清无码视频 | 高清不卡一区二区三区 | 99久久婷婷国产综合精品青草免费 | 欧美人与牲动交xxxx | 97精品人妻一区二区三区香蕉 | 久久午夜夜伦鲁鲁片无码免费 | 国产av人人夜夜澡人人爽麻豆 | 国产精品久久久一区二区三区 | 人妻人人添人妻人人爱 | 51国偷自产一区二区三区 | 玩弄人妻少妇500系列视频 | 麻豆国产人妻欲求不满 | 日本欧美一区二区三区乱码 | 天堂亚洲免费视频 | 无码中文字幕色专区 | 熟女少妇人妻中文字幕 | 国产精品无码永久免费888 | 久久综合给久久狠狠97色 | 福利一区二区三区视频在线观看 | 国产精品久久久久影院嫩草 | 久久亚洲国产成人精品性色 | 国产色精品久久人妻 | 强伦人妻一区二区三区视频18 | 人人妻人人澡人人爽人人精品浪潮 | 无码一区二区三区在线观看 | 国产亚洲精品久久久久久国模美 | 中文字幕 亚洲精品 第1页 | 网友自拍区视频精品 | 日韩精品无码免费一区二区三区 | 亚洲日本va午夜在线电影 | 清纯唯美经典一区二区 | 无码一区二区三区在线观看 | 日本肉体xxxx裸交 | 日韩无码专区 | 中文字幕乱码中文乱码51精品 | 日本一卡2卡3卡四卡精品网站 | 久久久久成人片免费观看蜜芽 | 帮老师解开蕾丝奶罩吸乳网站 | 女人被男人爽到呻吟的视频 | 天下第一社区视频www日本 | 大地资源网第二页免费观看 | 成年美女黄网站色大免费全看 | 特级做a爰片毛片免费69 | 欧美变态另类xxxx | 娇妻被黑人粗大高潮白浆 | 乱码av麻豆丝袜熟女系列 | 野外少妇愉情中文字幕 | 中文字幕无码日韩欧毛 | 国内综合精品午夜久久资源 | 日本www一道久久久免费榴莲 | av在线亚洲欧洲日产一区二区 | 日韩精品无码一本二本三本色 | 国产suv精品一区二区五 | 中文无码精品a∨在线观看不卡 | www国产亚洲精品久久久日本 | 亚洲国产精品一区二区美利坚 | 成人影院yy111111在线观看 | 午夜熟女插插xx免费视频 | 97夜夜澡人人爽人人喊中国片 | 激情人妻另类人妻伦 | 中文字幕+乱码+中文字幕一区 | 亚洲综合在线一区二区三区 | 国内精品久久毛片一区二区 | 国产精品无码一区二区桃花视频 | 国产成人av免费观看 | 亚洲s色大片在线观看 | 亚洲国产精品无码一区二区三区 | 少妇邻居内射在线 | 国产莉萝无码av在线播放 | 国精品人妻无码一区二区三区蜜柚 | 亚洲国产av精品一区二区蜜芽 | 无套内谢老熟女 | 久久精品女人天堂av免费观看 | 在线成人www免费观看视频 | 久久99精品久久久久久动态图 | 国产亲子乱弄免费视频 | 国产在线精品一区二区高清不卡 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 国产成人av免费观看 | 中文字幕av日韩精品一区二区 | 丰满岳乱妇在线观看中字无码 | 亚洲精品www久久久 | 亚洲欧美精品伊人久久 | 在线 国产 欧美 亚洲 天堂 | 欧美人与动性行为视频 | 国产精品久久久久9999小说 | 强奷人妻日本中文字幕 | 国产成人精品必看 | 欧美日韩一区二区三区自拍 | 午夜无码人妻av大片色欲 | 午夜时刻免费入口 | 欧美精品在线观看 | 日韩精品成人一区二区三区 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 特级做a爰片毛片免费69 | 沈阳熟女露脸对白视频 | 蜜臀av无码人妻精品 | 又大又黄又粗又爽的免费视频 | 人妻体内射精一区二区三四 | 中文字幕av伊人av无码av | 欧美成人家庭影院 | 亚洲国产精品久久久久久 | 亚洲精品国偷拍自产在线麻豆 | 天堂亚洲免费视频 | 乱中年女人伦av三区 | 国产成人无码午夜视频在线观看 | 久久无码人妻影院 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 日韩视频 中文字幕 视频一区 | 欧美日韩精品 | 中文字幕人妻无码一区二区三区 | 99精品国产综合久久久久五月天 | 亚洲国产欧美在线成人 | 精品久久久久久人妻无码中文字幕 | 日本一卡二卡不卡视频查询 | 久久婷婷五月综合色国产香蕉 | 人妻体内射精一区二区三四 | 无码成人精品区在线观看 | 大乳丰满人妻中文字幕日本 | 激情亚洲一区国产精品 | 97资源共享在线视频 | 久久久久国色av免费观看性色 | 国产免费观看黄av片 | 亚洲成a人一区二区三区 | 国产又爽又黄又刺激的视频 | 狠狠噜狠狠狠狠丁香五月 | 亚洲天堂2017无码 | 一本精品99久久精品77 | 天海翼激烈高潮到腰振不止 | 国产在热线精品视频 | 牲交欧美兽交欧美 | 成人免费无码大片a毛片 | 午夜理论片yy44880影院 | 欧美激情一区二区三区成人 | 在线观看欧美一区二区三区 | 久久www免费人成人片 | 亚洲色欲色欲天天天www | 少妇人妻偷人精品无码视频 | 国产亲子乱弄免费视频 | 欧美日本免费一区二区三区 | a在线亚洲男人的天堂 | 亚洲精品一区三区三区在线观看 | 国产成人无码区免费内射一片色欲 | 麻豆国产丝袜白领秘书在线观看 | 精品久久久无码中文字幕 | 久久久久se色偷偷亚洲精品av | 大乳丰满人妻中文字幕日本 | 特级做a爰片毛片免费69 | 国产无遮挡又黄又爽免费视频 | 在线播放无码字幕亚洲 | 国产美女精品一区二区三区 | 亚洲精品中文字幕久久久久 | 图片区 小说区 区 亚洲五月 | 成 人 网 站国产免费观看 | 自拍偷自拍亚洲精品10p | 国产成人午夜福利在线播放 | 老子影院午夜精品无码 | 国产综合色产在线精品 | www国产亚洲精品久久久日本 | 99久久99久久免费精品蜜桃 | 国产超级va在线观看视频 | 波多野结衣乳巨码无在线观看 | 爆乳一区二区三区无码 | 亚洲日韩一区二区 | 亚洲色欲色欲天天天www | 亚洲一区二区三区 | 国产手机在线αⅴ片无码观看 | 无码人妻久久一区二区三区不卡 | 欧洲精品码一区二区三区免费看 | 亚洲国产精品一区二区第一页 | 香港三级日本三级妇三级 | 精品无人国产偷自产在线 | 日韩精品一区二区av在线 | 中文字幕无码日韩欧毛 | 国产精品久久久久影院嫩草 | 国产成人一区二区三区别 | 人妻少妇精品无码专区动漫 | 亚洲综合无码一区二区三区 | 日韩欧美中文字幕在线三区 | 国产精品无码久久av | 四虎永久在线精品免费网址 | 欧美激情综合亚洲一二区 | 久久综合狠狠综合久久综合88 | 精品久久久久久亚洲精品 | 国产精品无码一区二区桃花视频 | 少妇无套内谢久久久久 | 欧美日韩在线亚洲综合国产人 | 国产精品美女久久久久av爽李琼 | 性色av无码免费一区二区三区 | 日本熟妇乱子伦xxxx | 精品久久久无码人妻字幂 | 亚洲色欲色欲欲www在线 | 国内精品人妻无码久久久影院蜜桃 | 国产做国产爱免费视频 | 熟妇人妻无乱码中文字幕 | 国内精品人妻无码久久久影院 | 露脸叫床粗话东北少妇 | 国产口爆吞精在线视频 | 小sao货水好多真紧h无码视频 | 精品夜夜澡人妻无码av蜜桃 | 在线a亚洲视频播放在线观看 | 亚洲午夜久久久影院 | 男人的天堂2018无码 | 久久99精品国产.久久久久 | 亚洲精品久久久久中文第一幕 | 人人妻人人藻人人爽欧美一区 | 国产在线精品一区二区三区直播 | 国产亚洲精品久久久久久大师 | 18精品久久久无码午夜福利 | 伊人久久大香线焦av综合影院 | 中文字幕人成乱码熟女app | 人妻中文无码久热丝袜 | 久久精品女人天堂av免费观看 | 欧美性生交活xxxxxdddd | 一本久道久久综合狠狠爱 | 日本免费一区二区三区最新 | 最新国产麻豆aⅴ精品无码 | 国色天香社区在线视频 | 国产乡下妇女做爰 | 亚洲gv猛男gv无码男同 | 国精品人妻无码一区二区三区蜜柚 | 午夜精品久久久久久久 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产福利视频一区二区 | 国产在线精品一区二区高清不卡 | 国产电影无码午夜在线播放 | 亚洲中文字幕在线无码一区二区 | av无码久久久久不卡免费网站 | 日韩人妻无码中文字幕视频 | 亚洲欧美中文字幕5发布 | 久久久久99精品国产片 | 亚洲中文字幕av在天堂 | 少妇性俱乐部纵欲狂欢电影 | 亚洲 另类 在线 欧美 制服 | 亚洲色欲色欲天天天www | 亲嘴扒胸摸屁股激烈网站 | 无码人妻丰满熟妇区毛片18 | aⅴ亚洲 日韩 色 图网站 播放 | 巨爆乳无码视频在线观看 | 乌克兰少妇性做爰 | 久久久久免费看成人影片 | 欧美三级不卡在线观看 | 亚洲一区二区三区国产精华液 | 99久久99久久免费精品蜜桃 | 一区二区传媒有限公司 | 成人亚洲精品久久久久软件 | 人妻与老人中文字幕 | 伊在人天堂亚洲香蕉精品区 | 精品欧美一区二区三区久久久 | 少妇无码av无码专区在线观看 | 无码精品人妻一区二区三区av | 久久天天躁夜夜躁狠狠 | 国产人妻精品午夜福利免费 | 乱码午夜-极国产极内射 | av无码久久久久不卡免费网站 | 免费观看又污又黄的网站 | 无码一区二区三区在线 | 亚洲伊人久久精品影院 | 日本精品人妻无码免费大全 | 人妻互换免费中文字幕 | 亚洲va中文字幕无码久久不卡 | 国产精品美女久久久 | 秋霞成人午夜鲁丝一区二区三区 | 在线观看国产午夜福利片 | 在线视频网站www色 | 麻豆果冻传媒2021精品传媒一区下载 | 无码任你躁久久久久久久 | 国产成人无码午夜视频在线观看 | 日日摸夜夜摸狠狠摸婷婷 | 女人被男人躁得好爽免费视频 | 性欧美熟妇videofreesex | 亚洲s码欧洲m码国产av | 国产成人无码一二三区视频 | 久久精品中文字幕一区 | 高清不卡一区二区三区 | 久久久久久九九精品久 | 成熟女人特级毛片www免费 | 欧美三级a做爰在线观看 | 欧美激情一区二区三区成人 | 最新国产麻豆aⅴ精品无码 | 男女下面进入的视频免费午夜 | 国产亚洲精品久久久久久国模美 | 国内精品久久久久久中文字幕 | 亚洲经典千人经典日产 | 日本一卡二卡不卡视频查询 | 亚洲人成网站色7799 | 伊人久久婷婷五月综合97色 | 人妻少妇精品视频专区 | 男女性色大片免费网站 | 欧美激情一区二区三区成人 | 亚洲一区二区三区四区 | 欧美日韩视频无码一区二区三 | 色综合久久中文娱乐网 | 偷窥村妇洗澡毛毛多 | 国产熟妇高潮叫床视频播放 | 国产国产精品人在线视 | 蜜臀aⅴ国产精品久久久国产老师 | 骚片av蜜桃精品一区 | 国产深夜福利视频在线 | 亚洲精品午夜无码电影网 | 亚洲精品无码人妻无码 | 亚洲日韩av一区二区三区四区 | 日本丰满护士爆乳xxxx | www一区二区www免费 | 国内少妇偷人精品视频免费 | 人人妻人人澡人人爽欧美一区 | 一本色道久久综合亚洲精品不卡 | 亚洲精品国偷拍自产在线观看蜜桃 | 成人免费视频在线观看 | 51国偷自产一区二区三区 | 久久久精品成人免费观看 | 三级4级全黄60分钟 | 久久国产精品萌白酱免费 | 啦啦啦www在线观看免费视频 | 又紧又大又爽精品一区二区 | 亚洲综合另类小说色区 | 国产麻豆精品一区二区三区v视界 | 四十如虎的丰满熟妇啪啪 | 国产成人无码av一区二区 | 成年美女黄网站色大免费全看 | 永久免费精品精品永久-夜色 | 大胆欧美熟妇xx | 亚洲国产欧美日韩精品一区二区三区 | 成人试看120秒体验区 | 欧美丰满少妇xxxx性 | 丰满少妇女裸体bbw | 国产无遮挡又黄又爽又色 | 亚洲日韩精品欧美一区二区 | 国产精品.xx视频.xxtv | 曰韩少妇内射免费播放 | 图片小说视频一区二区 | 国产黑色丝袜在线播放 | 红桃av一区二区三区在线无码av | 国产精品va在线观看无码 | 日韩精品一区二区av在线 | aa片在线观看视频在线播放 | 久久99精品国产麻豆 | 精品久久久中文字幕人妻 | 97久久精品无码一区二区 | 亚洲精品无码人妻无码 | 日韩少妇内射免费播放 | 亚洲综合精品香蕉久久网 | 综合网日日天干夜夜久久 | 欧美35页视频在线观看 | 牲欲强的熟妇农村老妇女 | 亚洲国产精品一区二区美利坚 | 人人澡人人透人人爽 | 四虎国产精品一区二区 | 狠狠色噜噜狠狠狠7777奇米 | 在线精品国产一区二区三区 | 又湿又紧又大又爽a视频国产 | 人人澡人摸人人添 | 亚洲国产欧美日韩精品一区二区三区 | 成人试看120秒体验区 | 美女黄网站人色视频免费国产 | 男女猛烈xx00免费视频试看 | 亚洲熟妇色xxxxx亚洲 | 国产福利视频一区二区 | 精品久久久中文字幕人妻 | 国产美女精品一区二区三区 | 精品无码国产一区二区三区av | 麻豆国产人妻欲求不满 | 一个人免费观看的www视频 | 午夜理论片yy44880影院 | 久久综合网欧美色妞网 | 亚洲精品久久久久久一区二区 | 天天躁夜夜躁狠狠是什么心态 | 好爽又高潮了毛片免费下载 | 国产精品毛片一区二区 | 国产成人无码午夜视频在线观看 | 又大又硬又爽免费视频 | 亚拍精品一区二区三区探花 | 国产成人精品优优av | 最近免费中文字幕中文高清百度 | 久久国产劲爆∧v内射 | 国产精品丝袜黑色高跟鞋 | 纯爱无遮挡h肉动漫在线播放 | 久久综合色之久久综合 | 欧洲精品码一区二区三区免费看 | 67194成是人免费无码 | 国产成人精品三级麻豆 | 久久久中文字幕日本无吗 | 国产精品无码一区二区桃花视频 | 少妇性荡欲午夜性开放视频剧场 | 亚洲精品美女久久久久久久 | 国产一区二区三区日韩精品 | av在线亚洲欧洲日产一区二区 | 亚洲精品欧美二区三区中文字幕 | 天天躁夜夜躁狠狠是什么心态 | 亚欧洲精品在线视频免费观看 | 日本精品少妇一区二区三区 | 精品久久久久久人妻无码中文字幕 | 啦啦啦www在线观看免费视频 | 国产在线精品一区二区三区直播 | 国产精品18久久久久久麻辣 | 国产亚洲欧美日韩亚洲中文色 | 国产在线精品一区二区三区直播 | 白嫩日本少妇做爰 | 国产亚av手机在线观看 | 久久午夜夜伦鲁鲁片无码免费 | 亚洲区小说区激情区图片区 | 高潮毛片无遮挡高清免费视频 | 国产午夜亚洲精品不卡 | 欧美一区二区三区 | 人人爽人人爽人人片av亚洲 | 一本一道久久综合久久 | 国产成人精品优优av | 成人av无码一区二区三区 | 中文精品久久久久人妻不卡 | 玩弄人妻少妇500系列视频 | 日产精品高潮呻吟av久久 | 久久亚洲精品中文字幕无男同 | 色妞www精品免费视频 | 国产精品人人妻人人爽 | 国产精品资源一区二区 | 色婷婷av一区二区三区之红樱桃 | 东京热无码av男人的天堂 | 日韩精品无码一区二区中文字幕 | 娇妻被黑人粗大高潮白浆 | 国产一区二区三区精品视频 | 少妇激情av一区二区 | 国产97在线 | 亚洲 | 内射巨臀欧美在线视频 | 青草青草久热国产精品 | 国产成人亚洲综合无码 | 天堂在线观看www | 欧美日韩久久久精品a片 | 亚洲成a人片在线观看日本 | av在线亚洲欧洲日产一区二区 | 亚洲综合无码一区二区三区 | 亚洲春色在线视频 | 中文字幕av日韩精品一区二区 | 中文字幕人妻丝袜二区 | 亚洲娇小与黑人巨大交 | 国产精品对白交换视频 | 一本久久a久久精品亚洲 | 无人区乱码一区二区三区 | 成人片黄网站色大片免费观看 | 欧美 日韩 人妻 高清 中文 | 成人免费无码大片a毛片 | 人人澡人人透人人爽 | 偷窥日本少妇撒尿chinese | 狂野欧美性猛xxxx乱大交 | 国产激情一区二区三区 | 人人澡人人妻人人爽人人蜜桃 | 亚洲欧美日韩成人高清在线一区 | 伊人久久大香线蕉午夜 | 在线精品国产一区二区三区 | 国产成人无码a区在线观看视频app | 久久无码中文字幕免费影院蜜桃 | 国产成人精品无码播放 | 国产在线精品一区二区三区直播 | 中国大陆精品视频xxxx | 国产精品久久福利网站 | 少妇激情av一区二区 | 亚洲欧美中文字幕5发布 | 日日摸日日碰夜夜爽av | av无码久久久久不卡免费网站 | 图片区 小说区 区 亚洲五月 | 国产av人人夜夜澡人人爽麻豆 | 熟女少妇在线视频播放 | 亚洲色欲色欲欲www在线 | 国产成人综合色在线观看网站 | 国产明星裸体无码xxxx视频 | 国产精品99爱免费视频 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 一个人看的视频www在线 | 欧美自拍另类欧美综合图片区 | 中文字幕无码热在线视频 | 人人超人人超碰超国产 | 国产绳艺sm调教室论坛 | 中文无码成人免费视频在线观看 | 亚洲国产成人av在线观看 | 99久久精品无码一区二区毛片 | 丰腴饱满的极品熟妇 | 美女黄网站人色视频免费国产 | 亚洲熟妇色xxxxx欧美老妇y | 99久久久国产精品无码免费 | 中文字幕乱码人妻无码久久 | 亚洲啪av永久无码精品放毛片 | 99riav国产精品视频 | 国产av无码专区亚洲awww | 小sao货水好多真紧h无码视频 | 国产成人无码a区在线观看视频app | 欧洲熟妇精品视频 | 日本护士毛茸茸高潮 | 亚洲人交乣女bbw | 无码国产激情在线观看 | 欧美国产日产一区二区 | 无码av岛国片在线播放 | 久久久久久久久888 | 国产精品永久免费视频 | 国产精品香蕉在线观看 | 久久国产精品萌白酱免费 | 免费无码一区二区三区蜜桃大 | 亚洲va欧美va天堂v国产综合 | 俺去俺来也www色官网 | 午夜福利不卡在线视频 | 无码人妻丰满熟妇区毛片18 | 国产精品久久久久久久影院 | 亚洲精品久久久久avwww潮水 | 国产精品99爱免费视频 | 色欲久久久天天天综合网精品 | 国产精品无码永久免费888 | 一本无码人妻在中文字幕免费 | 免费观看激色视频网站 | 一个人看的www免费视频在线观看 | 亚洲一区二区观看播放 | 久久99国产综合精品 | 国语精品一区二区三区 | 成人试看120秒体验区 | 俄罗斯老熟妇色xxxx | 国产午夜视频在线观看 | 久久亚洲精品中文字幕无男同 | 欧美xxxx黑人又粗又长 | 国产亚洲tv在线观看 | 无码一区二区三区在线 | 国产精品va在线播放 | 无码人妻精品一区二区三区不卡 | 欧美熟妇另类久久久久久不卡 | 真人与拘做受免费视频一 | 亚洲色在线无码国产精品不卡 | 伊人久久婷婷五月综合97色 | 成人av无码一区二区三区 | 色情久久久av熟女人妻网站 | 精品人妻中文字幕有码在线 | 青青草原综合久久大伊人精品 | 成熟妇人a片免费看网站 | 久久人妻内射无码一区三区 | 中文字幕无线码 | 亚洲精品一区二区三区婷婷月 | 国产精品沙发午睡系列 | 日本熟妇人妻xxxxx人hd | 日本又色又爽又黄的a片18禁 | 人妻熟女一区 | 亚洲の无码国产の无码影院 | 亚洲自偷自拍另类第1页 | 日本熟妇乱子伦xxxx | 又大又紧又粉嫩18p少妇 | 国模大胆一区二区三区 | 天天拍夜夜添久久精品 | 国产亚洲欧美日韩亚洲中文色 | 无码av免费一区二区三区试看 | 精品无码国产自产拍在线观看蜜 | 国产九九九九九九九a片 | 亚洲色欲色欲天天天www | 亚洲欧洲中文日韩av乱码 | 人人妻人人澡人人爽人人精品 | 色诱久久久久综合网ywww | 激情内射亚州一区二区三区爱妻 | 国产成人无码av片在线观看不卡 | 国产成人久久精品流白浆 | 亚洲人成影院在线观看 | 中文字幕无码免费久久9一区9 | 1000部啪啪未满十八勿入下载 | 免费男性肉肉影院 | 亚洲国产精品无码一区二区三区 | 99麻豆久久久国产精品免费 | 人妻少妇精品无码专区动漫 | 亚洲精品一区二区三区四区五区 | 精品无码国产一区二区三区av | 日本欧美一区二区三区乱码 | 99精品久久毛片a片 | 色 综合 欧美 亚洲 国产 | 国内少妇偷人精品视频免费 | 黑人大群体交免费视频 | 国产一区二区三区日韩精品 | 美女扒开屁股让男人桶 | 未满成年国产在线观看 | 成熟女人特级毛片www免费 | 极品嫩模高潮叫床 | 少妇久久久久久人妻无码 | 亚洲国产精品一区二区第一页 | 性生交大片免费看女人按摩摩 | 真人与拘做受免费视频 | 少妇性l交大片欧洲热妇乱xxx | 欧美成人免费全部网站 | 在线观看国产一区二区三区 | 亚洲综合伊人久久大杳蕉 | 国产精品亚洲一区二区三区喷水 | 欧美国产日产一区二区 | 欧美 日韩 人妻 高清 中文 | 亚洲精品鲁一鲁一区二区三区 | 国产成人久久精品流白浆 | 又大又硬又黄的免费视频 | 国内揄拍国内精品人妻 | 综合人妻久久一区二区精品 | 人人爽人人澡人人人妻 | 黑人大群体交免费视频 | 亚洲а∨天堂久久精品2021 | 天天摸天天碰天天添 | 久久久久se色偷偷亚洲精品av | 国产精品人妻一区二区三区四 | 国产免费无码一区二区视频 | 亚洲国产午夜精品理论片 | 国产精品嫩草久久久久 | 中文字幕人成乱码熟女app | 亚洲国产午夜精品理论片 | 欧洲熟妇精品视频 | 色情久久久av熟女人妻网站 | 国产免费久久精品国产传媒 | 午夜福利一区二区三区在线观看 | 超碰97人人射妻 | 日韩在线不卡免费视频一区 | 久在线观看福利视频 | 黑人玩弄人妻中文在线 | 国产高清不卡无码视频 | 国产亚洲精品久久久闺蜜 | 啦啦啦www在线观看免费视频 | 黑人粗大猛烈进出高潮视频 | 成人三级无码视频在线观看 | 亚洲色欲久久久综合网东京热 | 成年美女黄网站色大免费视频 | 扒开双腿疯狂进出爽爽爽视频 | 成人亚洲精品久久久久软件 | 精品夜夜澡人妻无码av蜜桃 | 国产精品人人妻人人爽 | 欧美日韩一区二区三区自拍 | 人人妻人人澡人人爽欧美精品 | 国产成人综合色在线观看网站 | 国产国语老龄妇女a片 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 西西人体www44rt大胆高清 | 色婷婷久久一区二区三区麻豆 | 亚洲热妇无码av在线播放 | 午夜福利不卡在线视频 | 成人影院yy111111在线观看 | 国产成人精品一区二区在线小狼 | 亚洲最大成人网站 | 曰韩无码二三区中文字幕 | 丰满护士巨好爽好大乳 | 欧美 亚洲 国产 另类 | 精品偷自拍另类在线观看 | 亚洲国产欧美国产综合一区 | 国产一区二区不卡老阿姨 | 亚洲精品国产精品乱码视色 | 久久综合狠狠综合久久综合88 | 国产sm调教视频在线观看 | 熟妇人妻无码xxx视频 | 久久综合给久久狠狠97色 | 久久午夜无码鲁丝片秋霞 | 久久久国产一区二区三区 | 亚洲国精产品一二二线 | 国产精品亚洲一区二区三区喷水 | 国产成人无码一二三区视频 | 麻豆国产97在线 | 欧洲 | 日本一本二本三区免费 | 欧美自拍另类欧美综合图片区 | 国内丰满熟女出轨videos | 久激情内射婷内射蜜桃人妖 | 高清无码午夜福利视频 | 欧美第一黄网免费网站 | 国产成人精品必看 | 国产av无码专区亚洲a∨毛片 | 日韩精品无码一区二区中文字幕 | 中文字幕av无码一区二区三区电影 | 激情人妻另类人妻伦 | 熟妇人妻中文av无码 | 又大又黄又粗又爽的免费视频 | а√天堂www在线天堂小说 | 成年美女黄网站色大免费全看 | 欧美黑人巨大xxxxx | 婷婷色婷婷开心五月四房播播 | 在线成人www免费观看视频 | 超碰97人人做人人爱少妇 | 99精品无人区乱码1区2区3区 | 欧洲美熟女乱又伦 | 熟女少妇在线视频播放 | 少妇一晚三次一区二区三区 | 好爽又高潮了毛片免费下载 | 亚洲乱码日产精品bd | 亚洲性无码av中文字幕 |