Maison interface Web js tutoriel js implémente ctrl+v pour coller et télécharger des images (compatible avec chrome, firefox, ie11)_compétences javascript

js implémente ctrl+v pour coller et télécharger des images (compatible avec chrome, firefox, ie11)_compétences javascript

May 16, 2016 pm 03:11 PM
js

Nous avons tous utilisé plus ou moins divers éditeurs de texte enrichi. Parmi eux, il existe une fonction très pratique : copiez une image et collez-la dans la zone de texte, et l'image sera téléchargée. C'est donc pratique. mis en œuvre ?

Analyse des principes
Opération d'extraction : copier=>coller=>upload
Lors de cette opération, il suffit de : écouter l'événement coller => récupérer le contenu dans le presse-papier => envoyer une demande de téléchargement
Afin de comprendre facilement ce qui suit, vous devez d'abord comprendre quelques points :

  • Nous pouvons uniquement télécharger des images de page Web (cliquez avec le bouton droit sur l'image sur la page Web, puis copiez) et des captures d'écran (images prises par l'outil de capture d'écran, par exemple : capture d'écran qq). images dans le système (du bureau de l'ordinateur, copiées sur le disque dur), elles existent à des endroits complètement différents.
  • L'image capturée par l'outil de capture est quelque peu différente de l'image copiée en cliquant avec le bouton droit sur la page Web, donc les méthodes de traitement sont également différentes.
  • Soyez conscient de l'événement coller : lorsque vous effectuez une opération de collage (clic droit sur coller/ctrl+v), cette action déclenchera un événement du presse-papiers nommé "coller". Cet événement est déclenché lorsque. découpage Les données dans le tableau sont insérées avant l'élément cible. Si l'élément cible (où se trouve le curseur) est un élément modifiable (par exemple : un div avec l'attribut contenteditable défini. Textarea ne fonctionne pas.), l'action Coller insérera les données du presse-papiers dans l'élément cible au maximum. format approprié. Si l'élément cible n'est pas modifiable, les données ne seront pas insérées, mais l'événement coller sera quand même déclenché. Les données sont en lecture seule pendant le processus de collage. Ce paragraphe est traduit de w3.org_the-paste-action.
  • Malheureusement, après tests, il a été constaté que l'implémentation des événements coller dans Chrome (la dernière version), Firefox (la dernière version) et ie11 n'est pas entièrement conforme au w3c, et chacun a ses propres différences (w3c La norme de pâte n'est donc qu'au stade de projet).

Le code de test et les captures d'écran sont les suivants :

chrome :

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>

Copier après la connexion

  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>

Copier après la connexion

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

}

Copier après la connexion

用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});

    }

  });

}

});

Copier après la connexion

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

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

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser JS et Baidu Maps pour implémenter la fonction Map Pan Comment utiliser JS et Baidu Maps pour implémenter la fonction Map Pan Nov 21, 2023 am 10:00 AM

Comment utiliser JS et Baidu Map pour implémenter la fonction de panoramique de la carte Baidu Map est une plate-forme de services cartographiques largement utilisée, souvent utilisée pour afficher des informations géographiques, le positionnement et d'autres fonctions dans le développement Web. Cet article explique comment utiliser JS et l'API Baidu Map pour implémenter la fonction de panoramique de la carte et fournit des exemples de code spécifiques. 1. Préparation Avant d'utiliser l'API Baidu Map, vous devez d'abord demander un compte de développeur sur Baidu Map Open Platform (http://lbsyun.baidu.com/) et créer une application. Création terminée

Recommandé : Excellent projet de détection et de reconnaissance des visages open source JS Recommandé : Excellent projet de détection et de reconnaissance des visages open source JS Apr 03, 2024 am 11:55 AM

La technologie de détection et de reconnaissance des visages est déjà une technologie relativement mature et largement utilisée. Actuellement, le langage d'application Internet le plus utilisé est JS. La mise en œuvre de la détection et de la reconnaissance faciale sur le front-end Web présente des avantages et des inconvénients par rapport à la reconnaissance faciale back-end. Les avantages incluent la réduction de l'interaction réseau et de la reconnaissance en temps réel, ce qui réduit considérablement le temps d'attente des utilisateurs et améliore l'expérience utilisateur. Les inconvénients sont les suivants : il est limité par la taille du modèle et la précision est également limitée ; Comment utiliser js pour implémenter la détection de visage sur le web ? Afin de mettre en œuvre la reconnaissance faciale sur le Web, vous devez être familier avec les langages et technologies de programmation associés, tels que JavaScript, HTML, CSS, WebRTC, etc. Dans le même temps, vous devez également maîtriser les technologies pertinentes de vision par ordinateur et d’intelligence artificielle. Il convient de noter qu'en raison de la conception du côté Web

Comment créer un graphique en chandeliers boursiers en utilisant PHP et JS Comment créer un graphique en chandeliers boursiers en utilisant PHP et JS Dec 17, 2023 am 08:08 AM

