Skip to content
大刘 大刘 发布于 2018年02月16日
一个 web 开发者

解决 Ueditor 插入第三方视频网站通用代码的问题

百度 Ueditor 编辑器使用非常广泛,由此衍生的各种定制化的编辑器也非常多,如微信公众号文章编辑器等都是基于 Ueditor 编辑器开发的。但官方维护的是通用的 PC 编辑器,有些格式不适应移动 H5 页面显示,比如图片自适应,不能插入第三方网站视频通用代码等。因此,也需要进行必要的修改来满足定制化的需求。

所谓第三方视频网站通用代码,就是视频网站提供分享功能时,可选择 HTML 代码,通过代码等,通用代码可以兼容手机播放,比如在 iPhone、iPad 上播放。

需要满足的功能:

  • 支持插入视频功能
  • 视频播放兼容手机播放,如 iPhone

支持插入视频功能

基于 Ueditor 编辑器强大的可定制化的功能,支持插入视频功能非常简单。在 ueditor/ueditor.config.jstoolbars 添加 insertvideo 即可。

javascript
// 工具栏上的所有的功能按钮和下拉框,可以在 new 编辑器的实例时选择自己需要的重新定义
, toolbars: [
    [...'insertvideo',]
]

视频播放兼容手机播放

这里主要是插入第三方视频播放器,而且为了兼容手机播放,会使用第三方视频网站通用代码(可以在视频播放页-分享-通用代码中获取)。一般格式如下:

html
<iframe
  frameborder="0"
  width="640"
  height="498"
  src="https://v.qq.com/iframe/player.html?vid=y0016tj0qvh&tiny=0&auto=0"
  allowfullscreen
></iframe>

Ueditor 编辑器视频网址默认的不支持插入 iframe 格式,这里需要修改下源码。路径:ueditor/dialogs/video/video.js ,修改的地方如下:

javascript
...
/**
 * 将单个视频信息插入编辑器中
 * 修改:处理通用视频代码 iframe   lzw 2017-09-11
 */
function insertSingle(){
    var width = $G("videoWidth"),
        height = $G("videoHeight"),
        url=$G('videoUrl').value,
        align = findFocus("videoFloat","name");
    if(!url) return false;
    if ( !checkNum( [width, height] ) ) return false;
    /**处理通用视频代码 iframe   lzw 2017-09-11 **/
    url = utils.trim(url);
    if(/^<iframe/.test(url)){
        var conUrl = '';
        if(/src="[^s"]+/i.test(url)){
            conUrl = url.match(/src="[^s"]+/i)[0].substr(5);
        }
        var newIframe = editor.document.createElement("iframe");
        var div;
        newIframe.setAttribute("src",/http://|https:///ig.test(conUrl) ? conUrl : "http://"+conUrl);
        /^[1-9]+[.]?d*$/g.test( width.value ) ? newIframe.setAttribute("width",width.value) : "";
        /^[1-9]+[.]?d*$/g.test( height.value ) ? newIframe.setAttribute("height",height.value) : "";
        //newIframe.setAttribute("scrolling","no");
        newIframe.setAttribute("frameborder","0",0);
        newIframe.setAttribute("allowfullscreen","allowfullscreen");
        newIframe.setAttribute("align",align);
        div = editor.document.createElement("div");
        div.appendChild(newIframe);
        //alert(div.innerHTML);
        console.log(div.innerHTML);
        editor.execCommand("inserthtml",div.innerHTML,true);
    } else {/** -end 处理通用视频代码 iframe   lzw 2017-09-11 **/
        editor.execCommand('insertvideo', {
            url: convert_url(url),
            width: width.value,
            height: height.value,
            align: align
        }, isModifyUploadVideo ? 'upload':null);
    }///**处理通用视频代码 iframe   lzw 2017-09-11 **/
}
...
/**
 * 根据 url 生成视频预览
 * 修改:处理通用视频代码 iframe   lzw 2017-09-11
 * @param url
 */
function createPreviewVideo(url){
    if ( !url )return;
    /** 处理通用视频代码 iframe   lzw 2017-09-11 **/
    url = utils.trim(url);
    if(/^<iframe/.test(url)){
        var conUrl = '';
        if(/src="[^s"]+/i.test(url)){
            conUrl = url.match(/src="[^s"]+/i)[0].substr(5);
        }
        $G("preview").innerHTML = '<div class="previewMsg"><span>'+lang.urlError+'</span></div>'+
        '<iframe class="previewVideo"' +
            ' src="'%20+%20conUrl%20+%20'"' +
            ' width="' + 420  + '"' +
            ' height="' + 280  + '"' +
            ' frameborder=0 allowfullscreen>' +
        '</iframe>';
    } else {/** -end 处理通用视频代码 iframe   lzw 2017-09-11 **/
        var conUrl = convert_url(url);
        conUrl = utils.unhtmlForUrl(conUrl);
        $G("preview").innerHTML = '<div class="previewMsg"><span>'+lang.urlError+'</span></div>'+
        '<embed class="previewVideo" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"' +
            ' src="'%20+%20conUrl%20+%20'"' +
            ' width="' + 420  + '"' +
            ' height="' + 280  + '"' +
            ' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >' +
        '</embed>';
    }
}///** 处理通用视频代码 iframe   lzw 2017-09-11 **/
...

大家可以自行比较下,绝对

有区别,但是决不会影响 Ueditor 的正常功能。但这里还需要比较重要的一步,添加过滤白名单。在 ueditor/ueditor.config.jswhitList 添加白名单。

javascript
// xss 过滤白名单 名单来源: https://raw.githubusercontent.com/leizongmin/js-xss/master/lib/default.js
,whitList: {
    ...
    iframe: ['src', 'class', 'height', 'width', 'max-width', 'max-height', 'align', 'frameborder', 'allowfullscreen']
}

到这里就大功告成了。

基于 MIT 许可发布