Creating a canvas element and setting its width and height attributes using jQuery

后端 未结 6 1744
天涯浪人
天涯浪人 2020-12-16 09:55

I was just trying to do the following in jQuery:

var newCanvas = $(\'\',{\'width\':100,\'height\':200,\'class\':\'radHuh\'});
$(body).append(n         


        
相关标签:
6条回答
  • 2020-12-16 10:17

    Edit: This is slower, see comments below.

    This will likely be faster than any workaround posted here:

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

    Slightly less fancier, but it's esentially the same with less function calls.

    0 讨论(0)
  • 2020-12-16 10:22

    You can use like this

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

    Change the case and try

    0 讨论(0)
  • 2020-12-16 10:25

    I found that this worked the best:

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

    You can also add id, class, or other attributes this way. Because it is not in the style="" attribute, it does not count as CSS and mess up your shapes.

    0 讨论(0)
  • 2020-12-16 10:27

    jQuery try to match each attribute name with a jQuery function name. Matched functions are called.

    width and height are jQuery functions, so your original code is equivalent to this:

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

    width(value) and height(value) functions set CSS width and height of an element.


    Relevant jQuery source code line (https://github.com/jquery/jquery/blob/master/src/attributes.js#L308)

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

    attrFn object definition (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
    },
    
    0 讨论(0)
  • 2020-12-16 10:32

    It seem like changing the case of any letter will prevent jQuery from converting the attribute to a style, so ranganadh probably stumbled on to some unintended flaw in jQuery where it checks the attribute against styles, but not case-insensitive.

    This for instance seems to work aswell ??

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

    The native JS attributes are not converted to styles, and I'd probably go with the below solution to make sure it's "future proof" ( setAttribute() seems to work fine aswell ) :

    var newCanvas = $('<canvas/>');
        newCanvas[0].height = 200;
        newCanvas[0].width = 100;
    
    $('body').append(newCanvas);​​​
    
    0 讨论(0)
  • 2020-12-16 10:38
    var newCanvas = $('<canvas/>',{
                       'class':'radHuh',
                        id: 'myCanvas'                   
                    }).prop({
                        width: 200,
                        height: 200
                    });
    $('#canvas').append(newCanvas);
    

    Proof

    0 讨论(0)
提交回复
热议问题