웹 프론트엔드 JS 튜토리얼 Element-ui와 결합된 vue-cli를 사용하여 Cropper.js 기반의 vue를 캡슐화하여 이미지 자르기 구성 요소 기능을 구현합니다.

Element-ui와 결합된 vue-cli를 사용하여 Cropper.js 기반의 vue를 캡슐화하여 이미지 자르기 구성 요소 기능을 구현합니다.

Jun 02, 2018 am 11:14 AM
element-ui javascript

이 글에서는 이미지 자르기 컴포넌트 기능을 구현하기 위해 vue를 캡슐화하기 위해 Cropper.js 기반의 Element-ui와 결합한 vue-cli를 주로 소개합니다. 이 글에서는 필요한 친구들이 참고할 수 있도록 사진과 텍스트로 자세히 소개합니다.

프런트엔드 작업에서는 사진이 필요한 경우가 많습니다. 자르기 장면의 경우 cropper.js는 매우 풍부한 API를 갖춘 탁월한 프런트엔드 플러그인입니다. cropper.js是一款优秀的前端插件,api十分丰富。

本文是在vue-cli项目下封装图片裁剪插件,效果图如下:

话不多说,看步骤吧。

第一步:准备开发环境

cropper.js是基于jquery的,所以要先安装jquery

执行命令:

  npm  install --save-dev jquery cropper

 为webpack配置添加jquery的映射

修改webpack.base.conf.js

이 기사는 vue-cli 프로젝트의 이미지 자르기 플러그인을 요약합니다.

더 이상 고민하지 말고 단계를 살펴보겠습니다.

1단계: 개발 환경 준비

cropper.js는 jquery를 기반으로 하므로 먼저 jquery를 설치해야 합니다.

다음 명령을 실행하세요:

npm install --save-dev jquery Cropper code&gt;<p> </p> webpack 구성에 jquery 매핑 추가<p></p> <code>webpack.base.conf.js 구성을 수정하고 빨간색으로 표시된 줄을 추가합니다

2단계: 새 이미지 만들기 자르기 component

index.vue 콘텐츠:

element-ui를 사용하므로 레이아웃은 element-ui

의 구성 요소를 참조합니다.template:

