2012-05-03 7 views
27

Ich habe nur versucht, die folgenden in jQuery zu tun:Erstellen eines Canvas-Element und Einstellung seiner Breite und Höhe Attribute mit jQuery

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

Dies funktioniert (Art) und erzeugt das folgende Markup:

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

Wie die meisten von Ihnen vielleicht wissen canvas Elemente mögen CSS-Dimensionen nicht wirklich, aber erwarten ein Attribut width und height, so dass diese Objekt-Erstellung für mich fehlgeschlagen ist.

Ich weiß, ich könnte nur tun:

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

statt, aber ich habe mich nur gefragt dennoch, wenn es irgendeine Art und Weise ist jQuery zu sagen, dass width und height sollte als Attribute behandelt werden, wenn das Element über $('element',{attributes}) Schaffung und nicht als CSS?

+1

Um klar zu sein, '' Elemente "wie" CSS Breite und Höhe gerade gut; Wie bei einem HTML '', setzen Sie die Anzeigedimensionen mittels CSS auf eine Bitmap hoch/runter. Die ''Höhe und Breite Eigenschaften/Attribute sind wie das Ändern der Größe eines Bildes in Photoshop, indem Sie die tatsächliche Anzahl der Pixel im Quellbild einstellen. – Phrogz

+0

@Phrogz deshalb schrieb ich "nicht wirklich mag" ... In jedem Fall denke ich, dass 99% der Canvas-Elemente diese Attribute benötigen, da sie nicht mit dem Standard-Verhältnis übereinstimmen und so weiter. – m90

+1

@Phrogz, ja, ok, aber um klar zu sein, brauchen Sie ein wenig einfache Mathematik, um es richtig in normalem CSS zu skalieren. Ansonsten wird die "Leinwand" (wie du sagtest) wie ein normales "img" -Tag funktionieren, aber ** wird NICHT proportional skalieren ** und die meisten Benutzer (wie sie es haben) haben Probleme beim tatsächlichen Verständnis - genau diese Quasi/Ähnlichkeit. –

Antwort

29

jQuery versuchen jeweils übereinstimmen mit einem Funktionsnamen Attributnamen jQuery. Übereinstimmende Funktionen werden aufgerufen.

width und height sind jQuery-Funktionen, so dass Ihr Original-Code zu dieser entspricht:

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

width(value) und height(value) Funktionen CSS Breite und Höhe eines Elements gesetzt.


Relevante jQuery Quellcodezeile (https://github.com/jquery/jquery/blob/master/src/attributes.js#L308)

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

attrFn Objektdefinition (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

Während diese Antwort die Höhe und Breite des Formats tatsächlich festlegt, fragt die Frage nach den Attributen height und width. '$ ('') .width (100) .height (100)' legt den Stil der Zeichenfläche fest. Die passendere Antwort ist von @thecodeparadox. Die Verwendung von '.prop ({width: 100, height: 100})' fügt die direkte Höhe und Breite hinzu, nach der wir suchen. –

10

können Sie mögen dieses

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

ändern, um den Fall und versuchen

+0

Das ist interessant. Geschieht dies mit Absicht oder nutzt es einige Inkonsistenzen aus? – m90

+0

Huh, das funktioniert. Das ist komisch. –

+2

Ich denke, es ist für bekannte CSS-Attribute zu prüfen! –

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

Proof

+4

Dies sollte die akzeptierte Antwort sein. '.prop legt die Breite und Höhe für Canvas-Elemente entsprechend fest. –

8

Es scheint, als würde die Änderung der Groß- und Kleinschreibung verhindern, dass jQuery das Attribut in einen Stil konvertiert. Ranganadh ist wahrscheinlich auf einen unbeabsichtigten Fehler in jQuery gestoßen, wo das Attribut auf Stile überprüft wird, aber nicht auf Groß- und Kleinschreibung.

Dies scheint zum Beispiel auch zu funktionieren ??

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

die nativen JS Attribute nicht zu Stilen konvertieren, und ich würde wahrscheinlich mit der folgenden Lösung gehen, um sicherzustellen, dass es „zukunftssicher“ (setAttribute() fein als gut zu funktionieren scheint):

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

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

Edit: Dies ist langsamer, siehe Kommentare unten.

Dies wird wahrscheinlich schneller als jede Abhilfe hier gepostet:

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

Etwas weniger schicker, aber es ist esentially das gleiche mit weniger Funktionsaufrufe.

+0

Eigentlich scheint es so viel langsamer zu sein: http://jsperf.com/element-creation-vs-string-injection – m90

+0

@ m90 Hm, interessant, ich frage mich, was ist der Grund dafür, dann scheint es nicht sehr logisch sein. – Mahn

+0

jQuery fügt den String nicht einfach in das DOM ein, sondern parst und verarbeitet ihn auf viele verschiedene Arten. Wenn Sie ein einfaches HTML-Tag an das '$()' übergeben, kann ein Aufruf an '$ .buildFragment' übersprungen werden, der ziemlich teuer zu sein scheint und die Attributbehandlung über' .attr() 'selbst durchführt. Siehe: http://james.padolsey.com/jquery/#v=1.7.2&fn=init für das, was vor sich geht. – m90

1

fand ich, dass dies die beste gearbeitet:

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

Sie auch id, class oder andere Attribute auf diese Weise hinzufügen. Da es nicht im Attribut style="" ist, zählt es nicht als CSS und vermasselt Ihre Formen.

Verwandte Themen