Comment utiliser PHP et JS pour créer un graphique en bougies boursières. Un graphique en bougies boursières est un graphique d'analyse technique courant sur le marché boursier. Il aide les investisseurs à comprendre les actions de manière plus intuitive en dessinant des données telles que le prix d'ouverture, le prix de clôture, le prix le plus élevé et le prix le plus élevé. prix le plus bas des fluctuations du prix des actions. Cet article vous apprendra comment créer des graphiques en bougies boursières en utilisant PHP et JS, avec des exemples de code spécifiques. 1. Préparation Avant de commencer, nous devons préparer l'environnement suivant : 1. Un serveur exécutant PHP 2. Un navigateur prenant en charge HTML5 et Canvas 3.

Outils essentiels pour l'analyse boursière : découvrez les étapes pour dessiner des graphiques en bougies avec PHP et JS Outils essentiels pour l'analyse boursière : découvrez les étapes pour dessiner des graphiques en bougies avec PHP et JS Dec 17, 2023 pm 06:55 PM

Outils essentiels pour l'analyse boursière : découvrez les étapes pour dessiner des graphiques en bougies en PHP et JS. Des exemples de code spécifiques sont nécessaires. Avec le développement rapide d'Internet et de la technologie, le trading d'actions est devenu l'un des moyens importants pour de nombreux investisseurs. L'analyse boursière est une partie importante de la prise de décision des investisseurs, et les graphiques en bougies sont largement utilisés dans l'analyse technique. Apprendre à dessiner des graphiques en bougies à l'aide de PHP et JS fournira aux investisseurs des informations plus intuitives pour les aider à prendre de meilleures décisions. Un graphique en chandeliers est un graphique technique qui affiche les cours des actions sous forme de chandeliers. Il montre le cours de l'action

Comment utiliser JS et Baidu Map pour implémenter la fonction de traitement des événements de clic sur la carte Comment utiliser JS et Baidu Map pour implémenter la fonction de traitement des événements de clic sur la carte Nov 21, 2023 am 11:11 AM

Présentation de la façon d'utiliser JS et Baidu Maps pour implémenter les fonctions de traitement des événements de clic sur la carte : dans le développement Web, il est souvent nécessaire d'utiliser des fonctions de carte pour afficher la localisation géographique et les informations géographiques. Le traitement des événements de clic sur la carte est une partie couramment utilisée et importante de la fonction de carte. Cet article explique comment utiliser JS et l'API Baidu Map pour implémenter la fonction de traitement des événements de clic de la carte et donne des exemples de code spécifiques. Étapes : Importez le fichier API de Baidu Map. Tout d’abord, importez le fichier de l’API Baidu Map dans le fichier HTML. Cela peut être réalisé via le code suivant :

Comment utiliser JS et Baidu Maps pour implémenter la fonction de carte thermique de carte Comment utiliser JS et Baidu Maps pour implémenter la fonction de carte thermique de carte Nov 21, 2023 am 09:33 AM

Comment utiliser JS et Baidu Maps pour implémenter la fonction de carte thermique de carte Introduction : Avec le développement rapide d'Internet et des appareils mobiles, les cartes sont devenues un scénario d'application courant. En tant que méthode d'affichage visuel, les cartes thermiques peuvent nous aider à comprendre la distribution des données de manière plus intuitive. Cet article explique comment utiliser JS et l'API Baidu Map pour implémenter la fonction de carte thermique de carte et fournit des exemples de code spécifiques. Travail de préparation : Avant de commencer, vous devez préparer les éléments suivants : un compte développeur Baidu, créer une application et obtenir l'AP correspondant

Conseils de développement PHP et JS : maîtrisez la méthode de création de graphiques en bougies boursières Conseils de développement PHP et JS : maîtrisez la méthode de création de graphiques en bougies boursières Dec 18, 2023 pm 03:39 PM

Avec le développement rapide de la finance sur Internet, l'investissement en actions est devenu le choix de plus en plus de personnes. Dans le trading d'actions, les graphiques en bougies sont une méthode d'analyse technique couramment utilisée. Ils peuvent montrer l'évolution des cours des actions et aider les investisseurs à prendre des décisions plus précises. Cet article présentera les compétences de développement de PHP et JS, amènera les lecteurs à comprendre comment dessiner des graphiques en bougies boursières et fournira des exemples de code spécifiques. 1. Comprendre les graphiques en bougies boursières Avant de présenter comment dessiner des graphiques en bougies boursières, nous devons d'abord comprendre ce qu'est un graphique en bougies. Les graphiques en chandeliers ont été développés par les Japonais

La relation entre js et vue La relation entre js et vue Mar 11, 2024 pm 05:21 PM

La relation entre js et vue : 1. JS comme pierre angulaire du développement Web ; 2. L'essor de Vue.js en tant que framework front-end ; 3. La relation complémentaire entre JS et Vue ; Vue.

See all articles