无法理解此 JavaScript 代码来绘制 HTML 画布? [关闭]

Posted

技术标签:

【中文标题】无法理解此 JavaScript 代码来绘制 HTML 画布? [关闭]【英文标题】:Can't understand this javascript code to paint HTML canvas? [closed] 【发布时间】:2014-07-31 12:11:57 【问题描述】:

如果有人能告诉我这段代码是如何工作的,我将不胜感激 - 我觉得我的头撞到了墙上:

    如何初始化铅笔对象?铅笔不是一个函数吗?怎么能像类一样初始化? 在铅笔功能中,“this”指的是什么? 在铅笔功能中,为什么我需要一个单独的“工具”变量?我尝试删除它并用“this”替换它,但发生的事情是画布不再听mouseup - 你点击画布,即使你的鼠标上升,它也会继续绘制。 ev._x 和 ev._y 是从哪里来的?这部分是画布对象吗?有没有我可以参考的文档? ev_canvas 函数中的“layerX”和“offsetX”究竟是什么? 你能帮我理解最后几行吗?我不知道它们是什么意思,也没有见过这样写的 JS。

谢谢!

var func = tool[ev.type];
if (func) 
    func(ev);

谢谢!

// Initialize variables
var canvas = document.getElementById('imageView');
var context = canvas.getContext('2d');
var tool = new pencil();

function init () 
  // Add listeners
  canvas.addEventListener('mousedown', ev_canvas);
  canvas.addEventListener('mousemove', ev_canvas);
  canvas.addEventListener('mouseup',   ev_canvas);


// Pencil tool
function pencil () 
  var tool = this;
  this.started = false;

  // Mousedown
  this.mousedown = function (ev) 
      context.beginPath();
      context.moveTo(ev._x, ev._y);
      tool.started = true;
  ;

  // Mousemove
  this.mousemove = function (ev) 
    if (tool.started) 
      context.lineTo(ev._x, ev._y);
      context.stroke();
    
  ;

  // Mouseup
  this.mouseup = function (ev) 
    if (tool.started) 
      tool.mousemove(ev);
      tool.started = false;
    
  ;


// Determines mouse position relative to canvas
function ev_canvas (ev) 
  // if (ev.layerX || ev.layerY == 0)  // Firefox
  //   ev._x = ev.layerX;
  //   ev._y = ev.layerY;
  //  else 
  if (ev.offsetX || ev.offsetX == 0)  // Opera
    ev._x = ev.offsetX;
    ev._y = ev.offsetY;
  

  // Call the event handler of the tool.
  var func = tool[ev.type];
  if (func) 
    func(ev);
  


init();

【问题讨论】:

你真的需要一次只专注于一件事。您在这里有 6 个不同的问题,您应该这样对待它们。大部分内容归结为“学习 javascript OO 的基础知识”和“阅读您尝试使用的 API 的文档”。 这太宽泛了。 Stack Overflow 用于提出可以用合理数量的单词回答的问题。 【参考方案1】:

    铅笔是一个类。在 JavaScript 中,类构造函数采用 function MyClass()

    的形式

    this 用于从构造函数或成员函数中指向类本身。因此,this.mouseup() 可以从一个实例(在您的情况下)作为tool.mouseup() 访问

    因为这是您的班级用来跟踪运动的变量。如果你想替换tool,你也必须替换tool.started assignments and evaluations

    ev._xev._y 只是指向 ev.offsetXev.offsetY 的变量,它们是事件对象的标准属性

    不知道layerX应该是什么

    1234563 tool)。

【讨论】:

非常有帮助,谢谢:) 没问题。不过,正如其他人所说,我建议您熟悉基本概念并从那里逐步建立。当你没有扎实的基础时,很难理解事情——相信我,我是从 jQuery 开始的,对 JavaScript 一无所知,我花了 2 年的时间才明白为什么有些事情会以它们的方式工作,因为我总是困惑。 接下来我将研究 JS OOP,并从那里开始构建...有时,Web 开发会诱使您在没有真正了解全局的情况下开始构建东西,因为它是轻量级的...我猜我必须从基础开始!再次感谢您帮助一个菜鸟:)

以上是关于无法理解此 JavaScript 代码来绘制 HTML 画布? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

无法理解 SVM 和 LR 中决策边界的绘制

onCLickListener Javascript 在 IBM worklight 中无法使用此 dojo 代码

无法在画布上绘制垂直虚线

JavaScript: 使用 atan2 来绘制 箭头 和 曲线

无法理解此联系人应用程序 logcat

学习WebGL:第一个代码