Получить элемент из CSS-стиля Javascript [дубликат]

Я заключил из вступительного комментария, что пример использования определяет, является ли ответ HTML или JSON. В этом случае, когда вы делаете , получаете JSON, вы, вероятно, должны разбирать его и обрабатывать некорректный JSON в какой-то момент вашего кода. Помимо всего прочего, я предполагаю, что вы хотели бы получить информацию от своего браузера, если ожидается JSON, но недействительный JSON, полученный (как и пользователи по доверенности какого-либо значимого сообщения об ошибке)!

Выполнение полного регулярного выражения для JSON поэтому (как это было бы - по моему опыту - для большинства случаев использования). Вероятно, вам было бы лучше использовать что-то вроде ниже:

function (someString) {
  // test string is opened with curly brace or machine bracket
  if (someString.trim().search(/^(\[|\{){1}/) > -1) {
    try { // it is, so now let's see if its valid JSON
      var myJson = JSON.parse(someString);
      // yep, we're working with valid JSON
    } catch (e) {
      // nope, we got what we thought was JSON, it isn't; let's handle it.
    }
  } else {
    // nope, we're working with non-json, no need to parse it fully
  }
}

, который должен сэкономить на использовании дескриптора исключений, действительный код не JSON и позаботится о duff json на одновременно.

164
задан alex 8 January 2013 в 00:40
поделиться

9 ответов

В целях безопасности вы можете проверить, существует ли элемент, прежде чем пытаться его прочитать. Если он не существует, ваш код будет генерировать исключение, которое остановит выполнение на остальной части вашего JavaScript и потенциально отобразит сообщение об ошибке для пользователя - не хорошо. Вы хотите, чтобы уметь изящно терпеть неудачу.

var height, width, top, margin, item;
item = document.getElementById( "image_1" );
if( item ) {
  height = item.style.height;
  width = item.style.width;
  top = item.style.top;
  margin = item.style.margin;
} else {
  // Fail gracefully here
}
1
ответ дан BryanH 19 August 2018 в 17:12
поделиться
  • 1
    Это плохая идея, если вы действительно не ожидаете, что узел не может находиться в DOM. Слепая проверка нуля, когда нуль не ожидается, может привести к появлению ошибок, но скорее это скроет ошибку. Если вы ожидаете, что узел будет там, не указывайте, чтобы он не был там, допустим ошибку, чтобы вы могли исправить свой код. Этот ответ не имеет никакого отношения к самому вопросу, и поскольку это скорее (плохое) предложение, это должен быть комментарий. – Juan Mendes 7 June 2012 в 17:40
  • 2
    Спасибо за ваш комментарий. Я делаю это, потому что я склоняюсь к обороне. Вот вопрос: как вы увидите ошибку на машине пользователя? Помните, что то, что работает на вашем компьютере, может работать не для других (разные браузеры и ОС, плагины, которые влияют на поведение страницы, другие отключенные вещи и т. Д.). Дело было в том, чтобы он был неудачным изящно, поэтому страница все еще делала что-то близкое к тому, что было предназначено, вместо того, чтобы вызывать бесполезную ошибку пользователю. – BryanH 9 June 2012 в 04:50
  • 3
    @BryanH Там есть ошибка браузера, где он не отображает элемент с идентификатором «image_1» ?? ;) – alex 8 April 2014 в 02:56
  • 4
    @alex No. Если нет элемента с этим идентификатором, тогда код OP завершится с ошибкой. [Д0] Пример . Мое предложение заключалось в том, чтобы кодировать, чтобы этого никогда не могло случиться. – BryanH 6 February 2015 в 22:13

Свойство element.style позволяет вам знать только свойства CSS, которые были определены как встроенные в этот элемент (программно или определены в атрибуте стиля элемента), вы должны получить вычисленный стиль.

Не так просто сделать это кросс-браузерным способом, IE имеет свой собственный путь, через свойство element.currentStyle и стандартный способ DOM Level 2, реализованный другими браузерами, через метод document.defaultView.getComputedStyle.

Два способа имеют различия, например, свойство элемента IE.currentStyle ожидает, что вы получите доступ к именам свойств CSS, состоящим из двух или более слов в camelCase (например, maxHeight, fontSize, backgroundColor и т. д.), стандартный способ ожидает свойства со словами, разделенными тире (например, max-height, font-size, background-color и т. д.). ......

function getStyle(el, styleProp) {
    var value, defaultView = (el.ownerDocument || document).defaultView;
    // W3C standard way:
    if (defaultView && defaultView.getComputedStyle) {
        // sanitize property name to css notation
        // (hyphen separated words eg. font-Size)
        styleProp = styleProp.replace(/([A-Z])/g, "-$1").toLowerCase();
        return defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);
    } else if (el.currentStyle) { // IE
        // sanitize property name to camelCase
        styleProp = styleProp.replace(/\-(\w)/g, function(str, letter) {
            return letter.toUpperCase();
        });
        value = el.currentStyle[styleProp];
        // convert other units to pixels on IE
        if (/^\d+(em|pt|%|ex)?$/i.test(value)) { 
            return (function(value) {
                var oldLeft = el.style.left, oldRsLeft = el.runtimeStyle.left;
                el.runtimeStyle.left = el.currentStyle.left;
                el.style.left = value || 0;
                value = el.style.pixelLeft + "px";
                el.style.left = oldLeft;
                el.runtimeStyle.left = oldRsLeft;
                return value;
            })(value);
        }
        return value;
    }
}

