基于HTML5的Drag and Drop生成图片Base64信息

直击现场

基于HTML5的Drag and Drop生成图片Base64信息

发表于4个月前(2014-12-19 00:58)   阅读(103) | 评论(0) 11人收藏此文章, 我要收藏

赞0

慕课网,程序员升职加薪神器,点击免费学习

摘要 HTML5的Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过Drag and Drop生成图片的Base64的字符串信息。 使用Base64方式的图片有诸多好处,可将多个图片信息整合到单个js文件避免多次http请求,可以避免WebGL例子跨域访问的安全限制无法本地文件运行等好处,当然弊端也不少例如不能有效利用浏览器图片缓存机制等。使用HT for Web的朋友会发现HT的例子很多注册图片都采用Base64的方式,这主要是为了方便用户直接本地文件打开HT的...

html5 Base64 draganddrop 拓扑

HTML5的Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过Drag and Drop生成图片的Base64的字符串信息。

使用Base64方式的图片有诸多好处,可将多个图片信息整合到单个js文件避免多次http请求,可以避免WebGL例子跨域访问的安全限制无法本地文件运行等好处,当然弊端也不少例如不能有效利用浏览器图片缓存机制等。使用HT for Web的朋友会发现HT的例子很多注册图片都采用Base64的方式,这主要是为了方便用户直接本地文件打开HT的手册即可操作浏览,无需构建web服务器发布进行访问,用户常问然后将图片转出Base64信息,我们使用的就是本文介绍的小工具。

该工具由一个列表、一个拓扑图和一个文本框三部分组成,用户任意拖拽本地多图片文件到任意页面部分,HT自动将图片信息生成对应的DataModel数据模型,列表显示图片效果、名称和宽高信息,拓扑显示图片、修改时间和文件大小等信息,文本框生成对应注册到htDefault.setImage函数的代码片段,用户直接可以将文本框内的代码拷贝到自己的工程的js文件进行使用。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

function init(){                                                                 

    dataModel = new ht.DataModel();                                                                             

    listView = new ht.widget.ListView(dataModel); 

    graphView = new ht.graph.GraphView(dataModel);

    splitView = new ht.widget.SplitView(listView, graphView);

    textArea = new ht.widget.TextArea(); 

    textArea.getElement().style.wordWrap = ‘normal‘;

    textArea.getElement().style.color = ‘#777‘;

    textArea.setEditable(false);

    new ht.widget.SplitView(splitView, textArea, ‘v‘).addToDOM();    

    new ht.layout.ForceLayout(graphView).start();                            

    listView.setRowHeight(50);   

    listView.drawRowBackground = function(g, data, selected, x, y, width, height){

        if(this.isSelected(data)){

            g.fillStyle = ‘#87A6CB‘;

        }

        else if(this.getRowIndex(data) % 2 === 0){

            g.fillStyle = ‘#F1F4F7‘;

        }

        else{

            g.fillStyle = ‘#FAFAFA‘;

        }

        g.beginPath();

        g.rect(x, y, width, height);

        g.fill();

    };

    ht.Default.setImage(‘icon‘, {

        width: 50,

        height: 50,

        clip: function(g, width, height) {   

            g.beginPath();

            g.arc(width/2, height/2, Math.min(width, height)/2-3, 0, Math.PI * 2, true);

            g.clip();                        

        },

        comps: [

            {

                type: ‘image‘,

                stretch: ‘uniform‘,

                rect: [0, 0, 50, 50],

                name: {func: ‘getImage‘}

            }

        ]

    });

    listView.setIndent(60);  

    listView.setVisibleFunc(function(data){

        return data instanceof ht.Node;

    });

    listView.getIcon = function(data){

        return ‘icon‘;

    };                                  

    listView.getLabel = function(data){

        var name = data.getName(name);

        var image = ht.Default.getImage(name);

        if(image){

            name += ‘ ( ‘ + image.width + ‘ X ‘ + image.height + ‘ )‘;

        }

        return name;

    };

    window.addEventListener("dragenter", dragEnter, false);

    window.addEventListener("dragexit", dragExit, false);

    window.addEventListener("dragover", dragOver, false);

    window.addEventListener("drop", drop, false);                                             

}

