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 環境をデプロイする方法と手順

推薦する

MySql エラー 1698 (28000) の解決策

1. 問題の説明: MysqlERROR1698 (28000) の解決方法、新しくインストールされ...

史上最もクリエイティブな404ページのデザインは、ウェブサイトのユーザーエクスペリエンスを効果的に向上させます

ウェブを閲覧しているときに 404 ページに遭遇することはあまりないので、見落としがちです。しかし、...

入力テキスト ボックスと画像検証コードの位置合わせの問題 (画像は常に入力より 1 つ上になります)

Web ページ制作では、input と img が同じ行に配置されることが多く、img タグが常に ...

MySQL 30軍事ルールの詳細な説明

1. 基本仕様(1)InnoDBストレージエンジンを使用する必要があります。解釈:トランザクション、...

JavaScript スタイル オブジェクトと CurrentStyle オブジェクトのケース スタディ

1. スタイルオブジェクトスタイル オブジェクトは単一のスタイル宣言を表し、スタイルが適用されている...

Vueプロジェクトをパッケージ化してリリースする手順

目次1. 開発環境から本番環境への移行2. 統一されたリクエストパスを設定する3. パッケージ化コマ...

CentOS 7へのJenkinsのインストール手順の詳細な説明

Yum経由でJenkinsをインストールする1. インストール # yum ソースをインポート wg...

js 日付と時刻のフォーマット方法の例

js 日付時刻形式日付と時刻を指定された形式に変換します。例: YYYY-mm-dd HH:MM は...

リクエスト IP の最後のセグメントに基づいてトラフィックを分割するように Nginx を構成する方法

これは主に、場所パラメータのif判断の設定ジャンプです。迂回により、サーバーの負荷と圧力を軽減できま...

Vue で動的に読み込まれたローカル画像を処理する方法

問題を見つける今日は、vue ファイルにローカル画像を導入する際に問題が発生したので、この記事を書き...

MySQL の中国語文字化け問題の解決方法

1. LinuxのMySQLで中国語の文字化けが発生する。以下の操作を実行する。 vi /etc/m...

WeChatアプレットのスクロールビューが左右連動効果を実現

WeChatアプレットはスクロールビューを使用して左右のリンクを実現します。参考までに、具体的な内容...

Windows10にMySQL5.6.35データベースを2つインストールする

次のように、Win10 での 2 つの MySQL5.6.35 データベースのインストールを記録しま...

MySQL 8.0.26 のインストールとアンインストールの完全なステップバイステップの記録

目次序文1. インストール1.公式サイトからダウンロード2. 構成を作成する3. MySQLを初期化...

HTMLはBaidu百科事典のナビゲーションドロップダウンメニュー機能を模倣します

HTML は、Baidu 百科事典のナビゲーション ドロップダウン メニュー機能を模倣します。具体的...