如何向浏览器提供与浏览器不同的内容?

时间:2012-02-16 17:39:29

标签: php apache

我希望能够检测到它是打印机而不是请求网页的浏览器。

我知道用户代理字符串和“媒体打印”样式表,但是,我想提供不同的内容,以便在请求“打印”页面时重定向到PDF(或不重定向)。因此,标题中有什么(如果有的话)我可以继续确定是(例如)Firefox浏览器请求打印页面还是Firefox浏览器请求媒体=屏幕页面?

3 个答案:

答案 0 :(得分:1)

无法从服务器端检测到“正在向打印机发送内容”,因为浏览器在此上下文中不会发出单独的请求。

上述唯一的警告是浏览器可能会请求打印样式表如果它的缓存中没有该资源,那么您可以使用这样的存在确定浏览器确实为打印机呈现内容的请求(注意:与打印内容不同,因为用户可以简单地取消打印对话框)...虽然你仍然卡住因为会有无法更改浏览器已下载的内容。

您最好的选择是包含指向内容“打印版本”的链接。

编辑(主要是为了好玩):

现在也许,也许,也许,您可以在客户端打开与服务器的套接字连接,当服务器检测到打印样式表的请求时,它使用cookie值来识别请求哪个客户端资源,它通过套接字向客户端发回通知,为其提供要呈现的新内容。

当然,你仍然坚持,因为:

  • 这会在浏览器缓存打印样式表的那一刻停止工作。
  • 它会创建竞争条件 - 来自服务器的新内容是否会在开始呈现打印内容之前到达浏览器?或者浏览器会先“冻结”当前视图吗?
  • 即使假设您在打印文档时设法注入了备用内容...当用户关闭打印对话框时,您将如何更改它?
  • 真的,你试过“打印版”链接吗?

答案 1 :(得分:0)

<link rel="stylesheet" type="text/css" href="print.css" media="print" />

然后隐藏你不想用样式表打印的东西,并显示你想要打印的东西......


在请求打印页面时,没有特殊的用户代理字符串或任何转换为​​服务器的信息。此操作纯粹是客户端,因此唯一的解决方案是客户端解决方案。 CSS是处理这个问题的方法。

答案 2 :(得分:0)

当您打印网页时,浏览器不会从服务器重新请求页面,而只是在发出打印命令时打印页面的当前内容。真正实现您所谈论的内容的唯一方法是在页面上构建您自己的“打印”按钮,这将打开一个新窗口或更改页面内容,然后再使用Javascript向浏览器发出打印命令。