Подтвердить что ты не робот

Создание элемента холста и установка его атрибутов ширины и высоты с помощью jQuery

Я просто пытался сделать следующее в jQuery:

var newCanvas = $('<canvas/>',{'width':100,'height':200,'class':'radHuh'});
$(body).append(newCanvas);

Это работает (вроде) и генерирует следующую разметку:

<canvas style="width:100px; height:200px;" class="radHuh"></canvas>

Как большинство из вас может знать, что элементы canvas не очень похожи на размеры CSS, но ожидают атрибут width и height, поэтому создание этого объекта не удалось для меня.

Я знаю, что могу просто сделать:

var newCanvas = $('<canvas/>',{'class':'radHuh'}).attr({'width':100,'height':200});

вместо этого, но мне было интересно, однако, если есть какой-либо способ сообщить jQuery, что width и height следует рассматривать как атрибуты при создании элемента через $('element',{attributes}), а не как CSS?

4b9b3361

Ответ 1

jQuery пытается сопоставить каждое имя атрибута с именем функции jQuery. Вызываются совпадающие функции.

width и height являются функциями jQuery, поэтому ваш исходный код эквивалентен этому:

  var newCanvas = 
    $('<canvas/>',{'class':'radHuh'})
    .width(100)
    .height(100);

width (value) и высота (значение) набор функций CSS ширину и высоту элемента.


Соответствующая строка исходного кода jQuery (https://github.com/jquery/jquery/blob/master/src/attributes.js#L308)

if ( pass && name in jQuery.attrFn ) {

attrFn определение объекта (https://github.com/jquery/jquery/blob/master/src/attributes.js#L288):

attrFn: {
    val: true,
    css: true,
    html: true,
    text: true,
    data: true,
    width: true,
    height: true,
    offset: true
},

Ответ 2

var newCanvas = $('<canvas/>',{
                   'class':'radHuh',
                    id: 'myCanvas'                   
                }).prop({
                    width: 200,
                    height: 200
                });
$('#canvas').append(newCanvas);

Доказательство

Ответ 3

Вы можете использовать это как

$('<canvas/>',{'class':'radHuh','Width':100,'Height':200});

Измените случай и попробуйте

Ответ 4

Кажется, что изменение случая любой буквы не позволит jQuery преобразовать атрибут в стиль, поэтому ranganadh, вероятно, наткнулся на какой-то непреднамеренный недостаток в jQuery, где он проверяет атрибут на стили, но не учитывает регистр.

Это, например, работает, а?

var newCanvas = $('<canvas/>', {heiGht: 200, widtH: 100});
$('body').append(newCanvas);​​​

Собственные атрибуты JS не преобразуются в стили, и я, вероятно, пойду с приведенным ниже решением, чтобы убедиться, что это "будущее доказательство" (setAttribute(), похоже, отлично работает):

var newCanvas = $('<canvas/>');
    newCanvas[0].height = 200;
    newCanvas[0].width = 100;

$('body').append(newCanvas);​​​

Ответ 5

Я обнаружил, что это сработало лучше всего:

$('<canvas height="50px" width="50px"/>')

Вы также можете добавить id, class или другие атрибуты. Поскольку он не находится в атрибуте style="", он не считается CSS и испортит ваши фигуры.

Ответ 6

Изменить: Это медленнее, см. комментарии ниже.

Это, вероятно, будет быстрее, чем любое обходное решение, опубликованное здесь:

var attributes = {width: 100, height: 100, class: "whatever"};
$('<canvas width="'+attributes.width+'" height="'+attributes.height+'" class="'+attributes.class+'""></canvas>').appendTo(document.body);

Чуть менее привлекательнее, но в то же время он тем же самым при меньших вызовах функций.