Почему текстовая область заполнена таинственными пробелами?

292

У меня есть простая текстовая область в форме, подобной этой:

<textarea style="width:350px; height:80px;" cols="42" rows="5" name="sitelink">
    <?php if($siteLink_val) echo $siteLink_val; ?> 
</textarea>

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

Afamee
источник

Ответы:

485

Посмотри внимательно на свой код. В нем уже есть три переноса строки и тонна пустого пространства </textarea>. Сначала удалите их, чтобы между тегами больше не было разрывов строк. Это может уже сделать свое дело.

Пекка
источник
4
@ user79685 пожалуйста. Прочитайте мой новый комментарий выше, я не высмеивал вас. По крайней мере, в плохом смысле :)
Pekka
9
Я не согласен с этим. Я очень люблю тактику и этикет в онлайн-дискуссиях, и мне нравится в целом очень дружелюбный тон на SO. С другой стороны, при движении по сети нужно немного придумывать кожу, это правда.
Pekka
2
очень хорошо. Я тоже столкнулся с этой проблемой и попробовал любой другой прием - от обрезки текста до применения свойства 'text-index' (используя css) :-D :-D. (как глупо с моей стороны). Проблема возникла из-за того, что я сдал код в html: -? ... Спасибо, ваш ответ мне тоже помог .. :-)
Гаурав Шарма
3
Также используйте valueатрибут вместо добавления текста внутри тегов.
Жоау Кунья
2
Старый, но вкусный. Это помогло мне сегодня. @ Пекка, ты классный!
WordMan
73

Ну, все между <textarea>и </textarea>используется в качестве значения по умолчанию для вашего текстового поля. В вашем примере есть пробелы. Попробуйте устранить все это.

amarillion
источник
4
большое спасибо. Я не понимал, что все между ними по умолчанию. Я выбрал парня сверху, потому что он ответил на него первым, хотя и высмеял меня. Спасибо, что торчали за людей.
Afamee
2
Это просто. Большое спасибо!
Серхио Белевский
56

Открывайте (и закрывайте!) Свои теги PHP сразу после и до textareaтегов:

<textarea style="width:350px; height:80px;" cols="42" rows="5" name="sitelink"><?php
  if($siteLink_val) echo $siteLink_val;
?></textarea>
Барт Киерс
источник
4
это умный способ сохранить отступ в этих случаях. Спасибо!
Себастьян
Это наконец исправило мою проблему. Большое спасибо Барт
Стивен Кеннеди
32

Короче говоря: <textarea>должен быть немедленно закрыт на той же линии, где и начался.


Общая практика: это добавит разрывы строк и пробелы, используемые для отступа в коде.

<textarea id="sitelink" name="sitelink">
</textarea>

Правильная практика

<textarea id="sitelink" name="sitelink"></textarea>
Pega Wega
источник
Решил мою проблему.
S.M_Emamian
Это было идеальное решение и для меня
Шелдон Р.
Решил мою проблему, отличное решение. Спасибо
Хуснайн Шаббир
26

В основном это должно быть

<textarea>something here with no spaces in the begining</textarea>

Если есть несколько предопределенных пробелов, скажем, из-за форматирования кода, как показано ниже

<textarea>.......
....some_variable
</textarea>

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

beebek
источник
Это старый «трюк», даже иногда забытый. У нас уже были проблемы с HTML, связанные с этим, возвращаясь к IE6 / 7 .. +1
JonSnow
Спас мой день. Спасибо!
Рюэль Рибейро,
Это работает просто отлично, но это действительно забавно. Любое объяснение этой странной ошибки?
Амину Кано
11

Любое пространство между открывающими и закрывающими тегами textarea будет считаться пробелом. Таким образом, для вашего кода выше, правильный путь будет:

<textarea style="width:350px; height:80px;" cols="42" rows="5" name="sitelink"><?php if($siteLink_val) echo $siteLink_val; ?></textarea>
Gyan
источник
7

Другим обходным решением будет использование JavaScript:

//jquery
$('textarea#someid').html($('textarea#someid').html().trim());

//without jquery
document.getElementById('someid').innerHTML = document.getElementById('someid').innerHTML.trim();

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

Milad.Nozari
источник
5

Чтобы он выглядел немного чище, рассмотрите использование троичного оператора:

<textarea><?=( $siteLink_val ? $siteLink_val : '' );?></textarea>
Брайан Лейси
источник
2
Не используйте короткие теги, не предлагайте другим делать это. Это поможет людям избежать PITA при помещении какого-либо веб-приложения на рабочий сервер с другим конфигом. Спасибо.
Альфабраво
4
Я всегда использую короткие теги в шаблонных сценариях именно потому, что хочу, чтобы их использовали все больше людей, и тем самым призываю сообщество PHP продолжать их поддерживать. Тем не менее, короткие теги должны использоваться ТОЛЬКО в шаблонных сценариях, НИКОГДА в логике приложения и, совершенно очевидно, ТОЛЬКО, когда их поддерживает сервер. Всегда знайте свою производственную среду перед развертыванием. (Естественно, это не место для обсуждения плюсов и минусов коротких меток, но вы подняли его, так что это мое оправдание.)
Брайан Лейси,
4
<textarea style="width:350px; 
 height:80px;" cols="42" rows="5" name="sitelink"
 ><?php if($siteLink_val) echo $siteLink_val; ?></textarea> 

