DEMOs

导航页
uuencode [-m] [-o outfile] [infile] remotefile

/**
 * 图片进入drop zone时触发的事件
 */
function dragenter(e) {
  e.preventDefault();

  e.target.classList.add('file-control__drop--hover');
}

/**
 * 图片在drop zone时连续触发的事件
 */
function dragover(e) {
  e.preventDefault();
}

/**
 * 图片移出drop zone时触发的事件
 */
function dragleave(e) {
  e.preventDefault();

  e.target.classList.remove('file-control__drop--hover');
}

/**
 * 添加图片处理
 * @param {File} file - 文件对象
 * @param {Worker} worker - worker对象
 */
function handler(file, worker) {
  document.querySelector('#dataurl').innerHTML = 'loading...';

  worker.postMessage(file);
}

/**
 * 通过drag & drop选取图片
 */
const drop = worker => (e) => {
  e.preventDefault();

  e.target.classList.remove('file-control__drop--hover');
  handler(e.dataTransfer.files[0], worker);
};

/**
 * 通过文件输入框选择图片
 */
const select = worker => (e) => {
  handler(e.target.files[0], worker);

  e.target.value = '';
};

/**
 * 接收worker消息
 */
function msg(e) {
  document.querySelector('#dataurl').innerHTML = e.data;
}

/**
 * worker错误处理
 */
function error(e) {
  document.querySelector('#dataurl').innerHTML = e.message;
}

document.addEventListener('DOMContentLoaded', () => {
  const url = new URL('worker.js', window.location.origin);
  const worker = new Worker(url);

  worker.addEventListener('message', msg, false);
  worker.addEventListener('error', error, false);

  // select file
  const input = document.querySelector('.file-select__input');
  input.addEventListener('change', select(worker), false);

  // Drag & Drop
  const dropbox = document.querySelector('.file-control__drop');

  dropbox.addEventListener('dragenter', dragenter, false);
  dropbox.addEventListener('dragover', dragover, false);
  dropbox.addEventListener('dragleave', dragleave, false);
  dropbox.addEventListener('drop', drop(worker), false);
}, false);