2009-04-03 15 views
1

Ich schreibe ein GM-Skript, und eine Sache, die ich realisierte, dass ich immer wieder mache, macht den gleichen Code immer und immer wieder. Insbesondere die Stileigenschaft.Wie organisieren Sie Javascript Verbose?

function createButton() { 
    var a = document.createElement('a'); 
    a.href = '#'; 
    a.innerHTML = 'Print Topic'; 
    a.style.position = 'absolute'; 
    a.style.right = '3em'; 
    a.style.top = '6em'; 
    a.style.fontFamily = 'Arial,Helvetica,sans-serif'; 
    a.style.fontWeight = 'bold'; 
    a.style.fontSize = '125%'; 
    a.style.background = '#777777 none repeat scroll 0 0'; 
    a.style.color = 'white'; 
    a.style.padding = '6px 12px'; 
    document.body.insertBefore(a, document.body.lastChild); 
} 

Wie Sie in meinem Beispielcode sehen können, schrieb ich wiederholt a.style oft. Haben Sie Techniken, mit denen Sie dieses Chaos vermeiden? Nur aus Gründen der Anmut.

DANK -

Jungs, hier ist der reduzierte Code:

function createButton() { 
    var a = document.createElement('a'); 
    var css = document.createElement('style'); 
    css.type = 'text/css'; 
    css.innerHTML = '#prt { position:absolute; right:3em; top: 6em; font-family: Arial,Helvetica,sans-serif; font-weight:bold; font-size:125%; background: #777777 none repeat scroll 0 0; color: white; padding: 6px 12px;}' 
    a.href = '#'; 
    a.innerHTML = 'Print Topic'; 
    a.id = 'prt'; 
    document.body.insertBefore(a, document.body.lastChild); 
    document.body.appendChild(css); 
} 

LOL, die sicherlich besser

+0

Soll Ihr "reduzierter Code" ein Witz oder etwas sein? –

+0

Sie können die Stilattribute auch in einer separaten .css-Datei definieren und dann die Datei auf Ihrer Seite mit einem Link-Tag verknüpfen. Eine weitere Alternative besteht darin, die Stilattribute in einem Stil-Tag zu definieren. Dies würde die Notwendigkeit vermeiden, Stilattribute in JavaScript-Code zu definieren. – AndreiM

+0

HTML4.01 erlaubt keine Stilelemente im Körper, so dass Browser sie ignorieren können; Chrome hat das in der Vergangenheit gemacht, ich weiß nichts über aktuelle Versionen - siehe http://StackOverflow.com/Questions/524696/ – Christoph

Antwort

12

Setzen Sie die Stilattribute in CSS-Klassen aussieht, dann tauschen nur dynamisch die Klassen statt jedes Style-Attribut explizit auszuführen.

+1

<- das, liebe Jesus diese – annakata

1

Die nicht sehr-gut-aber-vielleicht-besser-als-der-Original Antwort:

s = a.style; 

s.position = "absolute"; 
...etc... 
s.color = "white"; 
+0

AFAIK, würden einige Browser s als Referenz behandeln, und andere als eine Kopie, so dass Sie in Cross-Browser-Probleme hier auftreten können. Ich könnte jedoch völlig falsch liegen. – Macha

+0

Wenn Sie diese Route mit (a.Stil) wäre besser, es sei denn, Sie glauben, dass die Lügen von Crockford – annakata

+0

Immer für eine gute Lüge. Erzähl mir mehr! – KooiInc

1

Versuchen

Wenn Sie jQuery wurden mit Ihnen schreiben konnte:

$("a").css({position: "absolute", right: "3em", top: "6em"}) // etc. 
+0

Danke, ich schreibe in Greasemonkey und möchte mehr über Bare Metal Javascript erfahren. = D – rymn

1

jQuery macht die Dinge kürzer durch eine magische Funktion $(), die einen Wrapper Ihres dom-Elements zurückgibt.

Der Wrapper gibt Ihnen Zugriff auf alle CSS-Eigenschaft, und so ziemlich alle Methoden (dh die Setter geben "this" zurück) einschließlich der CSS-Setter.

Es wird mit einem Beispiel klarer ...

$("<a href='toto/'></a>") 
    .css("position", "absolute"); 
    .css("right", "3em") 
    .appendTo($(containerid)); 
+0

Ja, jQuery ist großartig. Ich versuche jetzt das blanke Metall Javascript. Ich möchte irgendwie das Detail von Javascript wissen. – rymn

1

Javascript hat eine with Aussage ...

with a.style { 
    position = 'absolute'; 
    right = '3em'; 
} 

Und Sie können Ihre wiederholte Funktionalität aus als Funktion aufgeteilt und übergeben Ihr Element als Parameter ...

function setStyle(elem) { 
    with elem.style { 
    position = 'absolute'; 
    right = '3em'; 
    } 

    return elem 
} 

//Invoke like this: elem = setStyle(elem) 
+0

Funktioniert das Crossbrowser? – Macha

0

Ausarbeitung auf der am meisten abgestimmt antworte oben. Legen Sie einfach alle Ihre CSS-Informationen in eine CSS-Klasse. Habe dann gerade das Klassenattribut zugewiesen.

<style type='text/css'> 
a .prt { 
position:absolute; 
right:3em; 
top: 6em; 
font-family: Arial,Helvetica,sans-serif; 
font-weight:bold; 
font-size:125%; 
background: #777777 none repeat scroll 0 0; 
color: white; padding: 6px 12px; 
} 
</style> 
<script> 
function createButton() {  
var a = document.createElement('a'); 
a.class= 'prt'; 
document.body.insertBefore(a, document.body.lastChild); 
} 
</script> 
+0

das sollte 'a.className = 'prt' lesen; '-' class' ist ein reserviertes Wort und kann zu Problemen führen, wenn es als Name einer nicht angegebenen Eigenschaft verwendet wird – Christoph