function dragEnter(evt) {

    evt.stopPropagation();

    evt.preventDefault();

}

function dragExit(evt) {

    evt.stopPropagation();

    evt.preventDefault();

}

function dragOver(evt) {

    evt.stopPropagation();

    evt.preventDefault();

}

function drop(evt) {

    evt.stopPropagation();

    evt.preventDefault();

    dataModel.clear();

    textArea.setText("");

    lastNode = null;                

    var files = evt.dataTransfer.files;

    var count = files.length;                

    for (var i = 0; i < count; i++) {

        var file = files[i];

        var reader = new FileReader();

        reader.onloadend = handleReaderLoadEnd;

        reader.file = file;

        reader.readAsDataURL(file);

    }

}

function handleReaderLoadEnd(evt) {

    var reader = evt.target;  

    var file = reader.file;

    var name = file.name;

    name = name.substr(0, name.length - 4);

    var text = "ht.Default.setImage(‘" + name + "‘, ‘" + reader.result + "‘);\n";

    textArea.setText(textArea.getText() + text);                 

    ht.Default.setImage(name, reader.result); 

    var note = ‘Date: ‘ + file.lastModifiedDate.toLocaleString() + ‘\n‘

            ‘Name: ‘ + file.name + ‘\n‘

            ‘Size: ‘ + file.size + ‘\n‘

            ‘Type: ‘ + file.type;

    var node = new ht.Node();

    node.setName(name);

    node.setImage(name);

    node.s({

        ‘note‘: note,

        ‘note.position‘: 3

    });

    dataModel.add(node);

    if(lastNode){

        var edge = new ht.Edge(lastNode, node);

        dataModel.add(edge);                    

    }

    lastNode = node;                

}

该代码主要对window添加了dragenter、dragexit、dragover和drop的拖拽处理,大部分都是通过e.stopPropagation();和evt.preventDefault();阻止默认行为,我们仅需在最后的drop事件中通过e.dataTransfer.files得到所有当前拖拽文件信息,构建FileReader进行加载,然后对加载的信息构建对应DataModel中的ht.Node对象和属性就完事了。

最后代码中还有几处使用HT for Web的技术细节值得提到,左侧list列表通过自定义矢量图标,并且在定义矢量时采用了clip的功能,这样列表的图标就会显示成clip裁剪后的圆形效果。重载了listView.drawRowBackground函数,实现隔行变色的列表效果。重载了listView.getLabel显示了更多的动态文本信息。通过listView.setVisibleFunc过滤不显示连线信息在列表中。

以下为该Base64转换工具的操作效果视频和抓图供参考:http://v.youku.com/v_show/id_XODUxNzY3OTA4.html

时间: 2024-10-26 00:05:02

基于HTML5的Drag and Drop生成图片Base64信息的相关文章

通过HTML5的Drag and Drop生成拓扑图片Base64信息

HTML5 原生的 Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过Drag and Drop生成图片的Base64的字符串信息. 使用Base64方式的图片有诸多好处,可将多个图片信息整合到单个js文件避免多次http请求,可以避免WebGL例子跨域访问的安全限制无法本地文件运行等好处,当然弊端也不少例如不能有效利用浏览器图片缓存机制等.使用HT for Web的

使用HTML5本地 Drag和Drop API(native API)

人人都爱使用方便..具有互动的用户界面.并且随着智能手机的引入,用户的期望瞬间高了一大截.他们希望网站一目了然,交互动作尽人皆知.总之,他们希望你的网站使用起来超级简单. 让你的用户能在你的网站实现拖拽之类的操作吧,这会让你的网站更加具有交互性.因为人们都知道如何把东西从X拖到Y位置,知道如果把A拖到B前面的话,那么A就会先显示出来. 处理拖动,拖入之类的操作以前总是javascript的事情,开发者们早先也有自己的方法构建交互动作或者使用预制解决方案.随着HTML5 Drag和Drop API

HTML5 拖放---drag和drop

