Vue ページ印刷で自動ページングを実装する 2 つの方法

Vue ページ印刷で自動ページングを実装する 2 つの方法

この記事では、ページ印刷の自動ページングを実現するためのVueの具体的なコードを例として紹介します。具体的な内容は次のとおりです。

1. 印刷する要素を参照によって取得する

1. jsファイルをカプセル化する

// クラス属性、メソッド定義を印刷/* eslint-disable */
const Print = 関数 (dom, オプション) {
  if (!(this instanceof Print)) return new Print(dom, options);

  this.options = this.extend({
    'noPrint': '.no-print'
  }, オプション);

  if ((typeof dom) === "文字列") {
    DOM をクエリセレクターとして使用します。
  } それ以外 {
    this.isDOM(DOM) は、
    this.dom = this.isDOM(dom) ? dom : dom.$el;
  }

  これを初期化します。
};
印刷.プロトタイプ = {
  初期化: 関数 () {
    var コンテンツ = this.getStyle() + this.getHtml();
    this.writeIframe(コンテンツ);
  },
  拡張: 関数 (obj, obj2) {
    (変数 k 内の obj2) {
      obj[k] = obj2[k];
    }
    obj を返します。
  },

  getStyle: 関数 () {
    var str = "",
      スタイル = document.querySelectorAll('style,link');
    (var i = 0; i < スタイルの長さ; i++) {
      str += スタイル[i].outerHTML;
    }
    str += "<style>" + (this.options.noPrint ? this.options.noPrint : '.no-print') + "{display:none;}</style>";
    str += "<style>html,body,div{height: auto!important;font-size:12px}</style>";

    str を返します。
  },

  getHtml: 関数 () {
    var 入力 = document.querySelectorAll('input');
    var textareas = document.querySelectorAll('textarea');
    var selects = document.querySelectorAll('select');

    (var k = 0; k < inputs.length; k++) の場合 {
      if (inputs[k].type == "チェックボックス" || inputs[k].type == "ラジオ") {
        入力[k]がチェックされている場合、
          inputs[k].setAttribute('checked', "checked")
        } それ以外 {
          inputs[k].removeAttribute('checked')
        }
      } そうでなければ (inputs[k].type == "text") {
        入力[k].setAttribute('値', 入力[k].値)
      } それ以外 {
        入力[k].setAttribute('値', 入力[k].値)
      }
    }

    (var k2 = 0; k2 < textareas.length; k2++) {
      テキストエリア[k2].type == 'テキストエリア'の場合{
        テキストエリア[k2].innerHTML = テキストエリア[k2].値
      }
    }

    (var k3 = 0; k3 < selects.length; k3++) の場合 {
      if (selects[k3].type == 'select-one') {
        var child = selects[k3].children;
        (変数 i 内の子) {
          if (child[i].tagName == 'OPTION') {
            子[i]が選択されている場合 == true
              child[i].setAttribute('selected', "selected")
            } それ以外 {
              child[i].removeAttribute('選択された')
            }
          }
        }
      }
    }
    this.dom.outerHTML を返します。
    // 印刷する要素をラップします // 修正: https://github.com/xyl66/vuePlugs_printjs/issues/36
    // outerHTML = this.wrapperRefDom(this.dom).outerHTML とします
    // 外側のHTMLを返します。
  },
  // 親要素にループし、印刷する必要のある要素をラップします // ルートレベルの先頭にある CSS セレクターが有効にならないようにします wrapperRefDom: function (refDom) {
    prevDom = null とする
    currDom = refDomとする
    // 現在の要素が本文内にあるかどうかを判定します。文書内にない場合は、ノードを直接返します。if (!this.isInBody(currDom)) return currDom

    while (currDom) {
      if (前のドメイン) {
        要素をcurrDom.cloneNode(false)にします
        要素.appendChild(前のDom)
        prevDom = 要素
      } それ以外 {
        prevDom = currDom.cloneNode(true)
      }

      currDom = currDom.parentElement
    }

    前のDomを返す
  },

  writeIframe: 関数 (コンテンツ) {
    var w, doc, iframe = document.createElement('iframe'),
      ドキュメントのボディに iframe を追加します。
    iframe.id = "myIframe";
    //iframe.style = "位置:absolute;幅:0;高さ:0;上:-10px;左:-10px;";
    iframe.setAttribute('style', '位置:絶対;幅:0;高さ:0;上:-10px;左:-10px;');
    f.contentDocument は、次のコードで使用できます。
    doc = f.contentDocument || f.contentWindow.document;
    ドキュメントを開きます。
    doc.write(コンテンツ);
    ドキュメントを閉じる();
    var _this = これ
    iframe.onload = 関数(){
      _this.toPrint(w);
      setTimeout(関数() {
        document.body.removeChild(iframe)
      }, 100)
    }
  },

  toPrint: 関数 (frameWindow) {
    試す {
      setTimeout(関数() {
        フレームウィンドウにフォーカスを当てます。
        試す {
          frameWindow.document.execCommand('print', false, null) の場合 {
            フレームウィンドウを印刷します。
          }
        } キャッチ (e) {
          フレームウィンドウを印刷します。
        }
        フレームウィンドウを閉じます。
      }, 10);
    } キャッチ (エラー) {
      コンソールにログ出力します。
    }
  },
  // 要素が body 要素の子孫であり、body 要素自体ではないかどうかを確認します isInBody: function (node) {
    戻り値 (node ​​=== document.body) ? false : document.body.contains(node);
  },
  isDOM: (HTMLElement の typeof === 'object') ?
    関数 (オブジェクト) {
      HTMLElement のインスタンス obj を返します。
    } :
    関数 (オブジェクト) {
      obj を返します && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';
    }
};
定数MyPlugin = {}
MyPlugin.install = 関数 (Vue、オプション) {
  // 4. インスタンスメソッド Vue.prototype.$printPage = Print を追加します。
}
デフォルトのMyPluginをエクスポート

