2012-05-03 8 views
27

Stavo solo cercando di fare quanto segue in jQuery:Creazione di un elemento canvas e impostando la larghezza e l'altezza attributi utilizzando jQuery

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

Questo è il lavoro (tipo di) e genera il seguente markup:

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

Come molti di voi potrebbero sapere che gli elementi canvas non amano le dimensioni CSS ma prevedono un attributo larghezza e altezza, quindi la creazione di questo oggetto non è riuscita.

so ho potuto solo fare:

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

invece, ma mi stavo chiedendo comunque se non v'è alcun modo di dire jQuery che width e height devono essere trattati come attributi quando si crea l'elemento tramite $('element',{attributes}) e non come CSS?

+1

Per essere chiari, '' elementi "come" larghezza e altezza CSS vanno bene; come con un '' HTML, l'impostazione delle dimensioni di visualizzazione tramite CSS ridimensiona/riduce una bitmap. Le proprietà/attributi di altezza e larghezza di ' 'sono come cambiare la dimensione di un'immagine in Photoshop, impostando il numero effettivo di pixel nell'immagine sorgente. – Phrogz

+0

@Phrogz è per questo che stavo scrivendo "non mi piace molto" ... In ogni caso, suppongo che il 99% degli elementi canvas abbia bisogno di questi attributi poiché non corrispondono al rapporto predefinito e così via. – m90

+1

@Phrogz, sì, ok ma per essere chiari, avrai bisogno di un po 'di semplice matematica per ridimensionarlo correttamente in un semplice css. Altrimenti il ​​'canvas' agirà (come hai detto) come un normale tag' img' ma sarà ** NON scalabile proporzionalmente ** e la maggior parte degli utenti (come hanno) ha problemi a capire veramente - esattamente questa quasi/similarità. –

risposta

29

jQuery cercare di abbinare ciascun attributo Name con un nome di funzione jQuery. Vengono chiamate le funzioni corrispondenti.

width e height sono funzioni jQuery, in modo che il codice originale è equivalente a questo:

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

width(value) e height(value) funzioni impostate CSS larghezza e l'altezza di un elemento.


Rilevante linea jQuery codice sorgente (https://github.com/jquery/jquery/blob/master/src/attributes.js#L308)

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

attrFn definizione dell'oggetto (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

Mentre questa risposta imposta in modo efficace l'altezza e la larghezza dello stile, la domanda si interroga sugli attributi di altezza e larghezza della tela. '$ ('') .width (100) .height (100)' imposta effettivamente lo stile della tela. La risposta più appropriata è da @thecodeparadox. Usando '.prop ({width: 100, height: 100})' aggiunge l'altezza e la larghezza dirette che stiamo cercando. –

10

È possibile utilizzare come questo

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

Cambiare il caso e cercare

+0

È interessante. Sta succedendo per progettazione o sta sfruttando qualche incoerenza? – m90

+0

Huh, questo funziona. Quello è strano. –

+2

Suppongo che stia verificando gli attributi css noti! –

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

Proof

+4

Questa dovrebbe essere la risposta accettata. '.prop' imposta la larghezza e l'altezza in modo appropriato per gli elementi canvas. –

8

Sembra che cambiare il caso di una lettera impedisca a jQuery di convertire l'attributo in uno stile, quindi Ranganadh probabilmente si è imbattuto in qualche difetto non voluto in jQuery dove controlla l'attributo rispetto agli stili, ma senza distinzione tra maiuscole e minuscole.

Questo per esempio sembra funzionare bene ??

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

Gli attributi nativi JS non vengono convertiti in stili, e probabilmente sarei andare con la soluzione di seguito per assicurarsi che sia "a prova di futuro" (setAttribute() sembra funzionare aswell fine):

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

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

Modifica: Questo è più lento, vedere i commenti di seguito.

Questo sarà probabilmente più veloce di qualsiasi soluzione postato qui:

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

Un po 'meno elaborato, ma è esentially lo stesso con chiamate di funzione meno.

+0

In realtà sembra essere molto più lento in questo modo: http://jsperf.com/element-creation-vs-string-injection – m90

+0

@ m90 Hm, interessante, mi chiedo quale sia la ragione alla base di questo, quindi, non sembra essere molto logico. – Mahn

+0

jQuery non solo inserirà la stringa nel DOM ma analizzerà e gestirà in molti modi diversi. Se si passa un semplice tag HTML a '$()' può saltare una chiamata a '$ .buildFragment' che sembra essere piuttosto costosa e gestire l'attributo tramite' .attr() 'stesso. Vedi: http://james.padolsey.com/jquery/#v=1.7.2&fn=init per cosa sta succedendo. – m90

1

ho scoperto che questo ha funzionato al meglio:

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

È inoltre possibile aggiungere id, class, o altri attributi in questo modo. Perché non è nell'attributo style="", non conta come CSS e rovina le forme.

Problemi correlati