В GitHub имеется удобная библиотека:
https://github.com/serkanyersen/ifvisible.js
Пример:
// If page is visible right now
if( ifvisible.now() ){
// Display pop-up
openPopUp();
}
Я тестировал версию 1.0.1 во всех браузерах, которые у меня есть, и могу подтвердить, что он работает с:
... и, возможно, все более новые версии.
Не работает в полной мере с:
.now()
всегда возвращает true
для меня) Чтобы сопоставить любой пробел, кроме новой строки, вы можете использовать [^\S\n]
класс отрицанных символов. Или [\s-[\n]]
, но я предпочитаю первый, так как он переносим на другие движки регулярных выражений.
Теперь вы можете использовать регулярное выражение, которое будет соответствовать необязательным символам новой строки слева и справа от 1+ пробелов, отличных от новой строки. Затем вы можете проверить, совпадали ли какие-либо символы новой строки, и, если да, опустить пропущенный пробел, в противном случае заменить совпадение пробелом. Затем вам нужно будет заменить любые фрагменты из 3 или более символов новой строки двумя символами новой строки.
var result = Regex.Replace(input, @"(\n?)[^\S\n]+(\n?)", m =>
!string.IsNullOrEmpty(m.Groups[1].Value) || !string.IsNullOrEmpty(m.Groups[2].Value) // If any \n matched
? $"{m.Groups[1].Value}{m.Groups[2].Value}" // Concat Group 1 and 2 values
: " "); // Else, replace the 1+ whitespaces matched with a space
var final_result = Regex.Replace(result, @"\n{3,}", "\n\n"); // Replace 3+ \ns with two \ns
Подробности
(\n?)
- Захват группы 1: необязательный символ новой строки [^\S\n]+
- 1+ пробелы, отличные от новой строки [ 118] (\n?)
- Группа захвата 2: необязательный перевод новой строки \n{3,}
- 3 или более новых строк. Простое многошаговое решение выглядит следующим образом:
Все пробельные символы, кроме символов новой строки, должны быть преобразованы в пробел (т. Е. \ F, \ r, \ t, \ v будут преобразованы в пробел)
blockquote>output = Regex.Replace(input, "[\\f\\r\\t\\v ]+", " ");
Пробел входит в вышеуказанную группу.
Если пробел предшествует или следует за новой строкой, пробел должен быть удален.
blockquote>output = Regex.Replace(output, " \n", "\n"); output = Regex.Replace(output, "\n ", "\n");
Приведенные выше два можно вместо этого изменить на использование
String.Replace
в стиле:output = output.Replace(" \n", "\n"); output = output.Replace("\n ", "\n");
или даже на:
output = output.Replace(" \n", "\n").Replace("\n ", "\n");
[1114 ] Строка не может иметь два или более последовательных пробелов, кроме новых строк. Новые строки ограничиваются максимум двумя последовательными вхождениями (т. Е. \ N все в порядке, \ n \ n тоже хорошо, но \ n \ n \ n недопустимо и должно быть заменено на \ n \ n).blockquote>
output = Regex.Replace(output, "\n\n\n+", "\n\n");
Как в стороне. Если система использует
\r\n
для последовательностей новой строки, то подавление символов\r
может привести к нежелательным результатам.