programing

javascript를 사용하여 div를 angular로 인쇄합니다.JS 단일 페이지 응용 프로그램

abcjava 2023. 4. 1. 08:07
반응형

javascript를 사용하여 div를 angular로 인쇄합니다.JS 단일 페이지 응용 프로그램

저는 angularJs를 사용한 한 페이지 웹 어플리케이션을 가지고 있습니다.특정 페이지의 div를 인쇄해야 합니다.다음을 시도했습니다.

페이지에 div가 거의 없습니다(print.html).

<div>
  <div>
    Do not print
  </div>
  <div id="printable">
    Print this div
  </div>
  <button ng-click="printDiv('printableArea');">Print Div</button>
</div>

컨트롤러에는 다음 스크립트가 있습니다.

$scope.printDiv = function(divName) {
    var printContents = document.getElementById(divName).innerHTML;
    var originalContents = document.body.innerHTML;        
    document.body.innerHTML = printContents;
    window.print();
    document.body.innerHTML = originalContents;
}

이 코드는 원하는 div를 인쇄하지만 문제가 있다.성명서document.body.innerHTML = originalContents;는 SPA이기 때문에 어플리케이션 전체의 본문을 대체합니다.그래서 페이지를 새로 고치거나 인쇄 버튼을 다시 클릭하면 페이지의 내용이 모두 지워집니다.

$scope.printDiv = function(divName) {
  var printContents = document.getElementById(divName).innerHTML;
  var popupWin = window.open('', '_blank', 'width=300,height=300');
  popupWin.document.open();
  popupWin.document.write('<html><head><link rel="stylesheet" type="text/css" href="style.css" /></head><body onload="window.print()">' + printContents + '</body></html>');
  popupWin.document.close();
} 

두 가지 조건부 기능이 필요합니다. 하나는 Google Chrome용이고 다른 하나는 나머지 브라우저용입니다.

$scope.printDiv = function (divName) {

    var printContents = document.getElementById(divName).innerHTML; 

    if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {
        var popupWin = window.open('', '_blank', 'width=600,height=600,scrollbars=no,menubar=no,toolbar=no,location=no,status=no,titlebar=no');
        popupWin.window.focus();
        popupWin.document.write('<!DOCTYPE html><html><head>' +
            '<link rel="stylesheet" type="text/css" href="style.css" />' +
            '</head><body onload="window.print()"><div class="reward-body">' + printContents + '</div></body></html>');
        popupWin.onbeforeunload = function (event) {
            popupWin.close();
            return '.\n';
        };
        popupWin.onabort = function (event) {
            popupWin.document.close();
            popupWin.close();
        }
    } else {
        var popupWin = window.open('', '_blank', 'width=800,height=600');
        popupWin.document.open();
        popupWin.document.write('<html><head><link rel="stylesheet" type="text/css" href="style.css" /></head><body onload="window.print()">' + printContents + '</body></html>');
        popupWin.document.close();
    }
    popupWin.document.close();

    return true;
}

이제 angular-print라는 라이브러리를 사용할 수 있습니다.

이렇게 했습니다.

$scope.printDiv = function (div) {
  var docHead = document.head.outerHTML;
  var printContents = document.getElementById(div).outerHTML;
  var winAttr = "location=yes, statusbar=no, menubar=no, titlebar=no, toolbar=no,dependent=no, width=865, height=600, resizable=yes, screenX=200, screenY=200, personalbar=no, scrollbars=yes";

  var newWin = window.open("", "_blank", winAttr);
  var writeDoc = newWin.document;
  writeDoc.open();
  writeDoc.write('<!doctype html><html>' + docHead + '<body onLoad="window.print()">' + printContents + '</body></html>');
  writeDoc.close();
  newWin.focus();
}

이게 Chrome과 Firefox에서 작동한 거예요!그러면 작은 인쇄 창이 열리고 인쇄를 클릭하면 자동으로 닫힙니다.

