Heim Web-Frontend js-Tutorial js implementiert Strg+V zum Einfügen und Hochladen von Bildern (kompatibel mit Chrome, Firefox, IE11)_Javascript-Kenntnisse

js implementiert Strg+V zum Einfügen und Hochladen von Bildern (kompatibel mit Chrome, Firefox, IE11)_Javascript-Kenntnisse

May 16, 2016 pm 03:11 PM
js

Wir haben alle mehr oder weniger verschiedene Rich-Text-Editoren verwendet. Es gibt eine sehr praktische Funktion. Kopieren Sie ein Bild und fügen Sie es in das Textfeld ein. Das ist also praktisch umgesetzt?

Prinzipanalyse
Extraktionsvorgang: copy=>paste=>upload
Während dieses Vorgangs müssen wir nur Folgendes tun: Abhören des Einfügeereignisses => Holen Sie sich den Inhalt in die Zwischenablage => Senden Sie eine Anfrage zum Hochladen
Um das Folgende leicht zu verstehen, müssen Sie zunächst einige Punkte verstehen:

  • Wir können nur Webseitenbilder hochladen (klicken Sie mit der rechten Maustaste auf das Bild auf der Webseite und kopieren Sie es dann) und Screenshots (mit dem Screenshot-Tool aufgenommene Bilder, z. B. qq-Screenshot). Wir können nicht einfügen und hochladen Bilder im System (vom Desktop auf dem Computer, auf die Festplatte kopiert) existieren an völlig unterschiedlichen Orten.
  • Das vom Snipping-Tool aufgenommene Bild unterscheidet sich etwas von dem durch Rechtsklick auf die Webseite kopierten Bild, daher sind auch die Verarbeitungsmethoden unterschiedlich.
  • Beachten Sie das Einfügeereignis: Wenn Sie einen Einfügevorgang ausführen (Rechtsklick Einfügen/Strg+V), löst diese Aktion ein Zwischenablageereignis namens „Einfügen“ aus. Dieses Ereignis wird ausgelöst, wenn Schneiden Die Daten in der Platine werden vor dem Zielelement eingefügt. Wenn das Zielelement (in dem sich der Cursor befindet) ein bearbeitbares Element ist (z. B. ein Div mit dem Attribut contenteditable. Textarea funktioniert nicht), fügt die Einfügeaktion die Daten in der Zwischenablage maximal in das Zielelement ein ; Wenn das Zielelement nicht bearbeitbar ist, werden keine Daten eingefügt, das Einfügeereignis wird jedoch trotzdem ausgelöst. Die Daten sind während des Einfügevorgangs schreibgeschützt. Dieser Absatz wurde aus w3.org_the-paste-action übersetzt.
  • Leider wurde nach dem Testen festgestellt, dass die Implementierung von Einfügeereignissen in Chrome (der neuesten Version), Firefox (der neuesten Version) und ie11 nicht vollständig mit w3c übereinstimmt hat seine eigenen Unterschiede (w3c Der Paste-Standard befindet sich daher nur im Entwurfsstadium).

Der Testcode und die Screenshots lauten wie folgt:

Chrom:

1

2

3

4

5

6

7

8

<textarea ></textarea>

<div contenteditable style="width: 100px;height: 100px; border:1px solid">

</div>

<script>

document.addEventListener('paste', function (event) {

  console.log(event)

})

</script>

Nach dem Login kopieren

  1. event有clipboardData属性,且clipboardData有item属性,clipboardData.item中的元素(对象)有type和kind属性;
  2. 无论在哪进行粘贴,均可触发paste事件;
  3. 在div(未特殊声明时,本文div均指设置了contenteditable属性的div) 里粘贴截图,不显示图片。img.src为base64编码字符串;
  4. 在div里粘贴网页图片,直接显示图片,img.src为图片地址。

