क्या jQuery किसी तत्व से जुड़ी सभी CSS शैलियाँ प्राप्त कर सकता है?


297

क्या किसी मौजूदा तत्व से सभी सीएसएस प्राप्त करने के लिए jQuery में एक तरीका है और उन सभी को सूचीबद्ध किए बिना इसे दूसरे पर लागू करें?

मुझे पता है कि यह काम करेगा अगर वे एक शैली विशेषता के साथ थे attr(), लेकिन मेरी सभी शैली एक बाहरी शैली की चादर में हैं।

जवाबों:


340

एक दो साल देर से, लेकिन यहाँ एक समाधान है जो इनलाइन स्टाइल और बाहरी स्टाइल दोनों को पुनः प्राप्त करता है:

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;
}

किसी jQuery ऑब्जेक्ट को पास करें css()और यह एक ऑब्जेक्ट लौटाएगा, जिसे आप फिर jQuery के $().css(), पूर्व में प्लग कर सकते हैं :

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

:)


14
BTW, जब आप JSON ऑब्जेक्ट कहते हैं , तो आपको सिर्फ जावास्क्रिप्ट ऑब्जेक्ट सही लगता है?
एलेक्स

3
यह बहुत अच्छा लग रहा है, लेकिन जब मैं इसे आज़मा रहा होता हूँ तो फॉन्ट-परिवार जैसे कुछ गुणों से चूक जाता है।
डेमॉन

3
@ डैमोन: यह एक मान्य धारणा है, जवाब की पहली पंक्ति पर विचार करते हुए ... यहाँ एक समाधान है जो इनलाइन स्टाइल और बाहरी स्टाइल दोनों को पुनः प्राप्त करता है
एलेक्स

5
यह कोड किसी भी अधिक काम नहीं करता है (क्रोम में हमेशा खाली वस्तु लौटाता है)
इवान कास्टेलानोस

12
नोट: मॉडरेटर ने मेरा मूल कोड संशोधित कर दिया है, मुझे कोई गारंटी नहीं है कि कुछ भी काम करेगा।
निशानदाल

90

दो साल देर से, लेकिन मेरे पास वह उपाय है जिसकी आपको तलाश है। प्रपत्र क्रेडिट लेने के लिए इच्छुक नहीं मूल लेखक , यहाँ जो मैं आपको क्या चाहिए के लिए असाधारण रूप से अच्छा काम करता है पाया एक प्लगइन है, लेकिन हो जाता है सब , सभी ब्राउज़रों में संभव शैलियों भी आईई।

चेतावनी: यह कोड बहुत अधिक आउटपुट उत्पन्न करता है, और इसे संयम से इस्तेमाल किया जाना चाहिए। यह न केवल सभी मानक CSS गुणों की प्रतिलिपि बनाता है, बल्कि उस ब्राउज़र के सभी विक्रेता CSS गुणों की भी।

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);

बुनियादी उपयोग बहुत सरल है, लेकिन उन्होंने इसके लिए एक फ़ंक्शन भी लिखा है:

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

उम्मीद है की वो मदद करदे।


2
@ डामन: धन्यवाद! मैंने अपनी पोस्ट को अपडेट कर दिया है, और शब्दों को थोड़ा संपादित करके स्पष्ट कर दिया है कि यह मेरा काम नहीं है। पिछले शब्दांकन के बारे में क्षमा करें, मुझे लगता है कि मैंने इस उत्तर को देर रात को टाइप किया था, लेकिन किसी भी तरह से, यह बहुत कठिन था।
डकोटा

2
यह क्यों लौटता है this.css()? इस पद्धति के लिए कोई तर्क नहीं लेने के लिए कोई दस्तावेज नहीं है, और यदि यह कथन पहुंचा है, तो यह एक अपवाद फेंकता है। मुझे लगता है कि यह return returns;खाली वस्तु होने पर भी अधिक उपयुक्त होगा ।
ट्रिस्टन ली

2
क्या इस का वर्किंग डेमो प्राप्त करना संभव होगा? मुझे यह स्पष्ट नहीं है कि यह कोड कहां रखा जाए और इसे कैसे लागू किया जाए। यह मेरे लिए भी स्पष्ट नहीं है कि आउटपुट कहाँ संग्रहीत किया जा रहा है। धन्यवाद।
Cymro

मुझे समझ में नहीं आता कि इसका उपयोग कैसे करना है, jsfiddle नामक कुछ ऐसी चीज़ है जो ज्यादातर लोग मदद करने के लिए उपयोग करते हैं। अच्छे प्रोग्रामर बदतर शिक्षक हैं
गीनो

@ गीनो यदि आप div1 की शैली को div 2 से उपयोग करने के लिए कॉपी करना चाहते हैं: $("#div2").copyCSS($("#div1"));और आपके द्वारा उपयोग किए जा सकने वाले किसी भी तत्व की शैली प्राप्त करने के लिए:JSON.stringify($('#element').getStyleObject());
Wessam El Mahdy

16

.styleडोम तत्व का उपयोग क्यों नहीं किया जाता है ? यह एक ऐसी वस्तु है जिसमें सदस्य होते हैं जैसे कि widthऔर backgroundColor


1
मुझे पूरा यकीन है कि यह वास्तविक शैली को कक्षा के साथ जोड़ने का एकमात्र तरीका है। (जैसा कि गणना की गई शैलियों के विपरीत है)
cgp

32
.स्टाइल के साथ आपको केवल तत्व की शैली विशेषता पर लागू गुण मिलते हैं, लेकिन सीएसएस वर्ग के साथ लागू नहीं किए गए।
एरिकसोनारॉन

+1 इनलाइन स्क्रिप्ट का उपयोग करते हुए और इसे गतिशील रूप से बाद में बदलने के लिए
user991554

11

मैंने कई अलग-अलग समाधानों की कोशिश की थी। यह केवल एक ही था जिसने मेरे लिए काम किया था कि यह क्लास स्तर पर और शैली में सीधे तत्व पर आरोपित शैलियों पर लागू करने में सक्षम था। तो css फ़ाइल स्तर पर एक फ़ॉन्ट सेट और एक शैली विशेषता के रूप में; यह सही फ़ॉन्ट लौटा।

यह आसान है! (क्षमा करें, यह नहीं पाया जा सकता कि मैं मूल रूप से कहां पाया गया)

//-- 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"]

वैकल्पिक रूप से आप सरणी के माध्यम से साइकिल चलाकर सभी शैली को सूचीबद्ध कर सकते हैं

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


4

@ marknadal का समाधान मेरे लिए हाइफ़नेटेड संपत्तियों को हथियाना नहीं था (उदाहरण के लिए max-width), लेकिन पहले forलूप को बदलने से css2json()यह काम करता है, और मुझे संदेह है कि कम पुनरावृत्तियां करता है:

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

lengthबजाय के माध्यम से in,प्राप्त करता है के getPropertyValue()बजाय के माध्यम से लूपtoLowerCase().

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.