Удаление дополнительного пространства над и под символами в строке строки [дубликат]

Если вы не используете jQuery в своем коде, этот ответ для вас

Ваш код должен быть чем-то вроде этого:

function foo() {
    var httpRequest = new XMLHttpRequest();
    httpRequest.open('GET', "/echo/json");
    httpRequest.send();
    return httpRequest.responseText;
}

var result = foo(); // always ends up being 'undefined'

Феликс Клинг отлично справился с написанием ответа для людей, использующих jQuery для AJAX, я решил предоставить альтернативу для людей, которые этого не делают.

( Примечание. используя новый API fetch, угловые или обещания, я добавил еще один ответ ниже )


То, с чем вы столкнулись

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

A в AJAX означает асинхронность. Это означает, что отправка запроса (или, скорее, получение ответа) вынимается из обычного потока выполнения. В вашем примере .send немедленно возвращается, а следующий оператор return result; выполняется до того, как функция, которую вы передали, когда был вызван обратный вызов success.

Это означает когда вы возвращаетесь, слушатель, который вы определили, еще не выполнил, что означает, что возвращаемое вами значение не было определено.

Вот простая аналогия

function getFive(){ 
    var a;
    setTimeout(function(){
         a=5;
    },10);
    return a;
}

(Fiddle)

Возвращаемое значение a - undefined так как часть a=5 еще не выполнена. AJAX действует так, вы возвращаете значение до того, как сервер получил возможность сообщить вашему браузеру, что это за значение.

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

function onComplete(a){ // When the code completes, do this
    alert(a);
}

function getFive(whenDone){ 
    var a;
    setTimeout(function(){
         a=5;
         whenDone(a);
    },10);
}

Это называется CPS . В основном, мы передаем getFive действие, которое необходимо выполнить, когда оно завершается, мы сообщаем нашему кодексу, как реагировать, когда событие завершается (например, наш вызов AJAX или в этом случае время ожидания).

Использование будет:

getFive(onComplete);

Который должен предупредить «5» на экране. (Fiddle) .

Возможные решения

Существуют два способа решения этой проблемы:

  1. Сделать AJAX синхронный вызов (позволяет называть его SJAX).
  2. Реструктурируйте свой код для правильной работы с обратными вызовами.

1. Синхронный AJAX - Не делайте этого !!

Что касается синхронного AJAX, не делайте этого! Ответ Феликса вызывает некоторые веские аргументы в пользу того, почему это плохая идея. Подводя итог, он заморозит браузер пользователя, пока сервер не вернет ответ и не создаст очень плохой пользовательский интерфейс. Вот еще краткое резюме из MDN о том, почему:

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

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

Если вы имеете , вы можете передать флаг: Вот как это сделать:

var request = new XMLHttpRequest();
request.open('GET', 'yourURL', false);  // `false` makes the request synchronous
request.send(null);

if (request.status === 200) {// That's HTTP for 'ok'
  console.log(request.responseText);
}

2. Код реструктуризации

Пусть ваша функция принимает обратный вызов. В примере код foo может быть сделан для принятия обратного вызова. Мы сообщим нашему кодексу, как отреагировали , когда foo завершает работу.

Итак:

var result = foo();
// code that depends on `result` goes here

Становится:

foo(function(result) {
    // code that depends on `result`
});

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

function myHandler(result) {
    // code that depends on `result`
}
foo(myHandler);

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

Теперь давайте определим сам foo, чтобы действовать соответственно

function foo(callback) {
    var httpRequest = new XMLHttpRequest();
    httpRequest.onload = function(){ // when the request is loaded
       callback(httpRequest.responseText);// we're calling our method
    };
    httpRequest.open('GET', "/echo/json");
    httpRequest.send();
}

(скрипка)

Теперь мы сделали нашу функцию foo принять действие, которое будет выполняться, когда AJAX завершится успешно, мы можем продолжить это, проверив, не является ли статус ответа не 200 и действует соответственно (создайте обработчик сбоя и т. д.). Эффективное решение нашей проблемы.

Если вам все еще трудно понять это , прочитайте руководство по началу работы AJAX в MDN.

30
задан MusikAnimal 27 December 2012 в 23:09
поделиться

5 ответов

Кажется, вам нужно явно установить шрифт и изменить line-height и height по мере необходимости. Предполагая, что «Times New Roman» является шрифтом по умолчанию вашего браузера:

span {
    display: inline-block;
    font-size: 50px;
    background-color: green;
    /*new:*/
    font-family: 'Times New Roman';
    line-height: 34px;
    height: 35px;
}

Тест: http://jsfiddle.net/7vNpJ/21/

24
ответ дан MusikAnimal 27 August 2018 в 22:02
поделиться

