2013-08-04 7 views
6

Ich möchte ein Sheet wie diese erstellen:Ungültige Zuordnung der linken Seite mit ternären wenn

var sheet = document.createElement('style'); sheet.type = 'text/css'; 
sheet.innerHTML = data.style; 

Aber it seems, die IE seine eigene Syntax muss. this answer ‚s Code zu vereinfachen, habe ich versucht,

var sheet = document.createElement('style'); sheet.type = 'text/css'; 
(sheet.styleSheet ? sheet.styleSheet.cssText : sheet.innerHTML) = data.style; 

Aber das wirft ReferenceError: invalid assignment left-hand side.

Dann muss ich ...

var sheet = document.createElement('style'); sheet.type = 'text/css'; 
if(sheet.styleSheet) sheet.styleSheet.cssText = data.style; 
else sheet.innerHTML = data.style; 

... oder gibt es eine einfachere Alternative?

+0

Ich glaube, Sie können mit der Einstellung beider Werte durchkommen, und das Objektsystem von Javascript ist robust genug, um sich um den Unterschied zu kümmern. – abiessu

+0

@abiessu Aber wenn 'sheet.styleSheet'' undefiniert' ist, dann löst 'sheet.styleSheet.cssText = sheet.innerHTML = data.style'' TypeError: sheet.styleSheet is undefined' aus. Dann sollte ich auch prüfen, ob ich das Objekt 'sheet.styleSheet' erstellen soll. – Oriol

+0

Nein, ich meine zwei separate Zuweisungszeilen. Dieser Typfehler wird sehr wahrscheinlich ausgelöst, weil 'sheet.stylesheet' nicht existiert, um einen Wert zur Verfügung zu stellen, der in Ihrem Beispiel für 'sheet.styleSheet.cssText' zugänglich ist. – abiessu

Antwort

3

Sie können immer tun:

sheet.styleSheet ? sheet.styleSheet.cssText = data.style 
       : sheet.appendChild(document.createTextNode(data.style)); 

FIDDLE

+0

nun, das ist noch weniger lesbar ... – Dave

+0

@Dave - aber es beantwortet die Frage! – adeneo

+0

Nun, ich wollte vermeiden, 'data.style' zu ​​wiederholen, aber ich denke, das ist der einfachste Arbeitscode. – Oriol

1

Hier ist die Lösung, die Zukunft Maintainer nicht, was auf der Erde verlassen wird fragen, der Code tut:

function setSheetContent(sheet, text) { 
    if(sheet.styleSheet) 
     sheet.styleSheet.cssText = text; 
    else 
     sheet.innerHTML = text; 
} 

var sheet = document.createElement('style'); 
sheet.type = 'text/css'; 
setSheetContent(sheet, data.style); 

oder wickeln Sie es für noch mehr Komfort (wenn Sie nie den Inhalt eines bestehenden Blatt ändern möchten

)
function stylesheetWithContent(sheet, text) { 
    var sheet = document.createElement('style'); 
    sheet.type = 'text/css'; 
    if(sheet.styleSheet) 
     sheet.styleSheet.cssText = text; 
    else 
     sheet.innerHTML = text; 
    return sheet; 
} 

var sheet = stylesheetWithContent(data.style); 
+1

Auch nicht viele Aussagen in einer Zeile. Wenn Sie den Code für schnellere Downloads minimieren möchten, verwenden Sie einen tatsächlichen Minifier (Google Closure Compiler hat z. B. eine Onlineversion) – Dave

+0

Ich habe nur 'var sheet = document.createElement ('style'); sheet.type = 'text/css'; 'in derselben Zeile, denn wenn ich HTML schreibe, verwende ich'