firefox:

  1. event有clipboardData属性,clipboardData没有item属性;
  2. 只有在textarea里或者可编辑的div(里才粘贴才触发paste事件;
  3. 在div里粘贴截图,直接显示图片,img.src为base64编码字符串;
  4. 在div里粘贴网页图片,表现同chrome。

ie11:(不截图了,可自行试验,其他浏览器同理<( ̄▽ ̄)/,因为懒...)

  • event没有clipboardData属性;
  • 只在可编辑的div中粘贴才触发paste事件;
  • 在div里粘贴截图,直接显示图片,img.src为base64编码字符串;
  • 在div里粘贴网页图片,表现同chrome。

监听了paste事件,也知道了表现形式,接下来就是如何获取数据了:
chrome有特定的方法,利用clipboardData.items、getAsFile()、new FileReader()等api可以在paste回调函数里获取到剪贴板里图片的base64编码字符串(无论是截图粘贴的还是网页图片复制粘贴的),ie11,firefox没有这样的api,不过依然有办法可以获取,因为数据已经表现在img的src里了,对于截图粘贴的,直接取img的src属性值(base64),对于网页粘贴的,则把地址传给后台,然后根据地址down下来,存在自己的服务器,最后把新地址返回来交给前端展示就ok了。为了保持一致性便于管理,统一将所有情况(截图、网页)中的img的src属性替换为自己存储的地址。因此可以得到以下核心代码(注释很全哦~~):

html展示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<head>

<meta charset="UTF-8">

<title>Document</title>

<style>

body {

  display: -webkit-flex;

  display: flex;   

  -webkit-justify-content: center;

  justify-content: center;

}

#tar_box {

  width: 500px;

  height: 500px;

  border: 1px solid red;

}

</style>

Nach dem Login kopieren

前端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

document.addEventListener('paste', function (event) {

  console.log(event)

  var isChrome = false;

  if ( event.clipboardData || event.originalEvent ) {

    //not for ie11  某些chrome版本使用的是event.originalEvent

    var clipboardData = (event.clipboardData || event.originalEvent.clipboardData);

    if ( clipboardData.items ) {

      // for chrome

      var  items = clipboardData.items,

        len = items.length,

        blob = null;

      isChrome = true;

      //items.length比较有意思,初步判断是根据mime类型来的,即有几种mime类型,长度就是几(待验证)

      //如果粘贴纯文本,那么len=1,如果粘贴网页图片,len=2, items[0].type = 'text/plain', items[1].type = 'image/*'

      //如果使用截图工具粘贴图片,len=1, items[0].type = 'image/png'

      //如果粘贴纯文本+HTML,len=2, items[0].type = 'text/plain', items[1].type = 'text/html'

      // console.log('len:' + len);

      // console.log(items[0]);

      // console.log(items[1]);

      // console.log( 'items[0] kind:', items[0].kind );

      // console.log( 'items[0] MIME type:', items[0].type );

      // console.log( 'items[1] kind:', items[1].kind );

      // console.log( 'items[1] MIME type:', items[1].type );

 

      //阻止默认行为即不让剪贴板内容在div中显示出来

      event.preventDefault();

 

      //在items里找粘贴的image,据上面分析,需要循环 

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

        if (items[i].type.indexOf("image") !== -1) {

          // console.log(items[i]);

          // console.log( typeof (items[i]));

 

          //getAsFile() 此方法只是living standard firefox ie11 并不支持       

          blob = items[i].getAsFile();

        }

      }

      if ( blob !== null ) {

        var reader = new FileReader();

        reader.onload = function (event) {

          // event.target.result 即为图片的Base64编码字符串

          var base64_str = event.target.result

          //可以在这里写上传逻辑 直接将base64编码的字符串上传(可以尝试传入blob对象,看看后台程序能否解析)

          uploadImgFromPaste(base64_str, 'paste', isChrome);

        }

        reader.readAsDataURL(blob);

      }

    } else {

      //for firefox

      setTimeout(function () {

        //设置setTimeout的原因是为了保证图片先插入到div里,然后去获取值

        var imgList = document.querySelectorAll('#tar_box img'),

          len = imgList.length,

          src_str = '',

          i;

        for ( i = 0; i < len; i ++ ) {

          if ( imgList[i].className !== 'my_img' ) {

            //如果是截图那么src_str就是base64 如果是复制的其他网页图片那么src_str就是此图片在别人服务器的地址

            src_str = imgList[i].src;

          }

        }

        uploadImgFromPaste(src_str, 'paste', isChrome);

      }, 1);

    }

  } else {

    //for ie11

    setTimeout(function () {

      var imgList = document.querySelectorAll('#tar_box img'),

        len = imgList.length,

        src_str = '',

        i;

      for ( i = 0; i < len; i ++ ) {

        if ( imgList[i].className !== 'my_img' ) {

          src_str = imgList[i].src;

        }

      }

      uploadImgFromPaste(src_str, 'paste', isChrome);

    }, 1);

  }

})

 

