Существует ли способ отследить, если пользователь печатает веб-страницу?
Спасибо, Graham
Для поддержки кросс-браузера, только если вы предлагаете для управления печатью, как в, добавляя кнопку «Дисплей в формате печати», которая будет как минимум, покажет вам намерение Напечатать страницу. Однако вы не сможете остановить пользователь из печати обычным способом или обнаруживать, когда напечатана страница.
Вы можете достичь этого в IE.
Т.е. поддерживает два события с клиентами, которые вы можете обрабатывать: OnbeforePrint
и OnafterPrint
.
Вы можете добавить запрос AJAX в любом случае, который позвонит на стороне сервера страницы к, скажет, увеличивать счетчик страниц в базе данных.
Я не знаю, когда браузеры будут получать CSS, когда вы указываете их с помощью media="print"
<link rel="stylesheet" type"text/css"
href="print.css" media="print">
Если они получат его только при попытке пользователя распечатать документ, то вы можете попробовать трюк на стороне сервера, чтобы отследить его.
Попробуйте.
В Internet Explorer 5+ вы можете использовать событие OnafterPrint
, чтобы запустить запрос AJAX каждый раз, когда напечатана страница. Если вы используете jQuery jQuery , вы можете сделать следующее:
window.onafterprint = function()
{
$.post("increment_print_counter.php");
};
Тогда, возможно, вы можете использовать некоторые статистические данные, чтобы оценить количество раз, когда он был напечатан с других браузеров!
@Tahir Akhtar имел идею использования стилей для печати. Согласно комментариям, которые не работают, потому что таблица стилей всегда привлечена, независимо от того, находится ли браузер в настоящее время в представлении печати или нет.
Как насчет использования этого: используйте стиль печати и определите в нем стиль, что делает браузер извлекать определенный ресурс, когда он отображается . Ресурс вернет прозрачное изображение.
Что касается выбора свойства CSS, фоновое изображение
, потому что они обычно не отображаются браузером. Моя мысль будет -образным имиджем
или курсор
.
Я думаю Список-стиль - изображение
на абсолютно позиционированном, прозрачном
может сделать трюк, не визуально изменив ничего (я бы не смел позиционировать элемент вне Страница из-за возможных оптимизаций браузера вырезать его). Каждый доступ к этому ресурсу должен из печати страницы или предварительный просмотр печати.
Я не могу проверить это прямо сейчас, может быть, позже. Если кто-то пытается это, мне интересно услышать, работает ли это.
Вместо выполнения файла .reg
необходимо внести изменения в реестр с помощью функциональных возможностей, предусмотренных в пространстве имен Microsoft.Win32
.
Довольно просто создать раздел реестра с помощью этого API:
RegistryKey key = Registry.CurrentUser.CreateSubKey("Names");
key.SetValue("Name", "Isabella");
key.Close();
Если не требуется создать массовую загрузку новых ключей, я считаю, что API является более масштабируемым и поддерживаемым подходом. Если в какой-то момент необходимо сделать необязательным запись параметров настройки в системную или пользовательскую ветвь реестра, большая часть кода будет повторно использоваться в обоих случаях. Просто выберите другой ключ, чтобы сделать изменения.
Возможно, что более важно, API позволяет точно (в коде) указать, как обрабатывать случаи, когда вставляемые ключи уже существуют в реестре. Следует ли удалять существующие ключи и вставлять мои, обновлять значения внутри существующих ключей, молча игнорировать или создавать исключение?
-121--1325901-Для разумной реализации Java:
Каждый объект имеет заголовок, содержащий, среди прочего, указатель на тип среды выполнения (например, Double
или Последовательностей
, но никогда не может быть CharSequence
или AbstractList
). Предполагая, что компилятор среды выполнения (как правило, HotSpot в случае Sun) не может определить тип статически, некоторая проверка должна быть выполнена сгенерированным машинным кодом.
Сначала необходимо прочитать указатель на тип среды выполнения. Это в любом случае необходимо для вызова виртуального метода в подобной ситуации.
Для приведения к типу класса точно известно, сколько суперклассов существует, пока вы не нажмете java.lang.Object
, так что тип может быть считан с постоянным смещением от указателя типа (фактически первые восемь в HotSpot). Опять же, это аналогично считыванию указателя метода для виртуального метода.
Тогда считанное значение просто требует сравнения с ожидаемым статическим типом приведения. В зависимости от архитектуры набора команд другая команда должна перейти (или выйти из строя) на неправильную ветвь. ISA, такие как 32-разрядные ARM, имеют условную инструкцию и могут иметь возможность прохождения печального пути через счастливый путь.
Интерфейсы являются более сложными из-за множественного наследования интерфейса. Как правило, последние две операции с интерфейсами кэшируются во время выполнения. В САМЫЕ ранние дни (более десяти лет назад) интерфейсы были немного медленными, но это уже не актуально.
Надеюсь, вы видите, что подобные вещи в значительной степени не имеют отношения к производительности. Ваш исходный код более важен. С точки зрения производительности, самым большим попаданием в ваш сценарий могут быть промахи кэша от отслеживания указателей объектов по всему месту (информация о типе, конечно, будет общей).
-121--757853- Вы также можете добавить на страницу большую очевидную кнопку «Печать», которая вызывает window.print
и выполняет запрос AJAX, если onafterprint
недоступен.
Это не даст вам никакой статистики о пользователях, которые просто нажимают Ctrl + P (и не находятся на IE), конечно, но это даст вам что-то (если вы не против нажать кнопку «Печать» на странице).