UEditor 解决拖拽视频元素改变视频尺寸时,无法保存视频尺寸问题的解决方法

UEditor虽然强大,但是bug还是蛮多的。比如插入视频元素后,拖拽视频去缩放尺寸,编辑器并没有将实际的尺寸保存下来。当你点击HTML按钮查看源代码时,width和height还是原来的值,再次点击此按钮回到正常状态,缩略图又回到原来的大小了。

翻源代码翻了蛮久,终于把这个问题解决了。问题就出在插入视频后创建视频HTML字符串和HTML字符串与可视化编辑层转化的地方。

当视频上传完成后,创建一个img用于可视化编辑,将默认width和height设置到img的width和height的属性中。当你拖动可视化图片时,就会改变这个img的style中的width和height来改变img的大小(注意,不是改变width和height属性),将新的高和宽设置到。一直到这里其实都没什么问题。

看一下下面这段代码,在ueditor.all.js里:

function creatInsertStr(url,width,height,id,align,classname,type){
        var str;
        switch (type){
            case ‘image‘:
                str = ‘<img ‘ + (id ? ‘id="‘ + id+‘"‘ : ‘‘) + ‘ width="‘+ width +‘" height="‘ + height + ‘" _url="‘+url+‘" class="‘ + classname + ‘"‘  +
                    ‘ src="‘ + me.options.UEDITOR_HOME_URL+‘themes/default/images/spacer.gif" style="background:url(‘+me.options.UEDITOR_HOME_URL+‘themes/default/images/videologo.gif) no-repeat center center; border:1px solid gray;‘+(align ? ‘float:‘ + align + ‘;‘: ‘‘)" />‘
                break;
            case ‘embed‘:
                str = ‘<embed type="application/x-shockwave-flash" class="‘ + classname + ‘" pluginspage="http://www.macromedia.com/go/getflashplayer"‘ +
                    ‘ src="‘ +  utils.html(url) + ‘" width="‘ + width  + ‘" height="‘ + height  + ‘"‘  + (align ? ‘ style="float:‘ + align + ‘"‘: ‘‘) +
                    ‘ wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >‘;
                break;
            case ‘video‘:
                var ext = url.substr(url.lastIndexOf(‘.‘) + 1);
                if(ext == ‘ogv‘) ext = ‘ogg‘;
                str = ‘<video‘ + (id ? ‘ id="‘ + id + ‘"‘ : ‘‘) + ‘ class="‘ + classname + ‘" ‘ + (align ? ‘ style="float:‘ + align + ‘"‘: ‘‘) +
                    ‘" controls preload="none" width="‘ + width + ‘" height="‘ + height + ‘" src="‘ + url + ‘" data-setup="{}">‘ +
                    ‘<source src="‘ + url + ‘" type="video/‘ + ext + ‘" /></video>‘;
                break;
        }
        return str;
    }
function switchImgAndVideo(root,img2video){
        utils.each(root.getNodesByTagName(img2video ? ‘img‘ : ‘embed video‘),function(node){
            var className = node.getAttr(‘class‘);
            var rWidth = node.getStyle("width");
            var rHeight = node.getStyle("height");
            if(className && className.indexOf(‘edui-faked-video‘) != -1){
                //here
                var html = creatInsertStr( img2video ? node.getAttr(‘_url‘) : node.getAttr(‘src‘),node.getAttr("width"),node.getAttr("height"),null,node.getStyle(‘float‘) || ‘‘,className,img2video ? ‘embed‘:‘image‘);
                node.parentNode.replaceChild(UE.uNode.createElement(html),node);
            }

            if(className && className.indexOf(‘edui-upload-video‘) != -1){
                //here
                var html = creatInsertStr( img2video ? node.getAttr(‘_url‘) : node.getAttr(‘src‘),node.getAttr("width"),node.getAttr("height"),null,node.getStyle(‘float‘) || ‘‘,className,img2video ? ‘video‘:‘image‘);
                node.parentNode.replaceChild(UE.uNode.createElement(html),node);
            }
        })
    }

这段代码是用于控制html源码与可视化编辑直接的转换的,注释here下一行就是调用上面的方法,问题就出在这里。