Браузер не добавляет никаких дополнений. Вместо этого буквы (даже прописные буквы), как правило, значительно меньше по вертикали, чем высота шрифта, не говоря уже о высоте строки, которая обычно по умолчанию примерно в 1,2 раза превышает высоту шрифта (размер шрифта).

Нет общего решения, потому что шрифты разные. Даже при фиксированном размере шрифта высота буквы зависит от шрифта. И заглавные буквы не должны иметь одинаковую высоту в шрифте.

Практические решения можно найти путем экспериментов, но они неизбежно зависят от шрифтов. Вам нужно будет установить высоту линии, существенно меньшую размера шрифта. Следующее, кажется, дает желаемый результат в разных браузерах в Windows, для шрифта Arial:

<style>
span.foo {
    display: inline-block;
    font-size: 50px;
    background-color: green;
    line-height: 0.75em;
    font-family: Arial;
}
span.bar {
    position: relative;
    bottom: -0.02em;
}
</style>
<span class=foo><span class=bar>BIG TEXT</span></span>

Вложенные элементы span используются для перемещения текста по вертикали. В противном случае текст находится на базовой линии, и под базовым уровнем есть место, зарезервированное для descenders (как в буквах j и y).

Если вы посмотрите внимательно (с масштабированием), вы заметите, что есть очень маленькое пространство выше и ниже большинства букв здесь. Я установил вещи так, чтобы буква «G» входила. Она простирается вертикально немного дальше других прописных букв, так как буквы выглядят одинаковыми по высоте. Аналогичные проблемы возникают и с другими буквами, такими как «O». И вам нужно настроить настройки, если вам понадобится буква «Q», поскольку у нее есть спускатель, который немного расширяет базовую линию (в Arial). И, конечно, если вам когда-нибудь понадобится «É» или почти любая диакритическая отметка, у вас проблемы.

19
ответ дан Jukka K. Korpela 27 August 2018 в 22:02
поделиться

Меня часто это раздражало. Vertical-align будет работать только на дне и в центре, но никогда не будет сверху! : - (

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

CSS:

p {
    font-family: "Times New Roman", Times, serif;
    font-size: 15px;
    background: #FFFFFF;
    margin: 0
    margin-top: 3px;
    margin-bottom: 10px;
}

Для меня настройки полей отсортированы независимо от того, где я помещаю свой код «p> ... / p>».

Надеюсь, это поможет ...

-2
ответ дан Julian F. Weinert 27 August 2018 в 22:02
поделиться

У меня была аналогичная проблема. По мере увеличения высоты линии пространство над текстом увеличивается. Это не дополнение, но это повлияет на вертикальное пространство между контентом. Я обнаружил, что добавление верхнего края поля показало, что это трюк. Это должно было быть сделано для всех разных экземпляров строки-высоты, и это также зависит от семейства шрифтов. Возможно, это то, о чем разработчики должны лучше знать при прохождении требований к дизайну (?) Итак, для конкретного экземпляра семейства шрифтов и высоты строки:

h1 {
    font-family: 'Garamond Premier Pro Regular';
    font-size: 24px;
    color: #001230;
    line-height: 29px;
    margin-top: -5px;    /* CORRECTION FOR LINE-HEIGHT */
}
2
ответ дан omar j 27 August 2018 в 22:02
поделиться

Я разработчик, и наши разработчики столкнулись с этой проблемой при работе с Android вначале, и наши веб-разработчики испытывают такую ​​же проблему. Мы обнаружили, что интервал между строкой текста и другим объектом (либо компонентом, как кнопкой, либо отдельной строкой текста), который выкладывает программа проектирования, является неправильным. Это связано с тем, что в программе проектирования не учитывается диакритика, когда она определяет «размер» одной строки текста.

В итоге мы добавили «Êg» в каждую строку текста и вручную создали проставки (маленькие синие прямоугольники), которые выступают в качестве «измерения» из фактического текста текста (т. е. верхней части знака акцента на E) или из descender (нижняя часть «g» «). Например, скажем, у вас действительно скучная верхняя навигация, которая представляет собой просто прямоугольник и заголовок под ним. Программа проектирования скажет, что пространство между нижней частью верхней навигационной панели и верхней частью текстового поля заголовка 24px. Однако, когда вы измеряете снизу навигатора до вершины Ê акцентной метки, интервал фактически равен 20 пикселям.

Хотя я понимаю, что это не кодовое решение, оно должно помочь объяснить несоответствия между конструкторскими спецификациями и тем, что похоже на сборку.

Смотрите это изображение для пример того, что делает Sketch с типом

1
ответ дан Sarah McDermott 27 August 2018 в 22:02
поделиться