Добавленный щелчком прямоугольник исчезает в скрипте холста html5

Я добавляю прямоугольник, щелкнув внутри холста, чтобы начать писать текст ...

ПРОБЛЕМА

как только я начну писать текст прямоугольник исчезает. Я думаю, проблема в том, что я не передаю в функцию никакого значения нового прямоугольника .... как бы мне это решить? или, возможно, активировать прямоугольник, установленный по умолчанию, после того, как я нажму на add text

https://jsfiddle.net/xpvt214o/26337/

ПРИМЕР отредактирован, чтобы добавить только основную проблему.

$("#Add").on("click", function() {
  $("#first_text").show();
  $("#resetInput").show();
  var rheight = 20;
  ctx.fillStyle = '#E1FFC7';
  ctx.fillRect(20, rheight, 300, 50);

});





var canvas = document.getElementById('cv');
ctx = canvas.getContext('2d');


// core drawing function
var drawMe = function() {
  var img = document.getElementById('bg');
  ctx.drawImage(img, 0, 0, 364, 662, 0, 0, 364, 662);
  ctx.fillStyle = '#E1FFC7';


  text = $("#first_text").val();
  ctx.fillStyle = 'black';
  ctx.fillText(text, 20, 20)


}




$("#resetInput").on("click", function() {

  $("#first_text").val("");
  drawMe();
});

$("#first_text").on("change keypress keyup keydown ", function() {


  drawMe();
});





drawMe();
canvas {
  margin: 40px;
}

#first_text,
#resetInput {
  display: none;
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<p>
  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
  in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
</p>
<button id = "Add">add text</button>
<br/>

<input type = "text" id = "first_text"> <button id = "resetInput">reset</button>


<br>
<canvas id = "cv"></canvas>
<img id = "bg" src = "https://cloud.githubusercontent.com/assets/398893/15136779/4e765036-1639-11e6-9201-67e728e86f39.jpg" style = "opacity:0;" />
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
16
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Каждый раз, когда вы вызываете drawMe с клавиатуры, вы рисуете поверх того, что уже есть, таким образом, рисуя поверх зеленого поля.

Вам нужно добавить это после того, как вы установили свой цвет в функции drawMe:

ctx.fillRect(20, 20, 300, 50);

Вот рабочий пример:

$("#Add").on("click", function() {
  $("#first_text").show();
  $("#resetInput").show();
  var rheight = 20;
  ctx.fillStyle = '#E1FFC7';
  ctx.fillRect(20, rheight, 300, 50);
});

var canvas = document.getElementById('cv');
ctx = canvas.getContext('2d');

// core drawing function
var drawMe = function() {
  var img = document.getElementById('bg');
  ctx.drawImage(img, 0, 0, 364, 662, 0, 0, 364, 662);
  ctx.fillStyle = '#E1FFC7';
  if ($('#first_text:visible').length > 0) {
    ctx.fillRect(20, 20, 300, 50);
  }

  text = $("#first_text").val();
  ctx.fillStyle = 'black';
  ctx.fillText(text, 20, 20)
}

$("#resetInput").on("click", function() {
  $("#first_text").val("");
  drawMe();
});

$("#first_text").on("change keypress keyup keydown ", function() {
  drawMe();
});

drawMe();
canvas {
  margin: 40px;
}

#first_text,
#resetInput {
  display: none;
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<p>
  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
  in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
</p>
<button id = "Add">add text</button>
<br/>

<input type = "text" id = "first_text"> <button id = "resetInput">reset</button>


<br>
<canvas id = "cv"></canvas>
<img id = "bg" src = "https://cloud.githubusercontent.com/assets/398893/15136779/4e765036-1639-11e6-9201-67e728e86f39.jpg" style = "opacity:0;" />

хорошо. что, если я хочу добавить еще один прямоугольник ниже? возможно fillrect(20,140, .. кроме того, что предполагается, что холст пуст, без зеленого прямоугольника внутри

Dan 02.04.2018 21:29

да, вы бы просто назвали это так ctx.fillRect(20, height + offset, 300, 50);

Get Off My Lawn 02.04.2018 21:30

как мне начать холст очистить? и добавить прямоугольник только после щелчка?

Dan 02.04.2018 21:34

Вы можете использовать ctx.clearRect(), чтобы очистить область холста.

Get Off My Lawn 02.04.2018 21:46

Каждый раз, когда происходит изменение каких-либо данных, вам нужно будет перерисовывать весь холст.

Get Off My Lawn 02.04.2018 21:48

не могли бы вы отредактировать свой ответ, используя эту новую информацию, пожалуйста?

Dan 02.04.2018 21:51

Я обновил ответ, это то, что вы ищете?

Get Off My Lawn 02.04.2018 21:57

Я всегда использую прямоугольник, который уже находится в функции

Dan 02.04.2018 22:06

Другие вопросы по теме