确定浏览器是否支持打印

8
我认为答案几乎肯定是否定的,因为我已经进行了一些测试和搜索,但有没有什么技巧可以检测页面内 window.print() 是否能够工作(即来自JavaScript)? 我知道即使在台式机/笔记本电脑上,也永远不可能知道系统上是否配置了打印机,但至少浏览器会弹出打印对话框。

我的Android手机有一个window.print()功能,但它(不出所料)什么也没做。

再次强调,主要是为了在SO上有一个好问题。 :-)

3个回答

5
很遗憾,看起来不行。 window.print() 函数不是 EMCAScript 规范的一部分。这意味着它不需要成为JavaScript语言的一部分,并且没有适当的实现文档。这是未定义的行为,因此测试它看起来非常困难。
来源:

编辑:

我写了一个可爱的小脚本来测试我的浏览器,它只检查打印功能是否存在,然后询问是否要打印:

if(window.print) {
    if(confirm('I can print. Would you like to?'))
        window.print()
}

是的,这基本上就是我决定的。也许现在这也可以作为一个很好的参考点 :-) - Pointy
@Pointy 可以将此社区设为维基,并建议人们添加不支持打印功能的任何浏览器吗? - Jivings
谢谢你提供的代码,但是它显示你的脚本无法工作。至少在我的设备上(使用Windows Phone 8),它会显示确认对话框,但如果我接受后什么也不会发生。 - Fernando
1
@Fernando 这是很久以前的事了。但我相当确定这个答案的重点是证明它不起作用。 - Jivings
对不起Jivings,你是正确的。我以为这是一个测试浏览器是否可以打印的脚本,但实际上它是一个测试window.print是否可用以测试浏览器是否可以打印的脚本,我说得对吗? - Fernando
对我来说,这个代码可以工作(至少检查浏览器是否支持打印的部分可以):if(window.print()) { - Nenad Bulatović

5

print()方法是同步的。这使得可以按顺序执行后续操作,以决定是否显示打印对话框。

var start = +new Date();
window.print();
var delta = + new Date() - start;
console.log(delta);
if (delta > 100) { console.log('It worked'); }

虽然用户必须尝试打印以测试是否可以打印:)。无论如何,您可以使用此脚本,并在打印失败时显示消息(而不是delta> 100)。 - Fernando
我假设如果浏览器定义了window.print(以避免尝试调用它的脚本中断),但实际上并没有执行任何操作,那么处理下一行代码所需的时间应该少于100毫秒。我很喜欢这个想法。只是希望有一种方法可以在不实际调用它的情况下进行测试!虽然这是我迄今为止看到的最好的解决方案。 - jinglesthula
1
顺便提一下,如果有人对那个加号感到困惑,请参考https://dev59.com/Y3VC5IYBdhLWcg3wpjB8 - jinglesthula
1
我测试过在运行iOS 4.2.1的iPhone 3G、运行iOS 7的4S、运行iOS 7的5S和运行不知道什么系统的Galaxy Note 2。4S 的延迟在79-99毫秒范围内,5S 在25-26毫秒范围内,3G 在2-3毫秒范围内(无打印支持),Note 在0-3毫秒范围内(有打印支持)。至少在Note上,print()似乎是异步的:(,我们能做的最好的就是提供适当的提示信息并希望安卓用户没有注意到它,因为在他们的打印对话框关闭之前它会淡出。 - jinglesthula

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接