【问题标题】:UiWebView response to window.printUiWebView 对 window.print 的响应
【发布时间】:2014-03-12 21:45:37
【问题描述】:

有没有办法从 UIWebView 检测 window.print 并做出响应?我在我的 UiWebView 中进行了打印,需要有一种方法可以从 UIWebView 对该事件做出反应。

【问题讨论】:

  • 您能否在此处添加有关“反应”含义的更多详细信息?它工作的预期句柄是什么?你需要一个Javascript句柄吗?还是原生句柄?让我知道我有一个解决方案,但不确定,因为不清楚预期的结果。
  • 我希望能够拦截window.print,然后使用本机代码打开打印对话框

标签: uiwebview uiwebviewdelegate


【解决方案1】:

首先,这是我遇到的solution。但是 UIWebview 不支持这些事件和 API,就像在桌面浏览器中一样。还没有让matchMedia 工作。可能会在我配置打印机后工作!?!。

实际原因是网页的媒体类型在UIWebView中没有从screen变为print,不像桌面浏览器,所以没有触发,到此为止。

并且 UIWebView 没有用于打印的委托方法。

无论如何,只要有意愿,就会有 [hack] 方式。两步解决方案。

第 1 步。Javascript

如果您可以访问 HTML 或 JS 文件,并且它仅用于此 UIWebView,则可以在 JS 中添加以下行

(function(){
    var originalPrintFn = window.print; // Keep it cached in this variable, just in case
    window.print = function(){
        // Trigger location change
        window.location = "your_app_scheme:print";
    }
})();

如果您无权访问 HTML 或 JS 文件,请在 UIWebView 委托中添加以下代码

[self.myWebView stringByEvaluatingJavaScriptFromString:@"(function(){var originalPrintFn = window.print;window.print = function(){window.location = 'your_app_scheme:print';}})();"];

这可以在委托的webViewDidFinishLoad 方法中完成

第 2 步。在本机中接听电话

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if ([[[request URL] absoluteString] hasPrefix:@"your_app_scheme:"]) {

        // Call the given selector
        [self performSelector:@selector(your_handle_to_print)];        
        // Cancel the event, so the webview doesn't load the url
        return NO;
    }
    return YES;
}

your_handle_to_print 之后,你可以施展你的打印魔法了。

希望这会有所帮助!

【讨论】:

  • 有没有办法支持普通打印和ios打印使用同一个按钮?或者我应该根据我是否检测到他们正在使用本机应用程序来显示/隐藏按钮?
  • @ChrisMuench 是的,这应该是可能的。通过遵循[self.myWebView stringByEvaluatingJavaScriptFromString:@"..."]; 方法而不是更改 HTML/JS 文件。这样,当网页在 Mobile Safari 或其他浏览器中打开时,打印按钮会显示正常的打印对话框。在您的本机 UIWebView 应用程序中,该方法被覆盖,因此您可以处理它
  • 我不太关注。你想让我从ios应用程序运行js来显示/隐藏点击按钮吗?
  • 从 ios native [self.myWebView stringByEvaluatingJavaScriptFromString:@"(function(){var originalPrintFn = window.print;window.print = function(){window.location = 'your_app_scheme:print';}})();"]; 运行这部分。它只会覆盖应用程序的 UIWebview 内的打印。如果在任何其他浏览器上打开相同的 HTML 页面,它将产生默认功能,即打印对话框。
  • 有谁知道这方面的安卓版?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多