2. ファイルをプロジェクト内のフォルダに置く

3. main.js でのグローバル参照

4. ページの使用状況

注: コンテンツを印刷したくない場合は、クラスを no-print に設定してください。

2. ブラウザの組み込みwindow.print()メソッドを使用して、印刷用のHTMLコンテンツを取得します。

デメリット: スタイルはラベルにしか書けず、そうでなければ効果がありません。

1. jsファイルをカプセル化する

エクスポートデフォルト関数printHtml(html) {
  スタイルを getStyle() に設定します。
  コンテナを getContainer(html);
 
  document.body.appendChild(スタイル);
  document.body.appendChild(コンテナ);
  getLoadPromise(コンテナ).then(() => {
    ウィンドウを印刷します。
    document.body.removeChild(スタイル);
    document.body.removeChild(コンテナ);
  });
}
 
//印刷スタイルを設定する関数 getStyle() {
styleContent = `#print-container {
    表示: なし;
}
@media 印刷 {
    本文 > :not(.print-container) {
        表示: なし;
    }
    html,
    体 {
      マージン: 0 0.2cm;
      表示: ブロック !重要;
      高さ:自動;
    }
    #印刷コンテナ{
        表示: ブロック;
    }
    @ページ {
      マージン: 0.25cm 0;
    }
}`;
  style = document.createElement("style"); とします。
  style.innerHTML = styleContent;
  戻りスタイル;
}
 
// 印刷内容をクリアする function cleanPrint() {
  div = document.getElementById('print-container') とします。
  の場合 (!!div) {
    document.querySelector('body').removeChild(div)
  }
}
 
//新しいDOMを作成し、印刷するコンテンツをDOMに入力します
関数 getContainer(html) {
  クリーンプリント()
  コンテナを document.createElement("div");
  コンテナ.setAttribute("id", "印刷コンテナ");
  コンテナ内のHTML要素をHTML要素に代入します。
  返却コンテナ;
}
 
