`
flex_莫冲
  • 浏览: 1091944 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

非IE MAC平台下window.print出现空白页的解决办法

 
阅读更多

以前在IE下用window.print实现打印由于有active等IE特性的强大功能,打印都比较简单。但是在FF,SAFARI,CHROME,以及MAC操作系统下用js实现打印会出现很多莫名其妙的问题。

1 预览和真实打印效果不同。

在不同操作系统不同浏览器及版本下,这是很正常的。以最终目标打印结果为标准。

 

2 多页打印的排版错位。

采用table动态生成tr td内容项拼凑出打印内容,但是这种效果即使预览OK了打印出来都可能是错位的。放弃这种做法。

 

3 连续打印会出现空白页。

连续打印即动态更新打印内容,(排版固定)将新的内容替换旧的内容再依次循环执行window.print。

出现空白页的原因是没有设置page-break-before和page-breake-after为avolid。

 

4 将web程序嵌入MAC XCOED程序的配置问题。

将MAC下的XCODE程序嵌入web应用,并配置打印设置的配置文件:

 

 

 

#import "mainView.h"

 

@implementation mainView

@synthesize cursorArea;

 

- (IBAction)reloadHome:(NSButton *)sender {

    [[mainWebView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://access.nmg.com.hk/"]]];

}

 

-(void)awakeFromNib{

[backGroundView setEnabled:TRUE];

//[mainWebView initWithFrame:[[NSScreen mainScreen]frame]];

[mainWebView autoresizesSubviews];

[mainWebView setFrameLoadDelegate:self];

[mainWebView setPolicyDelegate:self];

[mainWebView setUIDelegate:self];

[mainWebView setEditable:FALSE];

[[mainWebView preferences] setJavaEnabled:TRUE];

[[mainWebView preferences] setJavaScriptEnabled:TRUE];

[[mainWebView preferences] setPlugInsEnabled:TRUE];

[[mainWebView preferences] setUsesPageCache:TRUE];

[[mainWebView preferences] setJavaScriptCanOpenWindowsAutomatically:TRUE];

[[mainWebView preferences] setAllowsAnimatedImages:TRUE];

[[mainWebView preferences] setAllowsAnimatedImageLooping:TRUE];

[[mainWebView preferences] setLoadsImagesAutomatically:TRUE];

[[mainWebView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://access.nmg.com.hk/"]]];

//cursorArea = [[NSTrackingArea alloc] initWithRect:NSMakeRect(0, 0, [[NSScreen mainScreen] frame].size.width, 3) options: (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways) owner:self userInfo:nil];

    //[self addTrackingArea:cursorArea];

}

 

-(void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message

{

NSAlert *alert = [NSAlert alertWithMessageText:nil

defaultButton:@"OK"

  alternateButton:nil

  otherButton:nil

informativeTextWithFormat:@"%@",message

 ];

 

[alert setAlertStyle:NSWarningAlertStyle];

[alert beginSheetModalForWindow:[sender window]

 modalDelegate:self

didEndSelector:@selector(endAlert)

contextInfo:nil];

}

 

-(void)endAlert

{

NSLog(@"end");

}

 

- (void)moveTrackingAreaup {

[super updateTrackingAreas];

[self removeTrackingArea:cursorArea];

cursorArea = [[NSTrackingArea alloc] initWithRect:NSMakeRect(0, 0, [[NSScreen mainScreen] frame].size.width, 60) options: (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways) owner:self userInfo:nil];

[self addTrackingArea:cursorArea];

}

 

-(void)moveTrackingAreadown{

[super updateTrackingAreas];

[self removeTrackingArea:cursorArea];

cursorArea = [[NSTrackingArea alloc] initWithRect:NSMakeRect(0, 0, [[NSScreen mainScreen] frame].size.width, 3) options: (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways) owner:self userInfo:nil];

[self addTrackingArea:cursorArea];

}

 

/*- (void)mouseEntered:(NSEvent *)event

{

[[mainWebView animator] setFrameOrigin:NSMakePoint([mainWebView frame].origin.x,60)];

[[buttonControlView animator] setAlphaValue:1];

//if ([backGroundView isEnabled] == FALSE) {

// [backGroundView setEnabled:TRUE];

// }

[self performSelector:@selector(moveTrackingAreaup)];

}*/

 

-(void)hideFunction{

if ([backGroundView isEnabled] == TRUE) {

[backGroundView setEnabled:FALSE];

}

}

 

/*- (void)mouseExited:(NSEvent *)event{

[self performSelector:@selector(moveTrackingAreadown)];

[[mainWebView animator] setFrameOrigin:NSMakePoint([[NSScreen mainScreen] frame].origin.x,[[NSScreen mainScreen] frame].origin.y)];

[[buttonControlView animator] setAlphaValue:0];

// [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(hideFunction) userInfo:nil repeats:NO];

}*/

 

//-(void)dealloc{

// [super dealloc];

//}

 

#pragma mark - WebUIDelegate

- (void)webView:(WebView *)sender printFrameView:(WebFrameView *)frameView

{

    if ([frameView documentViewShouldHandlePrint]) {

        [frameView printDocumentView];

    } else {

        NSPrintInfo *printInfo;

        NSPrintOperation *printOp; 

        NSMutableDictionary *printInfoDict;

 

        printInfoDict = [NSMutableDictionary dictionaryWithDictionary: 

                         [[NSPrintInfo sharedPrintInfo] dictionary]]; 

 

        [printInfoDict setObject:NSPrintSpoolJob forKey:NSPrintJobDisposition];

 

        printInfo = [[NSPrintInfo alloc] initWithDictionary: printInfoDict]; 

       // [printInfo setHorizontalPagination: NSFitPagination]; 

//        [printInfo setVerticalPagination: NSFitPagination]; 

[printInfo setHorizontalPagination: NSClipPagination];

[printInfo setVerticalPagination: NSClipPagination];

      //  [printInfo setVerticallyCentered:NO];

        [printInfo setOrientation:NSLandscapeOrientation];

        [printInfo setLeftMargin:-5];

        [printInfo setTopMargin:0];

[printInfo setRightMargin:0];

        [printInfo setBottomMargin:-30];

[printInfo setPaperSize:NSMakeSize(120, 240)];

[printInfo setScalingFactor:1];

 

        printOp = [NSPrintOperation printOperationWithView:[frameView documentView]  

                                                 printInfo:printInfo]; 

        [printOp setShowsPrintPanel:NO]; 

        [printOp runOperation];

    }

}

 

@end


配置项比较直观,能看得懂。

5 内容采用下拉框(动态显示)和直接显示(静态)的打印效果不同

采用下拉框动态显示会出现如果打多页第一页就是空白页。而静态不会。(后来证实,只有6页以上才不会,2-5页都会有空白页)。同样是page-breake的问题。

 

6 显示打印内容隐藏不打印内容

使用两个css文件。一个main.css一个print.css。
<link href="style/main.css" rel="stylesheet" type="text/css" media="screen"/>
<link href="style/print.css" rel="stylesheet" type="text/css" media="print"/>

打印时使用print.css。在print.css中将要隐藏的内容都隐藏了,要打印的显示出来。这时会显示打印的内容会使页面看起来比较乱。但是如果是直接打印不需要预览则不会看到(速度快)。预览的话还是建议新窗口显示预览结果。

分享到:
评论

相关推荐

    html和js通过window.print()实现调用浏览器打印带背景图片和生成二维码的文件功能

    `window.print()` 是JavaScript中的一个内置方法,它可以帮助我们轻松实现这个需求。本篇将详细介绍如何利用HTML和JavaScript通过`window.print()`来实现这一功能。 首先,`window.print()` 方法是JavaScript中的一...

    window.print().txt

    根据提供的文件信息,我们可以推断出本文主要讨论的是关于网页打印功能的相关知识点,特别是如何使用JavaScript中的`window.print()`方法来实现网页内容的打印,并且提到了如何利用`onbeforeprint`与`onafterprint`...

    window.print分页打印

    `window.print()` 是JavaScript中的一个内置函数,它用于触发浏览器的打印对话框,让用户可以选择打印网页内容。在这个主题下,我们将深入探讨`window.print()`分页打印的相关知识点,以及如何通过`printTest.html`...

    javascript实现window.print()去除页眉页脚

    打印时去除页眉页页脚 打印前加入下面代码即可 var HKEY_Root,HKEY_Path,HKEY_Key; 代码如下: HKEY_Root=”HKEY_CURRENT_USER”; HKEY_Path=”\\Software\\Microsoft\\Internet Explorer\\PageSetup\\”; var head,...

    web打印 window.print()介绍

    `window.print()` 是JavaScript中一个非常实用的函数,用于触发浏览器的打印对话框,让用户可以选择打印当前页面或部分内容。本文将详细介绍如何使用`window.print()` 实现Web打印,并提供示例代码帮助理解。 1. **...

    IE11没有window.attachEvent方法处理方法

    本文将详细介绍如何解决IE11不支持`window.attachEvent`的问题,并提供具体的解决方案。 #### 1. 了解`attachEvent`与`addEventListener` 首先,我们需要理解`attachEvent`与`addEventListener`的区别。`...

    window.name解决跨域问题的文档

    在实际应用中,window.name 传输技术可以用于解决跨域数据传输问题,例如在社交媒体平台上分享数据、在不同的域名之间传输数据等等。同时,也可以用于解决 Cookie 的一些劣势,例如 Cookie 的大小限制、数据类型限制...

    莱鸟介绍window.print()方法

    `window.print()`方法是JavaScript中的一个内置方法,主要用于在用户浏览器上打开打印对话框,让用户可以选择打印网页内容。这个方法非常实用,尤其对于那些需要提供打印功能的网站来说,如在线文档、报告或者表格等...

    window.location.href页面跳转的用法(区别于redirect)

    ### window.location.href页面跳转的用法(区别于redirect) #### 概述 在Web开发过程中,页面跳转是一项常见的需求。通常我们会使用`Response.Redirect`来进行页面跳转,但这种方式无法在跳转前执行客户端脚本...

    火狐浏览器不支持window.event的解决办法

    火狐浏览器不支持window.event的解决办法,解决不同浏览器针对window.event的差异

    window.open.txt

    根据提供的文件信息,我们可以深入探讨`window.open()`方法在不同浏览器环境下的特性和使用细节。 ### window.open() 方法概述 `window.open()`是JavaScript中一个非常实用的方法,它用于在一个新的浏览器窗口或...

    javascript 打开页面window.location和window.open的区别.docx

    - **window.open** 更适合用于打开新的浏览器窗口或标签页,特别是在需要弹出新窗口的情况下。 #### 五、安全性和隐私考虑 - 使用 `window.open` 打开新窗口可能会触发浏览器的安全策略,尤其是当涉及到跨域请求时...

    window.print打印指定div实例代码

    `window.print()` 是JavaScript中的一个方法,它用于打开浏览器的打印对话框,从而让用户选择打印当前网页。但是,这个方法默认会打印整个页面,包括用户可能不希望打印的导航、侧边栏或者其他元素。在这种情况下,...

    window.print打印指定div指定网页指定区域的方法

    `window.print()` 是JavaScript中的一个内置函数,用于打开浏览器的打印对话框,让用户选择打印当前网页。但是,它默认会打印整个网页的所有内容。在本文中,我们将探讨如何利用 `window.print()` 结合其他技术来...

    window.showModalDialog模式对话框和 window.open的区别

    `window.showModalDialog` 和 `window.open` 都是JavaScript提供的两种打开新窗口的方法,但它们在功能和使用场景上有着显著的区别。 首先,我们来详细探讨`window.showModalDialog`。`showModalDialog`方法用于...

    原生JS打印插件之jQuery.EasyPrint.js使用文档

    调用浏览器自带打印功能,使用JavaScript的 window.print(); 方法。 使用JS实现打印功能;JavaScript 实现打印操作;javascript打印大全;通用;js实现打印的方式;JS怎么实现页面打印呢?JavaScript 实现打印,打印...

    字符串 window.open() window.opener window.name window对象等的总结

    这可以用来在页面间传递数据,特别是在`window.open()`的场景下。 ```javascript // 设置窗口名字 window.name = 'myUniqueName'; // 之后可以通过这个名字获取到该窗口 var newWindow = window.open('', '...

Global site tag (gtag.js) - Google Analytics