JQuery bir öğeyle ilişkili tüm CSS stillerini alabilir mi?


297

JQuery'de varolan bir öğeden tüm CSS'leri almanın ve tümünü listelemeden başka bir CSS'ye uygulamanın bir yolu var mı?

Bir stil özniteliği olsaydı işe yarayacağını biliyorum attr(), ancak tüm tarzlarım harici bir stil sayfasında.

Yanıtlar:


340

Birkaç yıl geç, ancak burada hem satır içi stili hem de harici stili alan bir çözüm var:

function css(a) {
    var sheets = document.styleSheets, o = {};
    for (var i in sheets) {
        var rules = sheets[i].rules || sheets[i].cssRules;
        for (var r in rules) {
            if (a.is(rules[r].selectorText)) {
                o = $.extend(o, css2json(rules[r].style), css2json(a.attr('style')));
            }
        }
    }
    return o;
}

function css2json(css) {
    var s = {};
    if (!css) return s;
    if (css instanceof CSSStyleDeclaration) {
        for (var i in css) {
            if ((css[i]).toLowerCase) {
                s[(css[i]).toLowerCase()] = (css[css[i]]);
            }
        }
    } else if (typeof css == "string") {
        css = css.split("; ");
        for (var i in css) {
            var l = css[i].split(": ");
            s[l[0].toLowerCase()] = (l[1]);
        }
    }
    return s;
}

Bir jQuery nesnesini ilettiğinizde css(), daha sonra yeniden jQuery's'e bağlayabileceğiniz bir nesne döndürülür $().css():

var style = css($("#elementToGetAllCSS"));
$("#elementToPutStyleInto").css(style);

:)


14
BTW, bir JSON nesnesi dediğinde , sadece bir JavaScript nesnesi mi demek istiyorsun?
alex

3
Bu harika görünüyor, ama denediğimde yazı tipi ailesi gibi bazı özellikleri kaçırıyor.
Damon

3
@Damon: Bu, geçerli bir varsayımdır, cevabın ilk satırında şöyle diyor: İşte hem satır içi stil hem de dış stil alan bir çözüm .
alex

5
Bu kod artık çalışmıyor (her zaman Chrome'da boş nesne döndürür)
Ivan Castellanos

12
Not: Moderatörler orijinal kodumu değiştirdiler, hiçbir şeyin çalışacağını garanti etmiyorum.
marknadal

90

İki yıl geç, ama aradığınız çözüm var. Orijinal yazardan kredi almak istemeyen , burada bulduğum bir eklenti, ihtiyacınız olan şey için son derece iyi çalışıyor, ancak tüm tarayıcılarda, hatta IE'de tüm olası stilleri alıyor .

Uyarı: Bu kod çok fazla çıktı üretir ve az kullanılmalıdır. Yalnızca tüm standart CSS özelliklerini değil, aynı zamanda o tarayıcı için tüm satıcı CSS özelliklerini de kopyalar.

jquery.getStyleObject.js:

/*
 * getStyleObject Plugin for jQuery JavaScript Library
 * From: http://upshots.org/?p=112
 */

(function($){
    $.fn.getStyleObject = function(){
        var dom = this.get(0);
        var style;
        var returns = {};
        if(window.getComputedStyle){
            var camelize = function(a,b){
                return b.toUpperCase();
            };
            style = window.getComputedStyle(dom, null);
            for(var i = 0, l = style.length; i < l; i++){
                var prop = style[i];
                var camel = prop.replace(/\-([a-z])/g, camelize);
                var val = style.getPropertyValue(prop);
                returns[camel] = val;
            };
            return returns;
        };
        if(style = dom.currentStyle){
            for(var prop in style){
                returns[prop] = style[prop];
            };
            return returns;
        };
        return this.css();
    }
})(jQuery);

Temel kullanım oldukça basit, ama bunun için de bir fonksiyon yazdı:

$.fn.copyCSS = function(source){
  var styles = $(source).getStyleObject();
  this.css(styles);
}

Umarım yardımcı olur.


2
@Damon: Teşekkürler! Yazımı güncelledim ve bunun benim işim olmadığını açıkça belirtmek için ifadeleri biraz düzenledim. Önceki ifadeler için üzgünüm, sanırım bu cevabı gece geç saatlerde yazdım, ama her iki durumda da oldukça doucheydi.
Dakota

2
Bu neden geri dönüyor this.css()? Bu yöntemin argüman almasına ilişkin hiçbir belge yoktur ve bu ifadeye ulaşılırsa bir istisna atar. return returns;Boş bir nesne olsa bile daha uygun olacağını düşünüyorum .
Tristan Lee

2
Bunun çalışan bir demosunu almak mümkün müdür? Bu kodu nereye koyacağımı ve nasıl çağıracağımı net değil. Çıktının nerede depolandığı da bana açık değil. Teşekkürler.
Cymro

Nasıl kullanılacağını anlamıyorum, jsfiddle adı verilen ve çoğu insanın yardım etmek için kullandığı bir şey var. İyi programcı kötü öğretmen
Gino

@Gino div1'in stilini div 2'ye kopyalamak istiyorsanız sadece şunu kullanın: $("#div2").copyCSS($("#div1"));ve kullanabileceğiniz herhangi bir öğenin stilini elde etmek için:JSON.stringify($('#element').getStyleObject());
Wessam El Mahdy

16

Neden .styleDOM öğesini kullanmıyorsunuz ? Bu gibi üyelerini içeren bir nesne var widthve backgroundColor.


1
Bu sınıfla ilişkili gerçek stilleri almanın tek yolu olduğundan eminim. (farklı hesaplanan stillerin aksine)
cgp

32
.Style ile yalnızca öğenin stil özelliğine uygulanan özellikler elde edersiniz, ancak CSS sınıfıyla uygulanan özellikleri almazsınız.
EricSonaron

Satır içi komut dosyası kullanarak ve dinamik olarak
sonradan

11

Birçok farklı çözüm denemiştim. Bu, benim için işe yarayan tek şeydi, sınıf seviyesinde ve doğrudan öğeye atfedilen tarzda uygulanan stilleri alabildi. Yani css dosya düzeyinde ve bir stil niteliği olarak ayarlanmış bir yazı tipi; doğru yazı tipini döndürdü.

Basit! (Üzgünüm, ilk bulduğum yeri bulamıyorum)

//-- html object
var element = htmlObject; //e.g document.getElementById
//-- or jquery object
var element = htmlObject[0]; //e.g $(selector)

var stylearray = document.defaultView.getComputedStyle(element, null);
var font = stylearray["font-family"]

Alternatif olarak, dizi boyunca bisiklet sürerek tüm stili listeleyebilirsiniz

for (var key in stylearray) {
console.log(key + ': ' + stylearray[key];
}


4

@ marknadal'ın çözümü benim için tirelemeli özellikler yakalamıyordu (örneğin max-width), ancak ilk fordöngüyü değiştirmek css2json()işe yaradı ve daha az yineleme gerçekleştirdiğinden şüpheleniyorum:

for (var i = 0; i < css.length; i += 1) {
    s[css[i]] = css.getPropertyValue(css[i]);
}

Aracılığıyla Döngüler lengthziyade in,aracılığıyla Geri alma getPropertyValue()yerinetoLowerCase().

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.