这里传入creatInsertStr函数的width和height值是node.getAttr("width|height"),也就是说获取的是标签的width和height属性,而不是style属性里面的width和height。但实际上我们拖动的时候是改变img的style属性,img的width和height不会变,还是默认的值。所以你无论怎么拖动,到最后创建的html代码中video的宽和高都还是默认的。

?所以,我们需要将其统一化,在这里我使他们都用style来设置宽和高,不用width和height属性。修改后的代码如下: ?

function creatInsertStr(url,width,height,id,align,classname,type){
        width += "";
        height += "";
        if(width.indexOf("px") == -1){
            width+="px";
        }
        if(height.indexOf("px") == -1){
            height+="px";
        }
        var str;
        switch (type){
            case ‘image‘:
                str = ‘<img ‘ + (id ? ‘id="‘ + id+‘"‘ : ‘‘) + ‘ a="‘+ width +‘" b="‘ + height + ‘" _url="‘+url+‘" class="‘ + classname + ‘"‘  +
                    ‘ src="‘ + me.options.UEDITOR_HOME_URL+‘themes/default/images/spacer.gif" style="background:url(‘+me.options.UEDITOR_HOME_URL+‘themes/default/images/videologo.gif) no-repeat center center; border:1px solid gray;‘+(align ? ‘float:‘ + align + ‘;‘: ‘‘)+‘ width:‘+width+‘; height:‘+height+‘" />‘
                break;
            case ‘embed‘:
                str = ‘<embed type="application/x-shockwave-flash" class="‘ + classname + ‘" pluginspage="http://www.macromedia.com/go/getflashplayer"‘ +
                    ‘ src="‘ +  utils.html(url) + ‘" width="‘ + width  + ‘" height="‘ + height  + ‘"‘  + (align ? ‘ style="float:‘ + align + ‘"‘: ‘‘) +
                    ‘ wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >‘;
                break;
            case ‘video‘:
                var ext = url.substr(url.lastIndexOf(‘.‘) + 1);
                if(ext == ‘ogv‘) ext = ‘ogg‘;
                str = ‘<video‘ + (id ? ‘ id="‘ + id + ‘"‘ : ‘‘) + ‘ class="‘ + classname + ‘" ‘ + (align ? ‘ style="float:‘ + align + ‘"‘: ‘‘) +
                    ‘style="width:‘+width+‘;height:‘+height+‘" controls preload="none" width="‘ + width + ‘" height="‘ + height + ‘" src="‘ + url + ‘" data-setup="{}">‘ +
                    ‘<source src="‘ + url + ‘" type="video/‘ + ext + ‘" /></video>‘;
                break;
        }
        return str;
    }

    function switchImgAndVideo(root,img2video){
        utils.each(root.getNodesByTagName(img2video ? ‘img‘ : ‘embed video‘),function(node){
            var className = node.getAttr(‘class‘);
            var rWidth = node.getStyle("width");
            var rHeight = node.getStyle("height");
            if(className && className.indexOf(‘edui-faked-video‘) != -1){
                var html = creatInsertStr( img2video ? node.getAttr(‘_url‘) : node.getAttr(‘src‘),rWidth,rHeight,null,node.getStyle(‘float‘) || ‘‘,className,img2video ? ‘embed‘:‘image‘);
                node.parentNode.replaceChild(UE.uNode.createElement(html),node);
            }

            if(className && className.indexOf(‘edui-upload-video‘) != -1){
                var html = creatInsertStr( img2video ? node.getAttr(‘_url‘) : node.getAttr(‘src‘),rWidth,rHeight,null,node.getStyle(‘float‘) || ‘‘,className,img2video ? ‘video‘:‘image‘);
                node.parentNode.replaceChild(UE.uNode.createElement(html),node);
            }
        })
    }

?    ?我们在传入给creatInsertStr参数时,使用node.getStyle方法获得的元素style中的高和宽,而在creatInsertStr方法中,我们将高和宽设置到style中,并将width和height属性重命名或者删掉,这样,我们就统一了从可视化编辑到源代码所使用的尺寸,这样就可以解决尺寸无法保存的问题。

UEditor 解决拖拽视频元素改变视频尺寸时,无法保存视频尺寸问题的解决方法,布布扣,bubuko.com