&lt;template&gt;
 &lt;p class=&quot;modal-dialog modal-lg&quot; :id=&quot;id&quot;&gt;
 &lt;p class=&quot;modal-content&quot;&gt;
  &lt;form class=&quot;avatar-form&quot; enctype=&quot;multipart/form-data&quot; method=&quot;post&quot;&gt;
  &lt;p class=&quot;modal-header&quot;&gt;
  &lt;/p&gt;
  &lt;p class=&quot;modal-body&quot;&gt;
   &lt;p class=&quot;avatar-body&quot;&gt;
   &lt;!-- Upload image and data --&gt;
   &lt;p class=&quot;avatar-upload&quot;&gt;
    &lt;input type=&quot;hidden&quot; class=&quot;avatar-src&quot; name=&quot;avatar_src&quot;&gt;
    &lt;input type=&quot;hidden&quot; class=&quot;avatar-data&quot; name=&quot;ci&quot;&gt;
    &lt;label for=&quot;avatarInput&quot; class=&quot;el-button el-button--primary&quot;&gt;选择图片&lt;/label&gt;
    &lt;input type=&quot;file&quot; class=&quot;avatar-input &quot; style=&quot;visibility: hidden&quot; id=&quot;avatarInput&quot; name=&quot;file&quot;&gt;
   &lt;/p&gt;
   &lt;!-- Crop and preview --&gt;
   &lt;el-row&gt;
    &lt;el-col :span=&quot;18&quot;&gt;
    &lt;p class=&quot;avatar-wrapper&quot;&gt;&lt;/p&gt;
    &lt;/el-col&gt;
    &lt;el-col :span=&quot;6&quot; style=&quot;overflow: hidden;&quot;&gt;
    &lt;p style=&quot;padding-left: 10px&quot;&gt;
     &lt;p class=&quot;avatar-preview preview-lg&quot; &gt;&lt;/p&gt;
     &lt;p class=&quot;avatar-preview avatar-preview-round preview-md&quot;&gt;&lt;/p&gt;
    &lt;!--&lt;p class=&quot;avatar-preview preview-sm&quot;&gt;&lt;/p&gt;--&gt;
    &lt;/p&gt;
    &lt;/el-col&gt;
   &lt;/el-row&gt;
   &lt;el-row class=&quot;avatar-btns&quot;&gt;
    &lt;el-col :span=&quot;18&quot;&gt;
    &lt;el-button-group&gt;
     &lt;button type=&quot;primary&quot; class=&quot;el-button el-button--primary&quot; data-method=&quot;rotate&quot; data-option=&quot;-180&quot; title=&quot;Rotate -180 degrees&quot;&gt;-180deg&lt;/button&gt;
     &lt;button type=&quot;primary&quot; class=&quot;el-button el-button--primary&quot; data-method=&quot;rotate&quot; data-option=&quot;-90&quot; title=&quot;Rotate -90 degrees&quot;&gt;-90deg&lt;/button&gt;
     &lt;button type=&quot;primary&quot; class=&quot;el-button el-button--primary&quot; data-method=&quot;rotate&quot; data-option=&quot;-45&quot; title=&quot;Rotate -45 degrees&quot;&gt;-45deg&lt;/button&gt;
     &lt;button type=&quot;primary&quot; class=&quot;el-button el-button--primary&quot; data-method=&quot;rotate&quot; data-option=&quot;45&quot; title=&quot;Rotate 45 degrees&quot;&gt;45deg&lt;/button&gt;
     &lt;button type=&quot;primary&quot; class=&quot;el-button el-button--primary&quot; data-method=&quot;rotate&quot; data-option=&quot;90&quot; title=&quot;Rotate 90 degrees&quot;&gt;90deg&lt;/button&gt;
     &lt;button type=&quot;primary&quot; class=&quot;el-button el-button--primary&quot; data-method=&quot;rotate&quot; data-option=&quot;180&quot; title=&quot;Rotate 180 degrees&quot;&gt;180deg&lt;/button&gt;
    &lt;/el-button-group&gt;
    &lt;/el-col&gt;
    &lt;el-col :span=&quot;6&quot;&gt;&lt;/el-col&gt;
   &lt;/el-row&gt;
   &lt;el-row&gt;
    &lt;!--&lt;button type=&quot;submit&quot; class=&quot;btn btn-primary btn-block avatar-save&quot;&gt;裁取&lt;/button&gt;--&gt;
   &lt;/el-row&gt;
   &lt;/p&gt;
  &lt;/p&gt;
  &lt;/form&gt;
 &lt;/p&gt;
 &lt;/p&gt;
