Почему canvas не работает с селектором jQuery?

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

<сильные > Примеры:

Javascript

    window.onload = function() {
        var canvas = document.getElementById('myCanvas');
        var ctx = canvas.getContext('2d');

        ctx.fillRect(10,50,100,200);
    };

JQuery

   window.onload = function() {
        var canvas = $('#myCanvas');
        var ctx = canvas.getContext('2d');

        ctx.fillRect(10,50,100,200);
    };

Поэтому я понятия не имею, почему это произошло. Есть ли какие-то ограничения?

Ответы

Ответ 1

Проверьте эту обновленную версию скрипта jQuery: http://jsfiddle.net/techfoobar/46VKa/3/

Проблема заключалась в следующем:

var canvas = $('#myCanvas') получает вам расширенный объект jQuery, а не собственный объект элемента DOM, который имеет функции-члены, такие как getContext и т.д. Для этого вам нужно получить элемент canvas с помощью var canvas = $('#myCanvas')[0]

ПРИМЕЧАНИЕ: var canvas = document.getElementById('myCanvas'); эквивалентно var canvas = $('#myCanvas')[0]

Ответ 2

window.onload = function() {
     var canvas = $('#myCanvas');
     var ctx = canvas[0].getContext('2d'); // not canvas.getContext('2d')

     ctx.fillRect(10,50,100,200);
};

в вашем коде, который вы используете canvas.getContext('2d');, но он должен быть canvas[0].getContext('2d');.

Поскольку getContext('2d') работает с элементом DOM, где var canvas = $('#myCanvas'); возвращает jQuery object, но node элемент DOM.

Чтобы извлечь элемент DOM (здесь, элемент canvas) из объекта jQuery, вам нужно использовать canvas[0].


В вашем JavaScript-коде вы используете:

document.getElementById('myCanvas');, который возвращает элемент DOM. Таким образом,

var canvas = $('#myCanvas');

canvas[0] и document.getElementById('myCanvas'); совпадают.


Вы также можете изменить код jQuery следующим образом:

 window.onload = function() {
     var canvas = $('#myCanvas')[0]; // get the element here
     var ctx = canvas.getContext('2d');

     ctx.fillRect(10,50,100,200);
};

Ответ 3

Этот код...

var canvas = $('#myCanvas');
var ctx = canvas.getContext('2d');

Нужно быть...

var canvas = $('#myCanvas');
var ctx = canvas[0].getContext('2d');

Ответ 4

Вы можете использовать функцию get jquery для извлечения элемента canvas.

var canvas = $('#myCanvas').get(0).getContext('2d');