2011-01-24 3 views
16

Я знаю, что $("#divId").html() даст мне innerHtml. Мне также нужны его стили (которые могут быть определены с помощью классов) либо в строке style атрибут, либо все стили/классы в отдельном теге <style>.jQuery - Как получить все стили/css (определенные внутри внутреннего/внешнего документа) с HTML-элементом элемента

Возможно ли это?

UPDATE
Что делать, если HTML, как <div id="testDiv">cfwcvb</div> и класс CSS для #testDiv определяется во внешней таблице стилей?

UPDATE 2
Извините за не разъяснение этого ранее

Если это мой HTML

<div id="divId"> 
    <span class="someClass">Some innerText</span> 
</div> 

и стили определены в отдельной таблице стилей или стилях головы.

#divId { 
    clear: both; 
    padding: 3px; 
    border: 2px dotted #CCC; 
    font-size: 107%; 
    line-height: 130%; 
    width: 660px; 
} 
.someClass { 
    color: blue; 
} 

Тогда, когда я пытаюсь получить внутренний HTML из $("#divId").html() или вызвать любые другие пользовательские функции, мне нужно что-то вроде ниже

<style> 
#divId { 
    clear: both; 
    padding: 3px; 
    border: 2px dotted #CCC; 
    font-size: 107%; 
    line-height: 130%; 
    width: 660px; 
} 
.someClass { 
    color: blue; 
} 
</style> 

<div id="divId"> 
    <span class="someClass">Some innerText</span> 
</div> 

UPDATE 3 ответа на kirilloid
Я побежал ниже кода в окне командной строки инструментов отладки Chrome для this самой страницы, и это то, что я вижу TypeError: Cannot read property 'rules' of undefined

function getElementChildrenAndStyles(selector) { 
    var html = $(selector).get(0).outerHTML; 

    selector = selector.split(",").map(function(subselector){ 
    return subselector + "," + subselector + " *"; 
    }).join(","); 
    elts = $(selector); 

    var rulesUsed = []; 
    // main part: walking through all declared style rules 
    // and checking, whether it is applied to some element 
    sheets = document.styleSheets; 
    for(var c = 0; c < sheets.length; c++) { 
    var rules = sheets[i].rules || sheets[i].cssRules; 
    for(var r = 0; r < rules.length; r++) { 
     var selectorText = rules[r].selectorText; 
     var matchedElts = $(selectorText); 
     for (var i = 0; i < elts.length; i++) { 
     if (matchedElts.index(elts[i]) != -1) { 
      rulesUsed.push(CSSrule); break; 
     } 
     } 
    } 
    } 
    var style = rulesUsed.map(function(cssRule){ 
    if ($.browser.msie) { 
     var cssText = cssRule.style.cssText.toLowerCase(); 
    } else { 
     var cssText = cssRule.cssText; 
    } 
    // some beautifying of css 
    return cssText.replace(/(\{|;)\s+/g, "\$1\n ").replace(/\A\s+}/, "}"); 
    //     set indent for css here^
    }).join("\n"); 
    return "<style>\n" + style + "\n</style>\n\n" + html; 
}; 
getElementChildrenAndStyles(".post-text:first"); 
+0

Я думаю, ваш заголовок должен быть «Как получить все стили ..», также это похоже: http://stackoverflow.com/questions/754607/can-jquery-get-all-css -styles-associated-with-an-element – thirtydot

+0

вы можете сказать ** почему ** вам это нужно? возможно, есть простой способ сделать это. – galambalazs

+0

Потому что я копирую html элемента из одного документа в другой документ окна, который является iFrame. – IsmailS

ответ

12

outerHTML (не уверен, вам это нужно - на всякий случай)

Ограничения: CSSOM, а таблицы стилей должны быть одного источника.

function getElementChildrenAndStyles(selector) { 
    var html = $(selector).outerHTML(); 

    selector = selector.split(",").map(function(subselector){ 
    return subselector + "," + subselector + " *"; 
    }).join(","); 
    elts = $(selector); 

    var rulesUsed = []; 
    // main part: walking through all declared style rules 
    // and checking, whether it is applied to some element 
    sheets = document.styleSheets; 
    for(var c = 0; c < sheets.length; c++) { 
    var rules = sheets[c].rules || sheets[c].cssRules; 
    for(var r = 0; r < rules.length; r++) { 
     var selectorText = rules[r].selectorText; 
     var matchedElts = $(selectorText); 
     for (var i = 0; i < elts.length; i++) { 
     if (matchedElts.index(elts[i]) != -1) { 
      rulesUsed.push(rules[r]); break; 
     } 
     } 
    } 
    } 
    var style = rulesUsed.map(function(cssRule){ 
    if (cssRule.style) { 
     var cssText = cssRule.style.cssText.toLowerCase(); 
    } else { 
     var cssText = cssRule.cssText; 
    } 
    // some beautifying of css 
    return cssText.replace(/(\{|;)\s+/g, "\$1\n ").replace(/\A\s+}/, "}"); 
    //     set indent for css here^
    }).join("\n"); 
    return "<style>\n" + style + "\n</style>\n\n" + html; 
} 

