Как в браузере определить, какой вариант разрывов строк подходит для ОС?

#javascript #dom #cross-browser

#javascript #dom #кроссбраузерность

Вопрос:

n или rn (или даже r ) другими словами. Я стремлюсь избегать прослушивания строки пользовательского агента.

Первая попытка:

 var osLineBreak = (function () {
  var p = document.createElement('p');
  p.innerHTML = '<br>';
  return p.innerText;
}());
  

К сожалению, Firefox не предоставляет innerText и textContent возвращает пустую строку в этом случае.

Вторая попытка:

 var osLineBreak = (function () {
  var
    lineBreak,
    body = document.body,
    range = document.createRange(),
    selection = window.getSelection(),
    p = document.createElement('p');

  // we cannot make a selection unless `p` is in the DOM,
  // so ensure that it is not visible when we insert it
  p.style.position = 'absolute';
  p.style.left = '-9999px';
  // Firefox returns the empty string if `innerHTML` is
  // set to "<br>", so include leading and trailing
  // characters
  p.innerHTML = '%<br>%';
  body.appendChild(p);
  // wrap `p` in `range`
  range.selectNodeContents(p);
  // make a selection from `range`
  selection.addRange(range);
  // see how the line break is treated in the selection
  // (provide a sane fallback in case we get the empty string)
  lineBreak = /%(.*)%/.exec(selection.toString())[1] || 'n';
  // revert our fiddlings
  selection.removeAllRanges();
  body.removeChild(p);
  return lineBreak;
}());
  

Есть ли менее сложный метод, который я упустил из виду?

Комментарии:

1. просто любопытно, почему это имеет значение?

2. Обратите внимание, что строка, присвоенная свойству textContent или innerText , не анализируется, она обрабатывается как буквальный текст. Кроме того, innerText является проприетарным расширением Microsoft (стандарта нет) и поддерживается не всеми браузерами. textContent — это свойство ядра W3C DOM 3 , которое также поддерживается не всеми браузерами, но большинство поддерживает один или другой, некоторые оба.

3. @jcomeau_ictx Хороший вопрос. Я работаю над улучшением редактора Hashify . Когда пользователь нажимает enter , должна быть вставлена соответствующая комбинация начальных пробелов и / или табуляций. Большинство редакторов делают это (или более интеллектуальную его версию), и это особенно полезно при написании фрагментов кода. Поскольку Markdown требует, чтобы фрагменты кода имели отступ в четыре пробела, в конечном итоге приходится вводить пять нажатий клавиш между одной строкой кода и следующей.

4. Хм. Жаль, что Java в наши дни часто отключается. Простой апплет Java 1.1, который делает System.getProperty("line.separator") , сделал бы это.

5. Я бы хотел, чтобы кто-нибудь сказал мне, что такая вещь доступна и через JavaScript. На самом деле, специфичное для Firefox свойство было бы прекрасным, поскольку innerText подход работает в других браузерах.

Ответ №1:

Обновление 2015 года: Как вы можете видеть из приведенного ниже, даже в 2011 году Chrome и Firefox использовались n на всех платформах. Opera и IE, используемые rn в Windows. С тех пор Opera перешла на WebKit, как Chrome, и, таким образом, предположительно использует n . IE8 был последним IE, который использовался rn в текстовых областях; начиная с IE9, IE также использует just n . Не тестировал мобильные браузеры.


Мы довольно поздно пришли на вечеринку, но если вы действительно хотите знать, какой символ разделителя строк браузер использует в textarea s и тому подобном (который может варьироваться в пределах браузера даже в одной и той же ОС), вы можете выяснить это с помощью хитрого трюка:

 function getLineBreakSequence() {
    var div, ta, text;

    div = document.createElement("div");
    div.innerHTML = "<textarea>onentwo</textarea>";
    ta = div.firstChild;
    text = ta.value;
    return text.indexOf("r") >= 0 ? "rn" : "n";
}
  

Это работает, потому что браузеры, которые используют rn преобразование n «на лету» при разборе HTML-строки. Вот работающая в реальном времени копия, которую вы можете попробовать сами в своих любимых браузерах. В IE и Opera (даже Opera, работающая на * nix), вы обнаружите, что это rn . В Chrome, Firefox и Safari (даже запущенных в Windows) вы обнаружите, что это n .

Тем не менее, мой опыт показывает, что вставка n (например, при присвоении value свойству, в отличие от приведенного выше фрагмента HTML-строки) работает даже в браузерах, которые обычно используют rn . Но это не значит, что нет крайних случаев, и я должен признать, что я не делаю этого (вставляю разрывы строк в textarea s) с какой-либо регулярностью, поэтому, если есть проблемы, и я действительно должен использовать rn в некоторых браузерах, я, возможно, просто не нашел их.

Ответ №2:

На веб-странице формат перевода строки в операционной системе не имеет значения. При воспроизведении на веб-странице не учитываются разрывы строк. Для этого вам нужен элемент BR или block, а они являются кроссплатформенными и поддерживаются во всех браузерах.

Смотрите эту страницу для упрощенного объяснения.

Обновить:

Итак, необходимость if для форматирования текстового поля, и там важны разрывы строк. Извините за недопонимание, мой английский немного хромает.

Начните с определения операционной системы вашего пользователя с помощью чего-то подобного этому:

  var OSName="Unknown OS";

 if (navigator.appVersion.indexOf("Win")!=-1) OSName="Windows";
 if (navigator.appVersion.indexOf("Mac")!=-1) OSName="MacOS";
 if (navigator.appVersion.indexOf("X11")!=-1) OSName="UNIX";
 if (navigator.appVersion.indexOf("Linux")!=-1) OSName="Linux";

document.write('Your OS: ' OSName);
  

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

Затем задайте окончания строк в переменной, в зависимости от возвращаемой операционной системы, и создайте свою строку на основе этого. Ie:

 if (navigator.appVersion.indexOf("Win")!=-1){
    OSName="Windows";
    linebreak = "rn";
} // etc ...
  

Комментарии:

1. Разрывы строк и пробелы сохраняются внутри элементов PRE, но в остальном вы правы.

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

3. @davidchambers — Ах, да, теперь я понимаю, тогда посмотрите мой пересмотренный ответ.

4. На самом деле операционная система этого не диктует. Opera, например, использует rn даже на * nix. Chrome, Firefox и Safari используют n даже в Windows. Но, к счастью, мы можем функционально определять , что используется (подробности см. в моем ответе).

Ответ №3:

если вам действительно по какой-то причине нужен элемент break, почему бы вам просто:

 var br=document.createElement('br');