时间: 2024-08-10 21:30:16

UEditor 解决拖拽视频元素改变视频尺寸时,无法保存视频尺寸问题的解决方法的相关文章

从下拉菜单拖拽一个元素 出来,插入到页面中的app 列表中

1,实现功能:从下拉菜单拖拽一个元素 出来,插入到页面中的app 列表中 并实现app向后移动一个元素的位置: 2.实现思路: 01.遍历下拉菜单,添加拖拽方法,实现位置移动功能: 02.遍历app列表,将app位置存为数组,进行循环: 03.拖拽元素与当前app做碰撞检测: 04.如果鼠标在app内部,则将拖拽元素添加到当前app之后,位置设置为当前 i 的值: 参考代码如下: <!doctype html> <html lang="en"> <head

HTML5:一个拖拽网页元素的例子

关键字:HTML5, Drag&Drop, JavaScript, CSS 运行环境:Chrome <!DOCTYPE html> <html> <head> <title>example</title> <style type="text/css"> .main-area { margin-left: 10%; margin-right: 10%; min-width: 600px; } ul { pad

JavaScript拖拽网页元素

<!DOCTYPE HTML> <html> <head> <title>javascript drag</title> <meta charset="utf-8"> </head> <body> <div id="drag" style="position: absolute;width: 300px;height: 180px;background:

javascript动画系列第四篇——拖拽改变元素大小

× 目录 [1]原理简介 [2]范围圈定 [3]大小改变[4]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位元素的left和top值实现的.而拖拽改变元素大小,则还需要改变元素的宽高 范围圈定 我们把改变元素大小的范围圈定在距离相应边10px的范围内 左侧边界L = obj.offsetLeft + 10 右侧边界R = obj.offsetLeft + obj.offsetWidth - 10 上侧边界

拖拽改变元素位置或大小bug修复

<!doctype html><html><head>   <meta charset="utf-8">   <title>无标题文档</title><style>body{   background:#000;}.upshop-view{   width:320px;   height:499px;   background:#fff;   background-size:contain;   pos

拖拽改变元素位置或大小

<!doctype html><html><head><meta charset="utf-8"><title>无标题文档</title><style>body{ background:#000;}.upshop-view{ width:320px; height:499px; background:#fff; background-size:contain; position:relative; z-

在使用ActionChains类,在执行一次拖拽后再拖拽,还会重复拖拽上一个元素

背景: 在项目的实际使用中,要对多个元素进行拖拽到指定区域,并且这些元素还分属于不同的类型中.在拖拽完第一个元素之后,再去拖拽其它元素,会发现又会拖拽一次第一个元素. 历程: 1.网上搜索一番,没有得到答案: 2.翻阅ActionChains的源代码,发现它是将所有action存储在一个_actions的变量中.然后在perform方法中去执行这个数组中存储的所有action.代码如下: def perform(self): """ Performs all stored a

WPF中元素拖拽的两个实例

原文:WPF中元素拖拽的两个实例 今天结合之前做过的一些拖拽的例子来对这个方面进行一些总结,这里主要用两个例子来说明在WPF中如何使用拖拽进行操作,元素拖拽是一个常见的操作,第一个拖拽的例子是将ListBox中的子元素拖拽到ListView的某一个节点,从而将该子元素作为当前节点的子节点.第二个例子就是将ListView的某一项拖拽到另外一项上从而使两个子项位置互换,这两个例子的原理类似,实现细节上有所差别,下面就具体分析一下这些细节. DEMO1 一 示例截图 图一 示例一截图 二 重点原理分

JS拖拽元素原理及实现代码

拖拽功能主要是用在让用户做一些自定义的动作,比如拖动排序,弹出框拖动移动等等,效果还是蛮不错的.下面讲解一下拖拽的原理,希望可以帮助到有需要的朋友! 一.拖拽的流程动作①鼠标按下②鼠标移动③鼠标松开 二.拖拽流程中对应的JS事件①鼠标按下会触发onmousedown事件 [javascript] view plain copy obj.onmousedown = function(e) { //.......... } ②鼠标移动会触发onmousemove事件 [javascript] vie