#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');