использование:

getElementChildrenAndStyles("#divId"); 
+0

Спасибо за ответ. Я попробовал то, что вы ответили. Я обновил свой вопрос с результатами того, что я пробовал. Просто небольшое изменение, которое я сделал для того, на что вы ответили, - '$ (selector) .get (0) .outerHTML' из' $ (selector) .outerHTML() ', так что мне не нужно [outerHTML] (http : //stackoverflow.com/questions/2419749/jquery-get-selected-elements-outer-html). – IsmailS

+0

Было одно глупое заблуждение - я исправил его (и отредактировал код в своем сообщении). Но тогда у меня другая проблема: безопасность. В большинстве браузеров невозможно получить доступ к CSS через DOM (т. Е. Путь, который я использую) из других доменов. В файле stackoverflow CSS размещен на http://sstatic.net/stackoverflow/. Я протестировал измененный пример на http://www.ibm.com/us/en/sandbox/ver2/ с помощью «# ibm-search-form "и он работает, но вам нужно добавить' var $ = jQuery; 'в начале функции, чтобы работать в @ ibm.com – kirilloid

+0

Спасибо, вы обязательно получите награду, которую вы заслуживаете. Отличная работа. Еще одна ошибка. его отсутствующий «http:», когда я тестировал, как вы это делали по ссылке, которую вы дали. – IsmailS

0

.css() метод получает определенный стиль элемента ... Я не знаю, если вы можете получить все стили:

http://api.jquery.com/css/

0

Как правило, вы можете получить доступ к параметру с помощью стиля .attr ('стиль'). Если вы хотите получить доступ к вычисленному стилю, вы можете использовать window.getComputedStyle (элемент) в Opera, Firefox, Chrome и других разумных браузерах. Для IE вы сделаете то же самое с element.currentStyle.

Также, если вы хотите получить доступ к индивидуальному стилю CSS, вы можете сделать это с помощью jQuery .css. Как и $ ("# divId"). Css ('font-size').

4

Вы можете использовать что-то вроде этого для сценария: -

<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.js"></script> 
<script type="text/javascript"> 
$(function(){ 
    var styleVal = $('#testDiv').attr('style'); 
    console.warn("styleVal >>> " + styleVal); 
}) 
</script> 

и простой HTML будет как этот

<div style="border:1px solid red;" id="testDiv">cfwcvb</div> 
+0

поддерживается консолью в других браузерах? anyway +1 – Harish

+0

Консоль не поддерживается во всех браузерах, но вы можете использовать ее в качестве замены – Mahima

+0

Что делать, если для этого класса назначен класс, а этот класс определен в другом файле css? – IsmailS

6

Вы можете разжиться объекта стиля, представляющего вычисляемый стиль для элемента используя window.getComputedStyle() в большинстве браузеров и свойство элемента currentStyle в IE. Однако существует несколько различий браузера со значениями, возвращаемыми для свойств ярлыка (например, background), цветовых значений RGB, длин и даже font-weight (см. this useful test page). Тщательно проверьте.

function computedStyle(el) { 
    return el.currentStyle || window.getComputedStyle(el, null); 
} 

alert(computedStyle(document.body).color); 
+0

Я обновил свой вопрос на всякий случай, если раньше не было ясно. – IsmailS

+0

Мне нужна разметка .. – IsmailS

3

если вы хотите сохранить все стиля элемента я думаю, что это будет более сложным, как вы думаете прежде всего мой первый язь был консоль Firebug CSS. это показывает все в стиле элемента, и я подумал, как это сделать? поэтому я искал исходный код поджигатель и я нашел это:

http://fbug.googlecode.com/svn/branches/firebug1.7/content/firebug/css.js

этот код работает только на CSS части.

const styleGroups = 
{ 
    text: [ 
     "font-family", 
     "font-size", 
     "font-weight", 
     "font-style", 
     "color", 
     "text-transform", 
     "text-decoration", 
     "letter-spacing", 
     "word-spacing", 
     "line-height", 
     "text-align", 
     "vertical-align", 
     "direction", 
     "column-count", 
     "column-gap", 
     "column-width" 
    ], 

    background: [ 
     "background-color", 
     "background-image", 
     "background-repeat", 
     "background-position", 
     "background-attachment", 
     "opacity" 
    ], 

    box: [ 
     "width", 
     "height", 
     "top", 
     "right", 
     "bottom", 
     "left", 
     "margin-top", 
     "margin-right", 
     "margin-bottom", 
     "margin-left", 
     "padding-top", 
     "padding-right", 
     "padding-bottom", 
     "padding-left", 
     "border-top-width", 
     "border-right-width", 
     "border-bottom-width", 
     "border-left-width", 
     "border-top-color", 
     "border-right-color", 
     "border-bottom-color", 
     "border-left-color", 
     "border-top-style", 
     "border-right-style", 
     "border-bottom-style", 
     "border-left-style", 
     "-moz-border-top-radius", 
     "-moz-border-right-radius", 
     "-moz-border-bottom-radius", 
     "-moz-border-left-radius", 
     "outline-top-width", 
     "outline-right-width", 
     "outline-bottom-width", 
     "outline-left-width", 
     "outline-top-color", 
     "outline-right-color", 
     "outline-bottom-color", 
     "outline-left-color", 
     "outline-top-style", 
     "outline-right-style", 
     "outline-bottom-style", 
     "outline-left-style" 
    ], 

    layout: [ 
     "position", 
     "display", 
     "visibility", 
     "z-index", 
     "overflow-x", // http://www.w3.org/TR/2002/WD-css3-box-20021024/#overflow 
     "overflow-y", 
     "overflow-clip", 
     "white-space", 
     "clip", 
     "float", 
     "clear", 
     "-moz-box-sizing" 
    ], 

    other: [ 
     "cursor", 
     "list-style-image", 
     "list-style-position", 
     "list-style-type", 
     "marker-offset", 
     "user-focus", 
     "user-select", 
     "user-modify", 
     "user-input" 
    ] 
}; 

Функция, которая получает все стили.

updateComputedView: function(element) 
{ 
    var win = element.ownerDocument.defaultView; 
    var style = win.getComputedStyle(element, ""); 

    var groups = []; 

    for (var groupName in styleGroups) 
    { 
     var title = $STR("StyleGroup-" + groupName); 
     var group = {title: title, props: []}; 
     groups.push(group); 

     var props = styleGroups[groupName]; 
     for (var i = 0; i < props.length; ++i) 
     { 
      var propName = props[i]; 
      var propValue = stripUnits(rgbToHex(style.getPropertyValue(propName))); 
      if (propValue) 
       group.props.push({name: propName, value: propValue}); 
     } 
    } 

    var result = this.template.computedTag.replace({groups: groups}, this.panelNode); 
    dispatch(this.fbListeners, 'onCSSRulesAdded', [this, result]); 
} 

function stripUnits(value) 
{ 
    // remove units from '0px', '0em' etc. leave non-zero units in-tact. 
    return value.replace(/(url\(.*?\)|[^0]\S*\s*)|0(%|em|ex|px|in|cm|mm|pt|pc)(\s|$)/gi, function(_, skip, remove, whitespace) { 
    return skip || ('0' + whitespace); 
    }); 
} 

в этом коде я понял, что

win.getComputedStyle(element, "") 

, чтобы получить все стили элемента, а затем для цикла получает все стиля и печатает. поэтому я думаю, что getComputedSTyle является основной функцией, чтобы использовать, и после этого вы можете получить реквизит один за другим с:

style.getPropertyValue(propName) 
8

Нет JQuery и нет поддержки IE, это все, что я могу сделать:

enter image description here

<!doctype html> 

<html> 
    <head> 
     <meta charset = "utf-8"> 

     <script type = "text/javascript"> 
      Element.prototype.getStyles = function() { 
       var array = {}; 
       var styles = window.getComputedStyle (this, null); 

       for (var i = 0; i < styles.length; i ++) { 
        var style = styles[i]; 

        array[style] = styles[style]; 
       } 

       return array; // return new Array (array, this.innerHTML); You can also return the HTMl content. I don't think its necessary 
      } 

      window.addEventListener ("load", function() { 
       var divId = document.getElementById ("divId"); 
       var someClass = document.getElementsByClassName ("someClass"); 

       var string = ""; 
       var styles = divId.getStyles(); 

       for (var i in styles) { 
        string += i + ": " + styles[i] + "\n"; 
       } 

       alert (string); 
       alert ("In-line style: Height ->" + styles["height"] + "\n" + "Out-line style: Width ->" + styles["width"]) 
       alert ("HTML: " + divId.innerHTML); 

       // Same thing with the span element 
      }, false); 
     </script> 

     <style> 
      #divId { 
       clear: both; 
       padding: 3px; 
       border: 2px dotted #CCC; 
       font-size: 107%; 
       line-height: 130%; 
       width: 660px; 
      } 
      .someClass { 
       color: blue; 
      } 
     </style> 

     <title>Test</title> 
    </head> 

    <body> 
     <div id = "divId" style = "height: 100px"> 
      <span class = "someClass">Some innerText</span> 
     </div> 
    </body> 
</html> 
+0

Мне нужна разметка для стилей. – IsmailS

+0

Конкретно пожалуйста – Caio

+0

Мне нужны стили, такие как ' 'даже если они определены в отдельной таблице стилей. А затем html отметьте – IsmailS

0

Вы можете получить таблицу стилей, определенную внутри тегов стиля под document.styleSheets. Вы можете прочитать правила на карте и найти их с помощью selectorText. Итак, по id: «#id», по классам: «.className». На сафари или хром вы можете использовать getMatchedCSSRules.

1

Основываясь на ответе kirilloid, я создал расширение для разработчиков для Chrome, которое включает этот код для захвата стилей и разметки для фрагмента страницы. Расширение находится в Chrome Web Store и находится на Github. Все параметры вывода «Author Styles» используют этот метод для итерации над таблицами стилей.

enter image description here

Смежные вопросы