mxgraph示例解析(-) drop圖片拖拽入畫板

drop圖片拖拽入畫板

官方示例

// Disables the built-in context menu
mxEvent.disableContextMenu(container);

// Creates the graph inside the given container
var graph = new mxGraph(container);

// Enables rubberband selection
new mxRubberband(graph);

mxEvent.addListener(container, 'dragover', function(evt)
{
    if (graph.isEnabled())
    {
        evt.stopPropagation();
        evt.preventDefault();
    }
});

mxEvent.addListener(container, 'drop', function(evt)
{
    if (graph.isEnabled())
    {
        evt.stopPropagation();
        evt.preventDefault();

        // Gets drop location point for vertex
        var pt = mxUtils.convertPoint(graph.container, mxEvent.getClientX(evt), mxEvent.getClientY(evt));
        var tr = graph.view.translate;
        var scale = graph.view.scale;
        var x = pt.x / scale - tr.x;
        var y = pt.y / scale - tr.y;
        
        // Converts local images to data urls
        var filesArray = event.dataTransfer.files;
        
        for (var i = 0; i < filesArray.length; i++)
        {
            handleDrop(graph, filesArray[i], x + i * 10, y + i * 10);
        }
    }
});
function handleDrop(graph, file, x, y)
{
    if (file.type.substring(0, 5) == 'image')
    {
        var reader = new FileReader();

        reader.onload = function(e)
        {
            // Gets size of image for vertex
            var data = e.target.result;

            // SVG needs special handling to add viewbox if missing and
            // find initial size from SVG attributes (only for IE11)
            if (file.type.substring(0, 9) == 'image/svg')
            {
                var comma = data.indexOf(',');
                var svgText = atob(data.substring(comma + 1));
                var root = mxUtils.parseXml(svgText);
                
                // Parses SVG to find width and height
                if (root != null)
                {
                    var svgs = root.getElementsByTagName('svg');
                    
                    if (svgs.length > 0)
                    {
                        var svgRoot = svgs[0];
                        var w = parseFloat(svgRoot.getAttribute('width'));
                        var h = parseFloat(svgRoot.getAttribute('height'));
                        
                        // Check if viewBox attribute already exists
                        var vb = svgRoot.getAttribute('viewBox');
                        
                        if (vb == null || vb.length == 0)
                        {
                            svgRoot.setAttribute('viewBox', '0 0 ' + w + ' ' + h);
                        }
                        // Uses width and height from viewbox for
                        // missing width and height attributes
                        else if (isNaN(w) || isNaN(h))
                        {
                            var tokens = vb.split(' ');
                            
                            if (tokens.length > 3)
                            {
                                w = parseFloat(tokens[2]);
                                h = parseFloat(tokens[3]);
                            }
                        }
                        
                        w = Math.max(1, Math.round(w));
                        h = Math.max(1, Math.round(h));
                        
                        data = 'data:image/svg+xml,' + btoa(mxUtils.getXml(svgs[0], '\n'));
                        graph.insertVertex(null, null, '', x, y, w, h, 'shape=image;image=' + data + ';');
                    }
                }
            }
            else
            {
                var img = new Image();
                
                img.onload = function()
                {
                    var w = Math.max(1, img.width);
                    var h = Math.max(1, img.height);
                    
                    // Converts format of data url to cell style value for use in vertex
                    var semi = data.indexOf(';');
                    
                    if (semi > 0)
                    {
                        data = data.substring(0, semi) + data.substring(data.indexOf(',', semi + 1));
                    }

                    graph.insertVertex(null, null, '', x, y, w, h, 'shape=image;image=' + data + ';');
                };
                
                img.src = data;
            }
        };
        
        reader.readAsDataURL(file);
    }
};

實(shí)現(xiàn)原理

  • 添加drop事件
mxEvent.addListener(container, 'drop', function(evt){})
  • 添加dragover事件
mxEvent.addListener(container, 'dragover', function(evt){})
  • 獲取drop所在位置
var pt = mxUtils.convertPoint(graph.container, mxEvent.getClientX(evt), mxEvent.getClientY(evt));
var tr = graph.view.translate;
var scale = graph.view.scale;
var x = pt.x / scale - tr.x;
var y = pt.y / scale - tr.y;
  • 將圖片轉(zhuǎn)成數(shù)據(jù)地址
var filesArray = event.dataTransfer.files;
        
 for (var i = 0; i < filesArray.length; i++)
{
      handleDrop(graph, filesArray[i], x + i * 10, y + i * 10);
}
  • 對圖片數(shù)據(jù)進(jìn)行操作
函數(shù)handleDrop

解析handleDrop

    1. 判斷文件是否為圖片
    1. 對文件進(jìn)行加載
    1. 判斷文件是否為svg
    • 為svg時(shí)格式化并拆解width和height
    • 判斷viewBox是否存在
    • 插入元素
    1. 文件為圖片
    • 加載圖片
    • 獲取寬高
    • 插入圖片元素

簡化示例

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舍败,一起剝皮案震驚了整個(gè)濱河市斯撮,隨后出現(xiàn)的幾起案子佛舱,更是在濱河造成了極大的恐慌械蹋,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件离熏,死亡現(xiàn)場離奇詭異杰扫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)巍糯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門啸驯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人祟峦,你說我怎么就攤上這事罚斗。” “怎么了宅楞?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵针姿,是天一觀的道長袱吆。 經(jīng)常有香客問我,道長距淫,這世上最難降的妖魔是什么绞绒? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮榕暇,結(jié)果婚禮上蓬衡,老公的妹妹穿的比我還像新娘。我一直安慰自己彤枢,他們只是感情好狰晚,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缴啡,像睡著了一般壁晒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上业栅,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天秒咐,我揣著相機(jī)與錄音,去河邊找鬼碘裕。 笑死携取,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帮孔。 我是一名探鬼主播歹茶,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼你弦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起燎孟,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤禽作,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后揩页,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旷偿,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年爆侣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萍程。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兔仰,死狀恐怖茫负,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乎赴,我是刑警寧澤忍法,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布潮尝,位于F島的核電站,受9級(jí)特大地震影響饿序,放射性物質(zhì)發(fā)生泄漏勉失。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一原探、第九天 我趴在偏房一處隱蔽的房頂上張望乱凿。 院中可真熱鬧,春花似錦咽弦、人聲如沸徒蟆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至美浦,卻和暖如春输莺,著一層夾襖步出監(jiān)牢的瞬間戚哎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國打工嫂用, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留型凳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓嘱函,卻偏偏與公主長得像甘畅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子往弓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,111評(píng)論 1 32
  • ??JavaScript 與 HTML 之間的交互是通過事件實(shí)現(xiàn)的函似。 ??事件槐脏,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,500評(píng)論 1 11
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,223評(píng)論 0 3
  • 一:在制作一個(gè)Web應(yīng)用或Web站點(diǎn)的過程中,你是如何考慮他的UI撇寞、安全性顿天、高性能、SEO蔑担、可維護(hù)性以及技術(shù)因素的...
    Arno_z閱讀 1,176評(píng)論 0 1
  • 不敢再打開你的微博牌废,看到你和她的甜蜜。索性刪掉啤握,眼不見為凈鸟缕。 今天看到一篇文章,說不要陪一個(gè)...
    天衣清音閱讀 175評(píng)論 0 1