我的API生成动态HTML文档并将其转储到弹出窗口中,如下所示:
var popup = window.open('', "_blank", 'toolbar=0,location=0,menubar=1,scrollbars=1');
popup.document.write(result);
用户审核文档后,他们可以打印出来调用
window.print();
Chrome可以毫无问题地处理它,但Firefox显示打印机错误:
"无法打印此文档,它仍在加载"
打印机窗口仅在我按下Ctrl + R时打开。
看来$(document).ready()
永远不会在firefox中发生,并且它一直在等待加载。
弹出窗口中的状态栏显示Read fonts.gstatic.com
以下是文档的简要内容:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="https://fonts.googleapis.com/css?family=Orbitron|Jura|Prompt" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<title>Invoice #15001</title>
<style>
...
</style>
</head>
<body>
<div id="invoice_body" >
...
</div><!-- Invoice body -->
</body>
</html>
我觉得它与Google字体有关。任何帮助表示赞赏
答案 0 :(得分:1)
当你通过&#34;&#34;作为window.open的URL,Firefox加载&#39; about:blank&#39;此时脚本安全性可能会阻止您通过http或https ...
提取外部资源我能够重现你的问题并在我尝试打印时弹出同样的错误 - 我在调用window.open时能够通过使用数据URL来使其工作...
根据您的示例,result
是一个包含弹出窗口HTML的字符串,因此您可以像这样调用window.open,并且不再使用document.write:
var popup = window.open("data:text/html;charset=utf-8,"+result, "printPopup", "toolbar=0,location=0,menubar=0,scrollbars=1");
我测试了这个,result
是一个包含以下内容的字符串:
<html><head>
<link rel="stylesheet"href="https://fonts.googleapis.com/css?family=Tangerine">
<style> body { font-family: 'Tangerine', serif; font-size: 48px; } </style>
<title>Test</title></head>
<body>
<div>Testing testing</div>
<div><a href="javascript:window.print()">Print</a></div>
</body>
</html>
点击打印链接按预期工作......
答案 1 :(得分:0)
我不得不加倍努力,但是:
我添加了服务器端代码,用于保存html文件并传递指向该文件的链接而不是html内容:
ob_start();
include('ezts_invoice_template.php');
$dom = ob_get_clean();
$ezts_file_path = EZTS_PLUGIN_PATH.'kernel/tmp/'.session_id().'_tmp.html';
$ezts_file = fopen($ezts_file_path, 'w+');
$result = fwrite($ezts_file, $dom);
fclose($ezts_file);
print_r('{"result":"success", "file":"'.plugin_dir_url(__FILE__).'tmp/'.session_id().'_tmp.html"}');
在JS中我通过PHP传递的链接打开一个弹出窗口:
var popup = window.open(result.file, "_blank", 'toolbar=0,location=0,menubar=0,scrollbars=1');
最后,在模板文件中,我添加了事件监听器,以便在窗口关闭时请求删除临时文件
window.addEventListener('beforeunload', function(event) {
window.opener.eztsApiRequest('deleteTempFile',
'',
function(result, status){ console.log(result); });
}, false);
这并不容易,但效果很好。