#javascript #jquery #html #html5-canvas
#javascript #jquery #HTML #html5-canvas
Вопрос:
Как и некоторые новички, я пытался изучить jQuery, преобразуя код javascript в jquery. Теперь вот часть кода, которая использует HTML Canvas и позволяет пользователю рисовать и удалять содержимое в Canvas с помощью Jquery:
function init() {
canvas = $('#can');
ctx = canvas.getContext("2d");
w = canvas.width;
h = canvas.height;
canvas.addEventListener("mousemove", function (e) {
findxy('move', e)
}, false);
canvas.addEventListener("mousedown", function (e) {
findxy('down', e)
}, false);
canvas.addEventListener("mouseup", function (e) {
findxy('up', e)
}, false);
canvas.addEventListener("mouseout", function (e) {
findxy('out', e)
}, false);}
Этот код изначально был на Javascript, я только что изменил селекторы, чтобы использовать его как Jquery. Но я получаю ошибку, как в 3-й строке этого кода, как:
Ошибка неперехваченного типа: неопределенный не является функцией
Не могли бы вы объяснить, почему я это получаю. Спасибо
Комментарии:
1. Вы используете функцию элемента DOM для объекта jQuery. Это не очень хорошая ситуация для преобразования Javascript в jQuery…
2. Почему бы не преобразовать и остальные -> jsfiddle.net/5uazu
Ответ №1:
getContext
не является свойством jQuery, поэтому вам необходимо получить доступ к базовому элементу DOM и вызвать его для этого:
ctx = canvas[0].getContext("2d");
Кроме того, соглашение jQuery заключается в использовании $
префикса для переменной, содержащей объект jQuery. width
и height
также являются методами, поэтому должны иметь завершающие скобки. Наконец, если вы хотите использовать jQuery, используйте его и для прикрепления ваших событий:
function init() {
var $canvas = $('#can');
var ctx = $canvas[0].getContext("2d");
var w = $canvas.width();
var h = $canvas.height();
$canvas
.on("mousemove", function(e) { findxy('move', e); })
.on("mousedown", function(e) { findxy('down', e); })
.on("mouseup", function(e) { findxy('up', e); })
.on("mouseout", function(e) { findxy('out', e); });
}
Комментарии:
1. Спасибо. Таким образом, это сработало. Также можете ли вы сказать мне, если что-то не так с приведенным ниже, оно как-то не работает: функция erase() { ctx.clearRect(0, 0, w, h); $(‘#canvasimg’).style.display = «none»; }
2.
ctx
объявлен внутри вашейinit()
функции, поэтому не будет доступен изerase()
. Вам также нужно либо создатьctx
в этой функции, либо сделать ее доступной в рамках обеих функций.3. Я сделал его глобальным. Но, к сожалению, я вызвал несуществующий метод при отладке основной проблемы. Исправлено сейчас. Спасибо за помощь. Теперь код работает просто отлично.
4. @ak0053792 рад помочь 🙂
Ответ №2:
Попробуйте использовать canvas = $('#can')[0];
Ответ №3:
Это связано с тем, что любые селекторы jQuery будут возвращать объект jQuery, а не экземпляр элемента JS. Если селектор возвращает только 1 элемент, он всегда находится в 0
индексе возвращаемого объекта:
canvas = $('#can')[0];
ctx = canvas.getContext("2d");