var printContents = document.getElementById('div-id-selector').innerHTML;
            var popupWin = window.open('', '_blank', 'width=800,height=800,scrollbars=no,menubar=no,toolbar=no,location=no,status=no,titlebar=no,top=50');
            popupWin.window.focus();
            popupWin.document.open();
            popupWin.document.write('<!DOCTYPE html><html><head><title>TITLE OF THE PRINT OUT</title>' 
                                    +'<link rel="stylesheet" type="text/css" href="app/directory/file.css" />' 
                                    +'</head><body onload="window.print(); window.close();"><div>' 
                                    + printContents + '</div></html>');
            popupWin.document.close();

좋아요, 다른 접근법이 있을지도 몰라요

나는 그것이 모두에게 적합하지는 않을 것이라는 것을 알고 있지만 그럼에도 불구하고 누군가는 그것이 유용하다고 생각할 수 있다.

저처럼 새 창을 팝업하고 싶지 않은 분들과 css 스타일에 관심이 있는 분들을 위해 제가 생각해낸 것은 다음과 같습니다.

인쇄 시에는 숨겨져 있는 추가 컨테이너에 앱의 뷰를 감쌌고, 인쇄 시에는 인쇄해야 할 것을 표시하는 추가 컨테이너가 있습니다.

다음 작업 예시는 다음과 같습니다.

var app = angular.module('myApp', []);
	app.controller('myCtrl', function($scope) {
  
    $scope.people = [{
      "id" : "000",
      "name" : "alfred"
    },
    {
      "id" : "020",
      "name" : "robert"
    },
    {
      "id" : "200",
      "name" : "me"
    }];

    $scope.isPrinting = false;
		$scope.printElement = {};
		
		$scope.printDiv = function(e)
		{
			console.log(e);
			$scope.printElement = e;
			
			$scope.isPrinting = true;
      
      //does not seem to work without toimeouts
			setTimeout(function(){
				window.print();
			},50);
			
			setTimeout(function(){
				$scope.isPrinting = false;
			},50);
			
			
		};
    
  });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="myApp" ng-controller="myCtrl">

	<div ng-show="isPrinting">
		<p>Print me id: {{printElement.id}}</p>
    <p>Print me name: {{printElement.name}}</p>
	</div>
	
	<div ng-hide="isPrinting">
    <!-- your actual application code -->
    <div ng-repeat="person in people">
      <div ng-click="printDiv(person)">Print {{person.name}}</div>
    </div>
  </div>
  
  
</div>
	

이 솔루션은 우아한 솔루션이 아니며 몇 가지 단점도 있지만 다음과 같은 단점도 있습니다.

  • 팝업창이 필요 없습니다.
  • css를 그대로 유지하다
  • 페이지 전체를 var에 저장하지 않음(어떤 이유로든 원하지 않음)

음, 이 글을 읽고 있는 사람이 누구든 좋은 하루 보내시고 계속 코딩하세요:)

편집:

상황에 맞는 경우 실제로 다음을 사용할 수 있습니다.

@media print  { .noprint  { display: none; } }
@media screen { .noscreen { visibility: hidden; position: absolute; } }

각 부울 대신 인쇄 및 비인쇄 콘텐츠를 선택합니다.

편집:

페이지 로드/새로고침 후 처음 인쇄할 때 display:none이 인쇄를 중단하는 것처럼 보여 화면 css를 변경.

가시성: 아직까지는 숨겨진 접근법이 효과가 있는 것 같습니다.

이렇게 큰 코드를 쓸 필요는 없을 것 같아요.

방금 앵귤러 프린트의 바우어 패키지를 설치했는데, 모든 것이 준비되었습니다.

모듈에 삽입하기만 하면 모든 준비가 완료됩니다.사전 빌드된 인쇄 지침을 사용하여 인쇄를 원하지 않을 경우 일부 div를 숨길 수도 있습니다.

http://angular-js.in/angularprint/

내 거는 잘 돼.

언급URL : https://stackoverflow.com/questions/22189544/print-a-div-using-javascript-in-angularjs-single-page-application

반응형