拖放四步走:第一步:设置元素可拖放,即把 draggable属性设置为 true:  例:<div id="div" draggable="true"></div>第二部:拖动什么--ondragstrat和setData()  例:function drag(ev){         ev.dataTransfer.setData("Text",ev.target.id);      }上例中,数据类型是“Text”,值

HTML5 CSS3 专题 : 拖放 (Drag and Drop)

本来准备写一个支持多图片拖拽上传的例子,但是为了更好的理解,先介绍一下HTML5的拖放. 拖放(Drag 和 drop)是 HTML5 标准的组成部分. 浏览器支持 Internet Explorer 9.Firefox.Opera 12.Chrome 以及 Safari 5 支持拖放. 被拖元素,dragElement : 1.添加事件:ondragstart 2.添加属性:dragable 放置元素,dropElement: 1.添加事件:ondargenter , ondragover ,

HTML5 拖放(Drag 和 Drop)功能开发——基础实战

随着HTML5的普及度越来越高,现在写代码也遇到一些了,经过同事的点播开展了一次Dojo活动用以技术交流,我也乘此机会将HTML5的拖放功能整理了一下. 简介 拖拽(Drag/Drop)是个非常普遍的功能.在生活中,拖放物品其实是相当常见的一个动作.标榜“互联网生活尖凿狮”的程序猿也在一直试图用鼠标模拟出“手”的操作,用来给用户以更好的体验,你可以抓住一个对象,并且拖动到你想放置的区域.很多javascript都类似实现了相关的功能,例如,jQueryUI的draganddrop组件,比如<JS

『HTML5梦幻之旅』 - 仿Qt演示样例Drag and Drop Robot(换装机器人)

起源 在Qt的演示样例中看到了一个有趣的demo.截图例如以下: 这个demo的名字叫Drag and Drop Robot,简单概括而言,在这个demo中,能够把机器人四周的颜色拖动到机器人的各个部位,比方说头.臂,身躯等.然后这个部位就会变成相应的颜色.相似于换装小游戏. 上图就是经过愚下的拖动颜色使其简略换装后的样子. 当然,拖动颜色使部件变色的功能并不难实现,关键在于这个机器人是动态的,我们要研究的就恰恰是这个机器人动画是怎么做出来的. 光凭两张图片我们无法知道这个动画究竟是什么样子的,

『HTML5梦幻之旅』 - 仿Qt示例Drag and Drop Robot(换装机器人)

起源 在Qt的示例中看到了一个有趣的demo,截图如下: 这个demo的名字叫Drag and Drop Robot,简单概括而言,在这个demo中,可以把机器人四周的颜色拖动到机器人的各个部位,比如说头,臂,身躯等,然后这个部位就会变成相应的颜色,类似于换装小游戏. 上图就是经过愚下的拖动颜色使其简略换装后的样子. 当然,拖动颜色使部件变色的功能并不难实现,关键在于这个机器人是动态的,我们要研究的就恰恰是这个机器人动画是怎么做出来的. 光凭两张图片我们无法知道这个动画到底是什么样子的,大家可以

基于HTML5的可预览多图片Ajax上传

一.关于图片上传什么什么的 在XHTML的时代,我们使用HTML file控件上传图片一次只能上传一张.要一次上传多图,做法是借助于flash.例如swfupload.js.可惜,使用复杂的点,比如flash文件需与页面同父文件夹,JavaScript文件大小也很可观. 我之前曾翻译编辑过一篇“Ajax Upload多文件上传插件”的文章,此插件的亮点是使用隐藏的iframe框架页面模拟ajax上传,但是,实际上,还是一次只能上传1张图片,可以多次上传而已. HTML5是个好东东,其中之一就是支

基于 HTML5 的数据存储

以前想做个静态网页APP.最初的思路是用本地文件存储数据,后来发现在手机上运行时,文件无法找到. 经过了长达几个月的搜索(实际也就几天),没有找到合适的方法. 就在绝望的时候,无意间搜到基于HTML5的各种保存数据的方法.在此简单与大家分享一下. 前四种是从http://www.hightopo.com/blog/344.html截取. Cookie 最古老的存储方式为Cookie,这种存储方式存储内容很有限,只适合做简单信息存储,存取接口设计得极其反人类,为了介绍HTML5存储方案的完整性我顺