使用jQuery创建canvas元素并设置其width和height属性

m90*_*m90 29 html javascript jquery canvas

我只是想在jQuery中执行以下操作:

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

这工作(种类)并生成以下标记:

<canvas style="width:100px; height:200px;" class="radHuh"></canvas>
Run Code Online (Sandbox Code Playgroud)

由于大多数人可能知道canvas元素并不真正喜欢CSS维度但期望宽度和高度属性,因此这个对象创建失败了.

我知道我可以这样做:

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

相反,但我只是想知道,如果有任何方式告诉jQuery,width并且height应该在创建元素时被视为属性$('element',{attributes})而不是CSS?

Jua*_*ado 31

jQuery尝试将每个属性名称与jQuery函数名称匹配.匹配函数被调用.

width并且height是jQuery函数,因此您的原始代码等同于:

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

width(value)height(value)函数设置CSS元素的宽度和高度.


相关的jQuery源代码行(https://github.com/jquery/jquery/blob/master/src/attributes.js#L308)

if ( pass && name in jQuery.attrFn ) {
Run Code Online (Sandbox Code Playgroud)

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
},
Run Code Online (Sandbox Code Playgroud)

  • 虽然这个答案确实有效地设置了样式的高度和宽度,但问题是询问画布高度和宽度属性。`$('&lt;canvas&gt;').width(100).height(100)` 实际上设置了画布的样式。更合适的答案来自@thecodeparadox。使用 `.prop({width: 100, height: 100})` 添加我们正在寻找的直接高度和宽度。 (3认同)

the*_*dox 26

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

证明

  • 这应该是公认的答案.`.prop`为画布元素设置适当的宽度和高度. (5认同)

Ran*_*sam 10

你可以像这样使用

$('<canvas/>',{'class':'radHuh','Width':100,'Height':200});
Run Code Online (Sandbox Code Playgroud)

改变案例并尝试

  • 我猜它正在检查已知的CSS属性! (2认同)

ade*_*neo 8

似乎更改任何字母的大小写将阻止jQuery将属性转换为样式,因此ranganadh可能偶然发现jQuery中的一些意外缺陷,它会根据样式检查属性,但不区分大小写.

例如,这似乎工作?

var newCanvas = $('<canvas/>', {heiGht: 200, widtH: 100});
$('body').append(newCanvas);???
Run Code Online (Sandbox Code Playgroud)

本机JS属性不会转换为样式,我可能会使用以下解决方案来确保它是"未来证明"(setAttribute()似乎工作正常):

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

$('body').append(newCanvas);???
Run Code Online (Sandbox Code Playgroud)