Переезд ...> У меня работает вниз.

User707
источник
4

У меня та же проблема, и решение очень простое: не начинайте новую строку! Хотя некоторые из предыдущих ответов могут решить проблему, идея четко не сформулирована. Важно понимание того , чтобы избавиться от незапланированных пространств, никогда не начать новую строку только после открывающего тега.

Следующий путь НЕПРАВИЛЬНЫЙ и оставит много нежелательных пробелов перед вашим текстовым контентом:

 <textarea>
    text content // start with a new line will leave a lot of unwanted spaces
 </textarea>

ПРАВИЛЬНЫЙ СПОСОБ сделать это:

 <textarea>text content //put text content right after your start tag, no new line
 </textarea>
Уильям Хоу
источник
3

Пожалуйста, убедитесь, что после строки нет пробела или пробела, чтобы убедиться, что нет пробелов или табуляции, просто скопируйте и вставьте этот код :) Я исправил это для вас

<textarea style="width:350px; height:80px;" cols="42" rows="5" name="sitelink"><?php if($siteLink_val) echo trim($siteLink_val);?></textarea>
кинта махаджи
источник
2

Более того: тег textarea показывает места для новых строк, вкладок и т. Д. В многострочном коде.

Гал Маргалит
источник
2

держать код textarea без дополнительных пробелов внутри

более того, если вы видите лишние пустые строки, есть решение на мета-языке:

<textarea>
for line in lines:
echo line.replace('\n','\r')
endfor
</textarea>

он будет печатать строки без дополнительных пустых строк, конечно, это зависит от того, будут ли строки заканчиваться на '\ n', '\ r \ n' или '' - пожалуйста, адаптируйте

Славомир Ленарт
источник
2

В текстовой области отображаются загадочные пробелы, поскольку в тегах существует реальное пространство. <textarea> <php? echo $var; ?> </textarea> после удаления этих лишних пробелов между тегами будет решена проблема, как изложено ниже. <textarea><php? echo $var; ?></textarea>

Ашфак Ян
источник
2

Одно из решений, которое сработало для меня, - это добавление стиля white-space: normal;к текстовой области, потому что иногда невозможно устранить все пробелы (например, когда вы хотите, чтобы ваш код соответствовал вашим правилам кодирования, требующим добавления вкладок, пробелов и разрывов строк)

Обратите внимание, что по умолчанию для textarea, по крайней мере, в Chrome: white-space: pre-wrap;

Таранджит Сингх
источник
2

Если вам все еще нравится использовать отступ, сделайте это после открытия <?phpтега, например так:

<textarea style="width:350px; height:80px;" cols="42" rows="5" name="sitelink"><?php // <--- newline
    if($siteLink_val) echo $siteLink_val; // <--- indented, newline
?></textarea>
Кемаль
источник
2

Я знаю, что уже поздно, но может помочь другим.

используйте это, когда требуется отступ документа.

$('document').ready(function()
{
    $('textarea').each(function(){
            $(this).val($(this).val().trim());
        }
    );
});

тот же вопрос

Эр Джагдиш Патель
источник
Или вы можете правильно отформатировать HTML. Но я согласен, что это может быть сложно, если вы хотите что-то вроде php-кода внутри него. Поэтому я согласен с вашим ответом.
Нильс Лукас
1

Я против HTML-кода, смешанного с PHP-кодом.

Однако попробуйте это:

<textarea style="width:350px; height:80px;" cols="42" rows="5" name="sitelink">
<?php 
    if($siteLink_val) 
        echo trim($siteLink_val);
?> 
</textarea>
streetparade
источник
3
Почти ... это все еще включает две строки.
Амариллион
Следует использовать <textarea style="width:350px; height:80px;" cols="42" rows="5" name="sitelink"><?php и ?></textarea>для того, чтобы он был действительно чистым. Кроме того, могу ли я спросить, почему вы против HTML с PHP?
FluorescentGreen5
1

Просто укажите ваш и ваш закрывающий тег в одной строке.

<textarea class="form-control"
          id="newText"
          rows="6"
          placeholder="Your placeholder here..."
          required
          name="newText"></textarea>
Эндерсон Менезес
источник
0

Кроме того, когда вы говорите, что курсор находится в «середине» текстовой области, это заставляет меня думать, что вы также можете иметь дополнительные отступы или text-align: center, определенные где-то в вашем CSS.

Брайан Лейси
источник
0

Сначала убедитесь, что ваш $ siteLink_val не возвращает пробел в качестве значения. Элемент <textarea> по умолчанию имеет пустое значение, поэтому, если переменная, которую вы выводите по какой-либо причине, имеет пробелы, у вас возникла проблема.

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

function build_siteLink_val() {
     if ( $siteLink_val ) {
          return $siteLink_val;
     }

     else {
          return "";
     }
}

$output_siteLink_val = build_siteLink_val();

И следующий код в вашей текстовой области теперь будет читать:

<textarea style="width:350px; height:80px;" cols="42" rows="5" name="sitelink"><?=$output_siteLink_val?></textarea>

Это при условии, что ваша установка PHP настроена для сокращенных вызовов переменных, как видно из сокращенных тегов <? =?>. Если вы не можете вывести этот путь, не забудьте предвосхитить ваш PHP-код "<? Php" и закрыть "?>".

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

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

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

dmanexe
источник