2017-02-02 4 views
2

私はプロジェクトの私の部分がiframe内のダッシュボードであるプロジェクトに取り組んでいます。 のiframeにエクスポートすることを依頼しています(つまり、iframeのコンテンツのみを表示し、周囲のラッパーは表示しません)。私はいくつかのjQueryを使って動作させることにしましたが、 PDFとして保存するためのデフォルトのファイル名を設定するのが面倒です。 This SO answerが役に立ちました(iframeでではないの場合document.titleを設定します)、iframeビューにあるときにエクスポートボタンをクリックしても機能しません。ここで私が試したものの一例です:iframe内からChromeの印刷ダイアログのデフォルトのファイル名を設定するにはどうすればよいですか?

$('#export-button').click(function() { 
    $('#iframe-contents').show(); 
    document.title = 'default_filename'; 
    window.print(); 
}); 

誰のiframe内からwindow.print()に呼び出すときにクロームの印刷ダイアログで、デフォルトのファイル名を設定する方法を知っていますか?

+0

印刷ダイアログでファイル名が必要なのはなぜですか? Windows(他のOSについてはわかりません)は、印刷ダイアログでファイル名を表示しません。 –

+1

より良い顧客体験をお届けします。レポートをPDFとしてエクスポートすると、レポートの内容が時間とともに変化するため、デフォルトのファイル名にレポート番号と日付を含める必要があります。 Mac OS X(と私は他のOSを想定している)では、Chromeはデフォルトのファイル名をドキュメントのタイトルに設定します。たとえば、このページを印刷してPDFとして保存しようとすると、OS XのChromeはデフォルトのファイル名を「javascript - iframe_-Stack Overflow.pdfからChromeの印刷ダイアログのデフォルトファイル名を設定するにはどうすればよいですか」を設定します。 – mgig

+0

'人々が私のレポートをエクスポートするとき' ...ああ、私は 'Chromeの印刷ダイアログのデフォルトのファイル名 'を誤って読んで、印刷ダイアログのファイル名を欲しかったのです。 –

答えて

1

Firefoxはiframeのドキュメントの名前に直接pdf名を設定しますが、chromeはそうではありません。あなたのiframe共有している場合の回避策については

あなたの親ページと同じ起源は、使用することができます:

document.title = window.parent.document.title = "yourTitle"; 

彼らは同じ起源を共有していない場合は、あなたがを立ち往生しています。

window.open()を含むクロスオリジンフレームであっても、実際にはハックがあり、「許可するポップアップ」許可のないサンドボックスのiframeでは機能しません。

function renameIframedPrint(title) { 
    var title = "myFile"; 
    try { 
    // same-origin frame 
    document.title = window.parent.document.title = title; 
    print(); 
    } catch (e) { // cross-origin frame 

    // we could instead grab the current content of the page 
    // but for the demo, location.href will do 
    var p = window.open(location.href); 
    p.onload = function() { 
     // no more frame so we don't care ;-) 
     p.document.title = "myFile"; 
     // a bit more hack to close the popup once printed... 
     function closePopup() { 
     p.close(); 
     } 
     if ('onafterprint' in p) { 
     // FF and IE 
     p.onafterprint = closePopup 
     } else { 
     // webkit don't support onafterprint 
     var mediaQueryList = p.matchMedia('print'); 
     mediaQueryList.addListener(mqlListener); 

     function mqlListener(mql) { 
      if (!mql.matches) { 
      closePopup(); 
      mediaQueryList.removeListener(mqlListener); 
      } 
     } 
     } 
    } 
    // we're ready 
    p.print(); 
    }; 
} 

External Live Demo

open()以降は、スタック・スニペットのサンドボックス化さiframe内に動作しません。

関連する問題