Я добавляю прямоугольник, щелкнув внутри холста, чтобы начать писать текст ...
ПРОБЛЕМА
как только я начну писать текст
прямоугольник исчезает. Я думаю, проблема в том, что я не передаю в функцию никакого значения нового прямоугольника .... как бы мне это решить? или, возможно, активировать прямоугольник, установленный по умолчанию, после того, как я нажму на 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;" />


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Каждый раз, когда вы вызываете 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;" />да, вы бы просто назвали это так ctx.fillRect(20, height + offset, 300, 50);
как мне начать холст очистить? и добавить прямоугольник только после щелчка?
Вы можете использовать ctx.clearRect(), чтобы очистить область холста.
Каждый раз, когда происходит изменение каких-либо данных, вам нужно будет перерисовывать весь холст.
не могли бы вы отредактировать свой ответ, используя эту новую информацию, пожалуйста?
Я обновил ответ, это то, что вы ищете?
Я всегда использую прямоугольник, который уже находится в функции
хорошо. что, если я хочу добавить еще один прямоугольник ниже? возможно
fillrect(20,140, .. кроме того, что предполагается, что холст пуст, без зеленого прямоугольника внутри