&lt;/template&gt;
로그인 후 복사
style:
&lt;style rel=&quot;stylesheet/scss&quot; lang=&#39;scss&#39; scoped&gt;
 /*@import &quot;cropper/dist/cropper.css&quot;;*/
 /*!
 * Cropper v3.1.3
 * https://github.com/fengyuanchen/cropper
 *
 * Copyright (c) 2014-2017 Chen Fengyuan
 * Released under the MIT license
 *
 * Date: 2017-10-21T10:03:37.133Z
 */
 .avatar-wrapper{
 width: 100%;
 height: 100%;
 overflow: hidden;
 }
 .cropper-container {
 direction: ltr;
 font-size: 0;
 line-height: 0;
 position: relative;
 -ms-touch-action: none;
 touch-action: none;
 -webkit-user-select: none;
 -moz-user-select: none;
 -ms-user-select: none;
 user-select: none;
 }
 .cropper-container img {/*Avoid margin top issue (Occur only when margin-top &lt;= -height)
 */
 display: block;
 height: 100%;
 image-orientation: 0deg;
 max-height: none !important;
 max-width: none !important;
 min-height: 0 !important;
 min-width: 0 !important;
 width: 100%;
 }
 .cropper-wrap-box,
 .cropper-canvas,
 .cropper-drag-box,
 .cropper-crop-box,
 .cropper-modal {
 bottom: 0;
 left: 0;
 position: absolute;
 right: 0;
 top: 0;
 }
 .cropper-wrap-box,
 .cropper-canvas {
 overflow: hidden;
 }
 .cropper-drag-box {
 background-color: #fff;
 opacity: 0;
 }
 .cropper-modal {
 background-color: #000;
 opacity: .5;
 }
 .cropper-view-box {
 display: block;
 height: 100%;
 outline-color: rgba(51, 153, 255, 0.75);
 outline: 1px solid #39f;
 overflow: hidden;
 width: 100%;
 }
 .cropper-dashed {
 border: 0 dashed #eee;
 display: block;
 opacity: .5;
 position: absolute;
 }
 .cropper-dashed.dashed-h {
 border-bottom-width: 1px;
 border-top-width: 1px;
 height: 33.33333%;
 left: 0;
 top: 33.33333%;
 width: 100%;
 }
 .cropper-dashed.dashed-v {
 border-left-width: 1px;
 border-right-width: 1px;
 height: 100%;
 left: 33.33333%;
 top: 0;
 width: 33.33333%;
 }
 .cropper-center {
 display: block;
 height: 0;
 left: 50%;
 opacity: .75;
 position: absolute;
 top: 50%;
 width: 0;
 }
 .cropper-center:before,
 .cropper-center:after {
 background-color: #eee;
 content: &#39; &#39;;
 display: block;
 position: absolute;
 }
 .cropper-center:before {
 height: 1px;
 left: -3px;
 top: 0;
 width: 7px;
 }
 .cropper-center:after {
 height: 7px;
 left: 0;
 top: -3px;
 width: 1px;
 }
 .cropper-face,
 .cropper-line,
 .cropper-point {
 display: block;
 height: 100%;
 opacity: .1;
 position: absolute;
 width: 100%;
 }
 .cropper-face {
 background-color: #fff;
 left: 0;
 top: 0;
 }
 .cropper-line {
 background-color: #39f;
 }
 .cropper-line.line-e {
 cursor: e-resize;
 right: -3px;
 top: 0;
 width: 5px;
 }
 .cropper-line.line-n {
 cursor: n-resize;
 height: 5px;
 left: 0;
 top: -3px;
 }
 .cropper-line.line-w {
 cursor: w-resize;
 left: -3px;
 top: 0;
 width: 5px;
 }
 .cropper-line.line-s {
 bottom: -3px;
 cursor: s-resize;
 height: 5px;
 left: 0;
 }
 .cropper-point {
 background-color: #39f;
 height: 5px;
 opacity: .75;
 width: 5px;
 }
 .cropper-point.point-e {
 cursor: e-resize;
 margin-top: -3px;
 right: -3px;
 top: 50%;
 }
 .cropper-point.point-n {
 cursor: n-resize;
 left: 50%;
 margin-left: -3px;
 top: -3px;
 }
 .cropper-point.point-w {
 cursor: w-resize;
 left: -3px;
 margin-top: -3px;
 top: 50%;
 }
 .cropper-point.point-s {
 bottom: -3px;
 cursor: s-resize;
 left: 50%;
 margin-left: -3px;
 }
 .cropper-point.point-ne {
 cursor: ne-resize;
 right: -3px;
 top: -3px;
 }
 .cropper-point.point-nw {
 cursor: nw-resize;
 left: -3px;
 top: -3px;
 }
 .cropper-point.point-sw {
 bottom: -3px;
 cursor: sw-resize;
 left: -3px;
 }
 .cropper-point.point-se {
 bottom: -3px;
 cursor: se-resize;
 height: 20px;
 opacity: 1;
 right: -3px;
 width: 20px;
 }
 @media (min-width: 768px) {
 .cropper-point.point-se {
  height: 15px;
  width: 15px;
 }
 }
 @media (min-width: 992px) {
 .cropper-point.point-se {
  height: 10px;
  width: 10px;
 }
 }
 @media (min-width: 1200px) {
 .cropper-point.point-se {
  height: 5px;
  opacity: .75;
  width: 5px;
 }
 }
 .cropper-point.point-se:before {
 background-color: #39f;
 bottom: -50%;
 content: &#39; &#39;;
 display: block;
 height: 200%;
 opacity: 0;
 position: absolute;
 right: -50%;
 width: 200%;
 }
 .cropper-invisible {
 opacity: 0;
 }
 .cropper-bg {
 background-image: url(&#39;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC&#39;);
 }
 .cropper-hide {
 display: block;
 height: 0;
 position: absolute;
 width: 0;
 }
 .cropper-hidden {
 display: none !important;
 }
 .cropper-move {
 cursor: move;
 }
 .cropper-crop {
 cursor: crosshair;
 }
 .cropper-disabled .cropper-drag-box,
 .cropper-disabled .cropper-face,
 .cropper-disabled .cropper-line,
 .cropper-disabled .cropper-point {
 cursor: not-allowed;
 }
 .avatar-view {
 display: block;
 margin: 15% auto 5%;
 height: 220px;
 width: 220px;
 border: 3px solid #fff;
 border-radius: 5px;
 box-shadow: 0 0 5px rgba(0,0,0,.15);
 cursor: pointer;
 overflow: hidden;
 }
 .avatar-view img {
 width: 100%;
 }
 .avatar-body {
 padding-right: 15px;
 padding-left: 15px;
 }
 .avatar-upload {
 overflow: hidden;
 }
 .avatar-upload label {
 display: block;
 float: left;
 clear: left;
 width: 100px;
 }
 .avatar-upload input {
 display: block;
 margin-left: 110px;
 }
 .avatar-alert {
 margin-top: 10px;
 margin-bottom: 10px;
 }
 .avatar-wrapper {
 height: 364px;
 width: 100%;
 margin-top: 15px;
 box-shadow: inset 0 0 5px rgba(0,0,0,.25);
 background-color: #fcfcfc;
 overflow: hidden;
 }
 .avatar-wrapper img {
 display: block;
 height: auto;
 max-width: 100%;
 }
 .avatar-preview {
 float: left;
 margin-top: 15px;
 margin-right: 15px;
 border: 1px solid #eee;
 border-radius: 4px;
 background-color: #fff;
 overflow: hidden;
 }
 .avatar-preview:hover {
 border-color: #ccf;
 box-shadow: 0 0 5px rgba(0,0,0,.15);
 }
 .avatar-preview img {
 width: 100%;
 }
 .avatar-preview-round{
 border-radius: 50%;
 }
 .preview-lg {
 height: 184px;
 width: 184px;
 margin-top: 15px;
 }
 .preview-md {
 height: 100px;
 width: 100px;
 }
 .preview-sm {
 height: 50px;
 width: 50px;
 }
 @media (min-width: 992px) {
 .avatar-preview {
  float: none;
 }
 }
 .avatar-btns {
 margin-top: 30px;
 margin-bottom: 15px;
 }
 .avatar-btns .btn-group {
 margin-right: 5px;
 }
&lt;/style&gt;
로그인 후 복사

script:

&lt;script&gt;
 import $ from &#39;jquery&#39;
 import &#39;cropper/dist/cropper.js&#39;
 export default {
 props:{
  id:String
 },
 data(){
  return {
  $container:null,
  $avatarView:null,
  $avatarModal : null,
  $loading : null,
  $avatarForm : null,
  $avatarUpload : null,
  $avatarSrc : null,
  $avatarData : null,
  $avatarInput : null,
  $avatarSave: null,
  $avatarBtns : null,
  $avatarWrapper : null,
  $avatarPreview: null,
  support: {
  fileList: !!$(&#39;&lt;input type=&quot;file&quot;&gt;&#39;).prop(&#39;files&#39;),
   blobURLs: !!window.URL &amp;&amp; URL.createObjectURL,
   formData: !!window.FormData
  }
  }
 },
 created(){},
 mounted(){
  this.$container = $(&#39;#&#39;+this.id);
  this.$avatarForm = this.$container.find(&#39;.avatar-form&#39;);
  this.$avatarUpload = this.$avatarForm.find(&#39;.avatar-upload&#39;);
  this.$avatarSrc = this.$avatarForm.find(&#39;.avatar-src&#39;);
  this.$avatarData = this.$avatarForm.find(&#39;.avatar-data&#39;);
  this.$avatarInput = this.$avatarForm.find(&#39;.avatar-input&#39;);
  this.$avatarSave = this.$avatarForm.find(&#39;.avatar-save&#39;);
  this.$avatarWrapper = this.$container.find(&#39;.avatar-wrapper&#39;);
  this.$avatarPreview = this.$container.find(&#39;.avatar-preview&#39;);
  this.$avatarBtns = this.$container.find(&#39;.avatar-btns&#39;);
  this.$nextTick(function () {
   this.init();
  })
 },
 methods:{
  init: function () {
  this.support.datauri = this.support.fileList &amp;&amp; this.support.blobURLs;
  this.addListener();
//  this.startCropper();
  },
  addListener: function () {
  this.$avatarInput.on(&#39;change&#39;, $.proxy(this.change, this));
  this.$avatarForm.on(&#39;submit&#39;, $.proxy(this.submit, this));
  this.$avatarBtns.on(&#39;click&#39;, $.proxy(this.rotate, this));
  },
  initPreview: function () {
  var url = this.$avatar.attr(&#39;src&#39;);
  this.$avatarPreview.html(&#39;&lt;img src=&quot;&#39; + url + &#39;&quot;&gt;&#39;);
  },
  initIframe: function () {
  var target = &#39;upload-iframe-&#39; + (new Date()).getTime();
  var $iframe = $(&#39;&lt;iframe&gt;&#39;).attr({
   name: target,
   src: &#39;&#39;
  });
  var _this = this;
  // Ready ifrmae
  $iframe.one(&#39;load&#39;, function () {
   // respond response
   $iframe.on(&#39;load&#39;, function () {
   var data;
   try {
    data = $(this).contents().find(&#39;body&#39;).text();
   } catch (e) {
    console.log(e.message);
   }
   if (data) {
    try {
    data = $.parseJSON(data);
    } catch (e) {
    console.log(e.message);
    }
    _this.submitDone(data);
   } else {
   }
   _this.submitEnd();
   });
  });
  this.$iframe = $iframe;
  this.$avatarForm.attr(&#39;target&#39;, target).after($iframe.hide());
  },
  click:function () {
  this.initPreview();
  },
  change: function () {
  var files;
  var file;
  if (this.support.datauri) {
   files = this.$avatarInput.prop(&#39;files&#39;);
   if (files.length &gt; 0) {
   file = files[0];
   if (this.isImageFile(file)) {
    if (this.url) {
    URL.revokeObjectURL(this.url); // Revoke the old one
    }
    this.url = URL.createObjectURL(file);
    this.startCropper();
   }
   }
  } else {
   file = this.$avatarInput.val();
   if (this.isImageFile(file)) {
   this.syncUpload();
   }
  }
  },
  //裁剪提交
  submit: function () {
  if (!this.$avatarSrc.val() &amp;&amp; !this.$avatarInput.val()) {
   return false;
  }
  if (this.support.formData) {
   this.ajaxUpload();
   return false;
  }
  },  //旋转事件
  rotate: function (e) {
  var data;
  if (this.active) {
   data = $(e.target).data();
   if (data.method) {
   this.$img.cropper(data.method, data.option);
   }
  }
  },
  isImageFile: function (file) {
  if (file.type) {
   return /^image\/\w+$/.test(file.type);
  } else {
   return /\.(jpg|jpeg|png|gif)$/.test(file);
  }
  },
  startCropper: function () {
  var _this = this;
  if (this.active) {
   this.$img.cropper(&#39;replace&#39;, this.url);
  } else {
   this.$img = $(&#39;&lt;img src=&quot;&#39; + this.url + &#39;&quot;&gt;&#39;);
   this.$avatarWrapper.empty().html(this.$img);
   this.$img.cropper({
   viewMode:1,
   aspectRatio: 1,
   preview: this.$avatarPreview,
   restore:false,
   crop: function (e) {
    var json = [
    &#39;{&quot;x&quot;:&#39; + e.x,
    &#39;&quot;y&quot;:&#39; + e.y,
    &#39;&quot;height&quot;:&#39; + e.height,
    &#39;&quot;width&quot;:&#39; + e.width,
    &#39;&quot;rotate&quot;:&#39; + e.rotate + &#39;}&#39;
    ].join();
    //裁图参数存起来
    _this.$avatarData.val(json);
   }
   });
   this.active = true;
  }
  },
  stopCropper: function () {
  if (this.active) {
   this.$img.cropper(&#39;destroy&#39;);
   this.$img.remove();
   this.active = false;
  }
  },
  ajaxUpload: function () {
  var url = &#39;/oss/file/cropping&#39;;
  var data = new FormData(this.$avatarForm[0]);
  var _this = this;
  $.ajax(url, {
   type: &#39;post&#39;,
   data: data,
   dataType: &#39;json&#39;,
   processData: false,
   contentType: false,
   success: function (data,textStatus) {
   _this.submitDone(data);
   if(data.success){
    //将返回的数据传给父组件
    _this.$emit(&#39;cropper-success&#39;,data.data);
    _this.cropDone();
   }
   },
  });
  },
  syncUpload: function () {
  this.$avatarSave.click();
  },
  submitDone: function (data) {
  if ($.isPlainObject(data) &amp;&amp; data.state === 200) {
   if (data.result) {
   this.url = data.result;
   if (this.support.datauri || this.uploaded) {
    this.uploaded = false;
    this.cropDone();
   } else {
    this.uploaded = true;
    this.$avatarSrc.val(this.url);
    this.startCropper();
   }
   this.$avatarInput.val(&#39;&#39;);
   } else if (data.message) {
   }
  } else {
  }
  },
  cropDone: function () {
//  this.$avatarForm.get(0).reset();
//  this.$avatarSrc.prop(&#39;src&#39;, this.url);
   this.stopCropper();
//  this.$container.hide();
  }
 }
 }
&lt;/script&gt;
로그인 후 복사
3단계: 상위 구성 요소 참조 하위 구성 요소

는 element-ui의 el-dialog 구성 요소를 사용합니다. 이때 el-dialog 구성 요소는 상위 구성 요소

상위 구성 요소에 하위 구성 요소를 도입합니다.

import cropper from &#39;@/components/Cropper/index&#39;
로그인 후 복사

template:🎜
&lt;template&gt;
 &lt;p class=&quot;app-main-content&quot; &gt;
 &lt;el-dialog :visible.sync=&quot;showCropper&quot; title=&quot;封面裁图&quot; width=&quot;70%&quot;&gt;
  &lt;cropper id=&quot;avatarCrop&quot; ref=&quot;cropper&quot; @cropper-success=&quot;cropperSuccessHandle&quot;&gt;&lt;/cropper&gt;
  &lt;span slot=&quot;footer&quot; class=&quot;dialog-footer&quot;&gt;
  &lt;el-button @click=&quot;cancelCropper&quot;&gt;取 消&lt;/el-button&gt;
  &lt;el-button type=&quot;primary&quot; @click=&quot;toCropper&quot;&gt;确 定&lt;/el-button&gt;
  &lt;/span&gt;
 &lt;/el-dialog&gt;
 &lt;/p&gt;
로그인 후 복사
🎜script:🎜
import cropper from &#39;@/components/Cropper/index&#39;
export default {
 name: 'addNews',
 components:{
  cropper
 },
 data(){
  return {
  avatarUrl2: null,
  showCropper:false
  }
 },
 methods:{
  //隐藏裁剪框
  cancelCropper(){
  this.showCropper = false
  this.$refs.cropper.cropDone();
  },
  //父组件调用子组件裁剪方法
  toCropper(){
   this.$refs.cropper.submit();
  },
  //子组件裁剪方法成功执行后与父组件通信
  cropperSuccessHandle(data){
   //返回data
  this.showCropper = false
  this.avatarUrl2 = data.url
  }
 }
 }
로그인 후 복사
🎜위 내용은 저입니다. 모두를 위해 정리한 내용이니, 앞으로도 많은 분들께 도움이 되었으면 좋겠습니다. 🎜🎜관련글: 🎜🎜🎜Vue에서 다음 표를 통해 배열을 수정할 때 페이지가 렌더링되지 않는 문제 해결 🎜🎜🎜🎜Vue.js는 이미지의 무작위 드래그 방식을 구현 🎜🎜🎜🎜JS 문자열 제거 예 연속 또는 모든 반복 문자 🎜🎜

위 내용은 Element-ui와 결합된 vue-cli를 사용하여 Cropper.js 기반의 vue를 캡슐화하여 이미지 자르기 구성 요소 기능을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 Dec 17, 2023 pm 02:54 PM

WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법

WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 Dec 17, 2023 pm 05:30 PM

WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술

WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 Dec 17, 2023 am 09:39 AM

WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 Dec 17, 2023 pm 12:09 PM

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법

JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축 JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축 Dec 17, 2023 pm 05:13 PM

JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축

간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 Jan 05, 2024 pm 06:08 PM

간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법

자바스크립트에서 insertBefore를 사용하는 방법 자바스크립트에서 insertBefore를 사용하는 방법 Nov 24, 2023 am 11:56 AM

자바스크립트에서 insertBefore를 사용하는 방법

JavaScript에서 HTTP 상태 코드를 쉽게 얻는 방법 JavaScript에서 HTTP 상태 코드를 쉽게 얻는 방법 Jan 05, 2024 pm 01:37 PM

JavaScript에서 HTTP 상태 코드를 쉽게 얻는 방법

See all articles