Должен найти высоту скрытого отделения на странице (набор к display:none)

Используйте массив имен листов и их сопоставление и forEach поверх них.

const sheetNames = ["Converting Fractions, Decimals and Percentages (1)",
"Converting Fractions, Decimals and Percentages (2)",
"Recall Mixed Division Facts",
"Recall 4x Table",
"Recall 3x Table",
"Recall Addition and Subtraction Facts within 20"]; // I am not typing them all in

const sourceSheets = sheetNames.map(name => ss.getSheetByName(name));

const targetsheet = ss.getSheetByName("All Responses");

const sourceRanges = sourceSheets.map(sourceSheet => sourceSheet.getSheetValues(2,1,sourcesheet.getLastRow(),21));

var thestring = "A1:Z";
var thelastrow = targetsheet.getLastRow();
var range = thestring+thelastrow;

if (thelastrow != 0) {
  targetsheet.getRange(range).clearContent();
}

sourceRanges.forEach(sourceRange => {
  targetsheet.getRange(targetsheet.getLastRow()+1, 1, sourceRange.length,21).setValues(sourceRange);
});

24
задан Jamis Charles 30 December 2010 в 13:13
поделиться

8 ответов

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

Конечно, есть проблемы с производительностью.

Мы рассматривали этот подход в реализации Prototype.js, но в итоге getWidth и getHeight сделали видимым только фактический элемент без обхода предков.

Проблема с альтернативными решениями, такими как удаление элемента из «скрытого» родителя, заключается в том, что определенные стили могут больше не применяться к элементу, когда он выходит из «обычной» иерархии. Если у вас есть такая структура:

<div class="foo" style="display:none;">
  <div class="bar">...</div>
</div>

и эти правила:

.bar { width: 10em; }
.foo .bar { width: 15em; }

, то удаление элемента из его родителя фактически приведет к неверным измерениям.

22
ответ дан 28 November 2019 в 22:33
поделиться

Сделано чистое решение js без Jquery и без клонирования (что, я думаю, быстрее)

var getHeight = function(el) {
    var el_style      = window.getComputedStyle(el),
        el_display    = el_style.display,
        el_position   = el_style.position,
        el_visibility = el_style.visibility,
        el_max_height = el_style.maxHeight.replace('px', '').replace('%', ''),

        wanted_height = 0;

    // if its not hidden we just return normal height
    if(el_display !== 'none' && el_max_height !== '0') {
        return el.offsetHeight;
    }

    // the element is hidden so:
    // making the el block so we can meassure its height but still be hidden
    el.style.position   = 'absolute';
    el.style.visibility = 'hidden';
    el.style.display    = 'block';

    wanted_height     = el.offsetHeight;

    // reverting to the original values
    el.style.display    = el_display;
    el.style.position   = el_position;
    el.style.visibility = el_visibility;

    return wanted_height;
}

вот демо https://jsfiddle.net/xuumzf9k/1/

Пожалуйста, дайте мне знать, если вы можете найти какие-либо улучшения в этом (как я использую это в моих основных проектах)

11
ответ дан 28 November 2019 в 22:33
поделиться

Пока элемент не отрендерен, у него нет высоты. Даже если вы клонируете родительский объект и отображаете его где-то, что не видно пользователю, нет гарантии, что клон будет иметь такую ​​же высоту, как и окончательный размер скрытого объекта.

Есть много вещей, которые могут повлиять на высоту, которые не обязательно будут отображаться в клоне - что-либо в DOM и его взаимодействие с правилами CSS может вызвать изменение в отображении любого другого элемента DOM. Если не считать клонирования всего документа (и даже если он не защищен от ошибок), у вас нет способа определить высоту скрытого объекта.

Если вы должны знать высоту, прежде чем она отобразится пользователю, вам придется «взломать» ее, отобразив ее как можно быстрее, а затем скрыть снова. Скорее всего, пользователь увидит этот сбой и не будет доволен результатом.

1
ответ дан 28 November 2019 в 22:33
поделиться

Вы можете клонировать элемент, абсолютно позиционировать его на -10000, -10000, измерить клон и уничтожить его.

16
ответ дан 28 November 2019 в 22:33
поделиться

Используйте z-index, чтобы скрыть элемент под непрозрачным элементом, показать его и получить высоту.

1
ответ дан 28 November 2019 в 22:33
поделиться

Таким образом, вы даже не можете изменить отображение : нет; на height: 0; переполнение: скрыто; ? Возможно, вы могли бы переопределить это в своей собственной таблице стилей следующим образом:

div#parent { display: block !important; height:0; overflow:hidden; }

А затем, когда вы используете YUI (при условии YUI 2), вы можете использовать это:

var region = YAHOO.util.Dom.getRegion('child');

Чтобы получить размеры и смещение дочернего элемента.

1
ответ дан 28 November 2019 в 22:33
поделиться

Я уже рассматривал этот способ, но я не использовал его, потому что я боялся, что мне нужно держать мои модули чрезвычайно маленькими, потому что его невозможно связать один и тот же интерфейс дважды. Моя проблема в том, что если я хочу использовать интерфейс/класс/перечисление/что-либо из другой банки и что банка определила службы/* файл, я завинчен, потому что я не могу использовать содержимое банки, не загружая ее в качестве модуля.

Надеюсь, моя забота ясна.

-121--2486082-

Я не уверен, будет ли это полезно для вас, но это был бы довольно простой способ сделать это, не уверен в точной «скорости» этого, хотя.

List<string> collection = new List<string>();

collection.Sort();

foreach(string value in collection)
{
   if(value == "stringToLookFor")
   {
       return value;
   }
{
-121--2681531-

Мне пришлось сделать следующее:

Используя YUI 2, при загрузке страницы я обнаружил все элементы данного имени класса, которые были установлены для отображения: нет, или высота и ширина которых были равны 0 (это один из способов измерения того, существует ли элемент, или родительский элемент настроен для отображения: нет). Затем я задаю отображаемый элемент: блок. Потом я проверил его родителя на то же самое и показал родителям, пока он не нашел видимого родителя. Один раз наивысший дисплей: ни один предок не установлен для отображения: блок, я могу измерить мой элемент.

Как только все элементы измерены, я возвращаю все элементы обратно на дисплей: нет.

0
ответ дан 28 November 2019 в 22:33
поделиться

Вы попробовали это?

setTimeout('alert($(".Var").height());',200); 
-6
ответ дан 28 November 2019 в 22:33
поделиться
Другие вопросы по тегам:

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