function uploadImgFromPaste (file, type, isChrome) {

  var formData = new FormData();

  formData.append('image', file);

  formData.append('submission-type', type);

 

  var xhr = new XMLHttpRequest();

  xhr.open('POST', '/upload_image_by_paste');

  xhr.onload = function () {

    if ( xhr.readyState === 4 ) {

      if ( xhr.status === 200 ) {

        var data = JSON.parse( xhr.responseText ),

          tarBox = document.getElementById('tar_box');

        if ( isChrome ) {

          var img = document.createElement('img');

          img.className = 'my_img';

          img.src = data.store_path;

          tarBox.appendChild(img);

        } else {

          var imgList = document.querySelectorAll('#tar_box img'),

            len = imgList.length,

            i;

          for ( i = 0; i < len; i ++) {

            if ( imgList[i].className !== 'my_img' ) {

              imgList[i].className = 'my_img';

              imgList[i].src = data.store_path;

            }

          }

        }

 

      } else {

        console.log( xhr.statusText );

      }

    };

  };

  xhr.onerror = function (e) {

    console.log( xhr.statusText );

  }

  xhr.send(formData);

}

Nach dem Login kopieren

用express.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

router.post('/', upload.array(), function (req, res, next) {

//1.获取客户端传来的src_str字符串=>判断是base64还是普通地址=>获取图片类型后缀(jpg/png etc)

//=>如果是base64替换掉"前缀"("data:image\/png;base64," etc)

//2.base64 转为 buffer对象 普通地址则先down下来

//3.写入硬盘(后续可以将地址存入数据库)

//4.返回picture地址

var src_str = req.body.image,

  timestamp = new Date().getTime();

if ( src_str.match(/^data:image\/png;base64,|^data:image\/jpg;base64,|^data:image\/jpg;base64,|^data:image\/bmp;base64,/) ) {

  //处理截图 src_str为base64字符串

  var pic_suffix = src_str.split(';',1)[0].split('/',2)[1],

    base64 = src_str.replace(/^data:image\/png;base64,|^data:image\/jpg;base64,|^data:image\/jpg;base64,|^data:image\/bmp;base64,/, ''),

    buf = new Buffer(base64, 'base64'),

    store_path = 'public/images/test_' + timestamp + '.' + pic_suffix;

 

  fs.writeFile(store_path, buf, function (err) {

    if (err) {

      throw err;

    } else {

      res.json({'store_path': store_path});

    }

  });

} else {// 处理非chrome的网页图片 src_str为图片地址

  var temp_array = src_str.split('.'),

    pic_suffix = temp_array[temp_array.length - 1],

    store_path = 'public/images/test_' + timestamp + '.' + pic_suffix,

    wstream = fs.createWriteStream(store_path);

 

  request(src_str).pipe(wstream);

  wstream.on('finish', function (err) {

    if( err ) {

      throw err;

    } else {

      res.json({"store_path": store_path});

    }

  });

}

});

Nach dem Login kopieren

需要node环境:安装node=>npm intall=>node app.js)

以上就是本文的全部内容,希望对大家的学习有所帮助。

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So verwenden Sie JS und Baidu Maps, um die Kartenschwenkfunktion zu implementieren So verwenden Sie JS und Baidu Maps, um die Kartenschwenkfunktion zu implementieren Nov 21, 2023 am 10:00 AM

So implementieren Sie die Kartenschwenkfunktion mit JS und Baidu Map. Baidu Map ist eine weit verbreitete Kartendienstplattform, die häufig zur Anzeige geografischer Informationen, Positionierung und anderer Funktionen in der Webentwicklung verwendet wird. In diesem Artikel wird erläutert, wie Sie mit JS und der Baidu Map API die Kartenschwenkfunktion implementieren, und es werden spezifische Codebeispiele bereitgestellt. 1. Vorbereitung Bevor Sie die Baidu Map API nutzen können, müssen Sie zunächst ein Entwicklerkonto auf der Baidu Map Open Platform (http://lbsyun.baidu.com/) beantragen und eine Anwendung erstellen. Erstellung abgeschlossen

Empfohlen: Ausgezeichnetes JS-Open-Source-Projekt zur Gesichtserkennung und -erkennung Empfohlen: Ausgezeichnetes JS-Open-Source-Projekt zur Gesichtserkennung und -erkennung Apr 03, 2024 am 11:55 AM

Die Technologie zur Gesichtserkennung und -erkennung ist bereits eine relativ ausgereifte und weit verbreitete Technologie. Derzeit ist JS die am weitesten verbreitete Internetanwendungssprache. Die Implementierung der Gesichtserkennung und -erkennung im Web-Frontend hat im Vergleich zur Back-End-Gesichtserkennung Vor- und Nachteile. Zu den Vorteilen gehören die Reduzierung der Netzwerkinteraktion und die Echtzeiterkennung, was die Wartezeit des Benutzers erheblich verkürzt und das Benutzererlebnis verbessert. Die Nachteile sind: Es ist durch die Größe des Modells begrenzt und auch die Genauigkeit ist begrenzt. Wie implementiert man mit js die Gesichtserkennung im Web? Um die Gesichtserkennung im Web zu implementieren, müssen Sie mit verwandten Programmiersprachen und -technologien wie JavaScript, HTML, CSS, WebRTC usw. vertraut sein. Gleichzeitig müssen Sie auch relevante Technologien für Computer Vision und künstliche Intelligenz beherrschen. Dies ist aufgrund des Designs der Webseite erwähnenswert

So erstellen Sie ein Aktien-Candlestick-Diagramm mit PHP und JS So erstellen Sie ein Aktien-Candlestick-Diagramm mit PHP und JS Dec 17, 2023 am 08:08 AM

So verwenden Sie PHP und JS zum Erstellen eines Aktienkerzendiagramms. Ein Aktienkerzendiagramm ist eine gängige technische Analysegrafik auf dem Aktienmarkt. Es hilft Anlegern, Aktien intuitiver zu verstehen, indem es Daten wie den Eröffnungskurs, den Schlusskurs, den Höchstkurs usw niedrigster Preis der Aktie. In diesem Artikel erfahren Sie anhand spezifischer Codebeispiele, wie Sie Aktienkerzendiagramme mit PHP und JS erstellen. 1. Vorbereitung Bevor wir beginnen, müssen wir die folgende Umgebung vorbereiten: 1. Ein Server, auf dem PHP 2. Ein Browser, der HTML5 und Canvas 3 unterstützt

Wesentliche Tools für die Aktienanalyse: Lernen Sie die Schritte zum Zeichnen von Kerzendiagrammen mit PHP und JS Wesentliche Tools für die Aktienanalyse: Lernen Sie die Schritte zum Zeichnen von Kerzendiagrammen mit PHP und JS Dec 17, 2023 pm 06:55 PM

Wesentliche Tools für die Aktienanalyse: Lernen Sie die Schritte zum Zeichnen von Kerzendiagrammen in PHP und JS. Mit der rasanten Entwicklung des Internets und der Technologie ist der Aktienhandel für viele Anleger zu einer wichtigen Möglichkeit geworden. Die Aktienanalyse ist ein wichtiger Teil der Anlegerentscheidung, und Kerzendiagramme werden häufig in der technischen Analyse verwendet. Wenn Sie lernen, wie man Kerzendiagramme mit PHP und JS zeichnet, erhalten Anleger intuitivere Informationen, die ihnen helfen, bessere Entscheidungen zu treffen. Ein Candlestick-Chart ist ein technischer Chart, der Aktienkurse in Form von Candlesticks anzeigt. Es zeigt den Aktienkurs

So verwenden Sie JS und Baidu Map, um die Funktion zur Verarbeitung von Kartenklickereignissen zu implementieren So verwenden Sie JS und Baidu Map, um die Funktion zur Verarbeitung von Kartenklickereignissen zu implementieren Nov 21, 2023 am 11:11 AM

Überblick über die Verwendung von JS und Baidu Maps zum Implementieren von Funktionen zur Verarbeitung von Kartenklickereignissen: In der Webentwicklung ist es häufig erforderlich, Kartenfunktionen zum Anzeigen des geografischen Standorts und geografischer Informationen zu verwenden. Die Verarbeitung von Klickereignissen auf der Karte ist ein häufig verwendeter und wichtiger Teil der Kartenfunktion. In diesem Artikel wird erläutert, wie Sie mithilfe von JS und der Baidu-Karten-API die Klickereignisverarbeitungsfunktion der Karte implementieren, und es werden spezifische Codebeispiele angegeben. Schritte: Importieren Sie die API-Datei von Baidu Map. Importieren Sie zunächst die Datei von Baidu Map API in die HTML-Datei.

So verwenden Sie JS und Baidu Maps, um die Karten-Heatmap-Funktion zu implementieren So verwenden Sie JS und Baidu Maps, um die Karten-Heatmap-Funktion zu implementieren Nov 21, 2023 am 09:33 AM

Verwendung von JS und Baidu Maps zur Implementierung der Karten-Heatmap-Funktion Einführung: Mit der rasanten Entwicklung des Internets und mobiler Geräte sind Karten zu einem häufigen Anwendungsszenario geworden. Als visuelle Darstellungsmethode können Heatmaps uns helfen, die Verteilung von Daten intuitiver zu verstehen. In diesem Artikel wird die Verwendung von JS und der Baidu Map API zur Implementierung der Karten-Heatmap-Funktion vorgestellt und spezifische Codebeispiele bereitgestellt. Vorbereitung: Bevor Sie beginnen, müssen Sie Folgendes vorbereiten: ein Baidu-Entwicklerkonto, eine Anwendung erstellen und den entsprechenden AP erhalten

PHP- und JS-Entwicklungstipps: Beherrschen Sie die Methode zum Zeichnen von Aktienkerzendiagrammen PHP- und JS-Entwicklungstipps: Beherrschen Sie die Methode zum Zeichnen von Aktienkerzendiagrammen Dec 18, 2023 pm 03:39 PM

Mit der rasanten Entwicklung der Internetfinanzierung sind Aktieninvestitionen für immer mehr Menschen zur Wahl geworden. Im Aktienhandel sind Kerzendiagramme eine häufig verwendete Methode der technischen Analyse. Sie können den sich ändernden Trend der Aktienkurse anzeigen und Anlegern helfen, genauere Entscheidungen zu treffen. In diesem Artikel werden die Entwicklungskompetenzen von PHP und JS vorgestellt, der Leser wird zum Verständnis des Zeichnens von Aktienkerzendiagrammen geführt und es werden spezifische Codebeispiele bereitgestellt. 1. Aktien-Kerzendiagramme verstehen Bevor wir uns mit dem Zeichnen von Aktien-Kerzendiagrammen befassen, müssen wir zunächst verstehen, was ein Kerzendiagramm ist. Candlestick-Charts wurden von den Japanern entwickelt

Die Beziehung zwischen js und vue Die Beziehung zwischen js und vue Mar 11, 2024 pm 05:21 PM

Die Beziehung zwischen js und vue: 1. JS als Eckpfeiler der Webentwicklung; 2. Der Aufstieg von Vue.js als Front-End-Framework; 3. Die komplementäre Beziehung zwischen JS und Vue; Vue.

See all articles