// 画像が完全に読み込まれた後に印刷メソッドを呼び出す function getLoadPromise(dom) {
  imgs = dom.querySelectorAll("img"); とします。
  imgs = [].slice.call(imgs);
 
  (画像の長さ === 0) の場合 {
    Promise.resolve() を返します。
  }
 
  終了カウントを 0 にします。
  新しいPromiseを返します(resolve => {
    関数チェック() {
      終了カウント++;
      終了カウント === imgs.length の場合 {
        解決する();
      }
    }
    imgs.forEach(画像 => {
      img.addEventListener("load"、チェック);
      img.addEventListener("エラー", チェック);
    })
  });
}

2. ファイルをプロジェクト内のフォルダに置く

3. ページの直接インポート

4. ページの使用状況

注: 印刷する必要のないコンテンツの場合は、ラベルにスタイル display: none を設定するだけです。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue+elementはページ印刷機能を実現する
  • Vue フォームのフォーム送信 + Ajax 非同期リクエスト + ページング効果
  • Vue.jsは、複数条件のフィルタリング、検索、並べ替え、ページングのテーブル機能を実装します。
  • Vue.jsはページングクエリ機能を実装します
  • Vuejs2.0はシンプルなページングの例を実装します
  • Vue.jsは無限ロードとページング機能の開発を実現します
  • Vue でページャーを書くためのサンプルコード
  • vue + element-uiのページング問題の実装
  • Vue ベースのページング コンポーネントをカプセル化する方法
  • vue.js に基づくページネーション

<<:  docker で zabbix_agent をデプロイする方法

>>:  Docker ベースの GitLab 環境をデプロイする方法と手順

推薦する

tinyMCEの使い方と体験の詳細な説明

tinyMCE の使用方法の詳細な説明初期化TinyMCE を初期化するときは、ページの HEAD ...

CSS 垂直センタリングの代替実装コードの詳細な説明(非従来型)

序文ご存知のとおり、「CSS で要素を垂直方向に中央揃えするにはどうすればよいか」という質問は、すで...

Dockerボリューム権限管理の詳細な説明

ボリュームデータボリュームは Docker の重要な概念です。データ ボリュームは、1 つ以上のコン...

JS を使用してファイルを操作する (FileReader は --node の fs を読み取ります)

目次JS はファイルを読み取る FileReader書類イベントとメソッド基本的な使い方イベント処理...

MySQLでよく使われるSQLとコマンドの入力からデータベースの削除、そして終了まで

目次開始と停止データベース関連の操作データベーステーブル関連の操作制約関連デフォルトの制約高度なデー...

MySQL 8.0.15 winx64 のインストールと設定方法のグラフィックチュートリアル (Windows の場合)

この記事では、MySQL 8.0.15 winx64のインストールと設定方法を参考までに紹介します。...

MySQL クエリ キャッシュとバッファ プール

1. キャッシュ - クエリキャッシュ次の図は、MySQL 公式サイトから提供されています: MyS...

MySQL 5.5.27 インストール グラフィック チュートリアル

1. MYSQLのインストール1. ダウンロードしたMySQLインストールファイルmysql-5.5...

nginx ロケーション優先度の詳細な説明

場所表現タイプ~ は大文字と小文字を区別して通常の一致を実行することを示します~*は大文字と小文字を...

iframe を使用して Web ページに天気の影響を表示します

CS: ...コードをコピーコードは次のとおりです。 *{マージン:0;パディング:0;リストスタイ...

ウェブサイトのビジュアルデザインの重要なポイント

手工芸デザインからグラフィックデザイン、そしてウェブデザインまで、デザインの原則は同じままですが、私...

Linux でハイパースレッディング技術を動的に有効/無効にする方法の詳細な説明

序文Intel のハイパースレッディング テクノロジーにより、1 つの物理コア上で 2 つのスレッド...

Bash の山括弧の深い理解 (初心者向け)

序文Bash には、ls、cd、mv などの重要な組み込みコマンドが多数あるほか、grep、awk、...

JavaScriptを使って動的にテーブルを生成するケースの詳しい説明

目次序文実装のアイデア実装コード成果を達成する序文これは、テーブルを動的に追加する例です。[追加] ...