Основная ссылка stackoverflow

22
ответ дан Community 19 August 2018 в 17:12
поделиться

Кросс-браузерное решение без манипуляций с DOM, приведенное выше, не работает, потому что оно дает первое правило соответствия, а не последнее. Последнее правило сопоставления является тем, которое применяется. Вот рабочая версия:

function getStyleRuleValue(style, selector) {
  let value = null;
  for (let i = 0; i < document.styleSheets.length; i++) {
    const mysheet = document.styleSheets[i];
    const myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
    for (let j = 0; j < myrules.length; j++) {
      if (myrules[j].selectorText && 
          myrules[j].selectorText.toLowerCase() === selector) {
        value =  myrules[j].style[style];
      }
    }
  }
  return value;
}  

Однако этот простой поиск не будет работать в случае сложных селекторов.

0
ответ дан jcdufourd 19 August 2018 в 17:12
поделиться

Вы можете использовать getComputedStyle() .

var element = document.getElementById('image_1'),
    style = window.getComputedStyle(element),
    top = style.getPropertyValue('top');

jsFiddle .

288
ответ дан Josh Schultz 19 August 2018 в 17:12
поделиться
  • 1
    Если вы хотите изменить цвет фона для div, будьте осторожны, чтобы НЕ ИСПОЛЬЗОВАТЬ & quot; backgroundColor & quot; вместо "backgroung-color" ;) – baptx 20 May 2012 в 18:24
  • 2
    Является ли slw аббревиатурой или вы подразумеваете медленный? – David Winiecki 9 May 2014 в 21:40
  • 3
    getComputedStyle не поддерживается в IE 8 и ниже. – David Winiecki 9 May 2014 в 22:04
  • 4
    Несколько от темы: некоторые (все?) стенографические свойства css недоступны в JavaScript. Например. вы можете получить padding-left, но не padding. JSFiddle – David Winiecki 9 May 2014 в 22:10
  • 5
    @DavidWiniecki, я действительно не верю, что webdevs все равно должен рассмотреть IE8 в основном браузере. поскольку он больше не поддерживается microsoft – Kevin Kuyl 28 February 2015 в 18:24

Используйте следующее. Это помогло мне.

document.getElementById('image_1').offsetTop

См. Также Получить стили .

19
ответ дан Peter Mortensen 19 August 2018 в 17:12
поделиться

Если вы находитесь в библиотеках, почему бы не MyLibrary и getStyle .

Метод jQuery css неверен , CSS - это всего лишь один способ установки стилей и необязательно представляет фактические значения свойств стиля элемента.

2
ответ дан RobG 19 August 2018 в 17:12
поделиться

Если вы установите его программно, вы можете просто называть его как переменную (т. е. document.getElementById('image_1').style.top). В противном случае вы всегда можете использовать jQuery:

<html>
    <body>
        <div id="test" style="height: 100px;">Test</div>
        <script type="text/javascript" src="jquery.min.js"></script>
        <script type="text/javascript">
            alert($("#test").css("height"));
        </script>
    </body>
</html>
6
ответ дан T J 19 August 2018 в 17:12
поделиться
  • 1
    Я не думаю, что ваш пример jQuery очень ясен (или правильно). – alex 14 June 2011 в 03:29
  • 2
    Ты прав. Я добавил рабочий пример. – adotout 14 June 2011 в 04:18
  • 3
    style свойство return all style inline применяется к элементу, не определяемому правилами css. – Steven Koch 10 May 2018 в 11:15

Кросс-браузерное решение для проверки значений CSS без манипуляции с DOM:

function getStyleRuleValue(style, selector) {
    for (var i = 0; i < document.styleSheets.length; i++) {
        var mysheet = document.styleSheets[i];
        var myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
        for (var j = 0; j < myrules.length; j++) {
            if (myrules[j].selectorText && myrules[j].selectorText.toLowerCase() === selector) {
                return myrules[j].style[style];
            }
        }

    }
};

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

getStyleRuleValue('backgroundColor', '.chart-color')

дезинфицированная версия (принудительно вводит ввод в строчный регистр и позволяет использовать case без ведущего ".")

function getStyleRuleValue(style, selector) {
var selector_compare=selector.toLowerCase();
var selector_compare2= selector_compare.substr(0,1)==='.' ?  selector_compare.substr(1) : '.'+selector_compare;

for (var i = 0; i < document.styleSheets.length; i++) {
    var mysheet = document.styleSheets[i];
    var myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
    for (var j = 0; j < myrules.length; j++) {
        if (myrules[j].selectorText) {
            var check = myrules[j].selectorText.toLowerCase();
            switch (check) {
                case selector_compare  :
                case selector_compare2 : return myrules[j].style[style];
            }
        }
    }

}

}

12
ответ дан unsynchronized 19 August 2018 в 17:12
поделиться
  • 1
    У меня был долгий день, и это не работало по ряду причин. pastie.org/9754599 работает намного лучше, выкинув недопустимые списки правил и опустив обе стороны финала ===. Большое спасибо, что ваше решение все еще спасло день! – Richard Fox 1 December 2014 в 20:07
  • 2
    хороший ответ, добавила в конце санированную версию, чтобы исправить несколько проблем использования края. – unsynchronized 27 June 2016 в 03:32
0
ответ дан aabiro 31 October 2018 в 03:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: