2013-08-19 111 views
1

我拉我的頭髮試圖讓我的表單的輸入打印。我已經嘗試了PrintThis,printElement,window.print和打印解決方案的每一次迭代,並且無法使其正常工作。用jquery printThis打印表格

作爲背景 - 這是一個使用jQuery,jqmobile,html5,css3的多頁表單。它有多種類型的輸入,包括多選,無線電,文本等。我​​想打印所有的輸入,但不一定需要表單佈局。

這裏是我的代碼示例,因爲它是非常長期且深入的我只會把一個樣本:

頭段

<head> 
    <meta charset="UTF-8"> 

<link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.min.css" /> 
<link rel="stylesheet" type="text/css" href="form.css" /> 

<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"> </script> 
<script src="jquery.maskedinput.min.js" type="text/javascript"></script> 
<script type="text/javascript" src="json2.min.js"></script> 
<script type="text/javascript" src="jquery.printElement.min.js"></script> 
<!--[if lt IE 9]> 
<script type="text/javascript" src="flashcanvas.js"></script> 
<![endif]--> 
<script> 
$(document).bind('mobileinit', function() { 
$.mobile.page.prototype.options.addBackBtn= true; 
$.mobile.page.prototype.options.backBtnText="Back"; 
$.mobile.page.prototype.options.backBtnIcon="arrow-1"; 
$.mobile.selectmenu.prototype.options.nativeMenu = false; 
}) 
</script> 
<script type="text/javascript" src="http://code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.min.js"></script> 
<script> 
function formSubmit() 
{ 
      document.getElementById("SiteVisit").action = "mailto:[email protected]?cc=" + document.getElementById("RelBy1").value + "&subject=Site%20Visit%20Form"; 
      document.getElementById("SiteVisit").submit(); 
} 
</script> 
<title>Site Visit Form</title> 
<meta name="HandheldFriendly" content="True" /> 
<meta name="MobileOptimized" content="320" /> 
<meta name="Viewport" content="width-device-width, initial-scale'1.0" /> 
<meta name="apple-mobile-web-app-capable" content="yes"> 
</head> 

身體的部分

<header><h1>Site Visit Form</h1></header> 
<form method="post" enctype="text/plain" name="SiteVisit" id="SiteVisit"> 
     <div data-role="page" id="chapter3"> 
<div data-role="header"> 
<h1>Field Assessments</h1> 
</div><!--/header--> 

    <script> 
    $(document).ready(function() { 
    $("input[name='ProjectID']").on('change',function(){ 
var val = $(this).val(); 
var h = $("#chapter3").find("div[data-role='header']").find("h1"); 
$(h).html($(h).html() + " " + val); 
}); 
    }) 
</script> 
<div data-role="content" id="Field"> 
      <fieldset><div class="_100"> 
<div class="_20">Time:<input type="time" name="time2"> </div> 
<div class="_20">Water Temp:<input type="text" name="temp"> </div> 

<div class="_20" data-role="controlgroup" data-mini="true" data-type="horizontal"> 
    <label><br /></label> 
<input type="radio" name="temp" id="radC" value="C"> 
     <label for="radC">C&#176;</label> 
<input type="radio" name="temp" id="radF" value="F"> 
    <label for="radF">F&#176;</label> </div> 
<div class="_20">Air Temp:<input type="text" name="air"> </div> 

<div class="_20" data-role="controlgroup" data-mini="true" data-type="horizontal"> 
    <label><br /></label> 
<input type="radio" name="Atemp" id="radAC" value="C"> 
     <label for="radAC">C&#176;</label> 
<input type="radio" name="Atemp" id="radAF" value="F"> 
    <label for="radAF">F&#176;</label> </div></div> 
<div class="_100">    
<div class="_25">SC (uS/cm):<input type="text" name="SC"> </div> 
<div class="_25">pH:<input type="text" name="ph"> </div> 
<div class="_25">DO (mg/L):<input type="text" name="DO"></div> 
<div class="_25">DO Saturation %:<input type="text" name="sat"> </div> 
</div> 
<div class="_100"> 
<div class="_33">Bar Pressure (mm/Hg):<input type="text" name="pressure"></div> 
<div class="_33">Turbidity (NTU):<input type="text" name="turbidity"></div> 
<div class="_33">Turbidity<select id="Turb" data-iconpos="left" data-icon="grid"> 
      <option value = "0"> </option> 
      <option value = "Clear">Clear</option> 
      <option value = "Slight">Slight</option> 
      <option value = "Turbid">Turbid</option> 
      <option value = "Opaque">Opaque</option> 
      </select></div> 
</div> 
<div class="_100"> 
<div class="_30">Flow (cfs):<input type="text" name="flow"></div> 

<div data-role="controlgroup" class="_30"> 
<label for = "chkdry">Dry Bed</label> 
    <input type = "checkbox" id="chkdry" value="Yes" data-mini="true"> 
<label for="chkPool">Stranded Pools</label>    
    <input type="checkbox" id="chkPool" value="Yes" data-mini="true"> 
     </div> 

    <div class="_40"> <label class=select for=Method>Method</label> 
    <select id="Method" data-iconpos="left" data-icon="grid"> 
      <option value = "0"> </option> 
      <option value = "Meter">Meter</option> 
      <option value = "Doppler">Doppler</option> 
      <option value = "Float">Float</option> 
      <option value = "Gage">Gage</option> 
      <option value = "VE">Visual Estimate</option> 
      </select></div></div> 
     </fieldset> 

       <fieldset> 
       <div class="_100"> 
     <div class="_50"><Label class=select for=FieldForms>Field Forms</label> 
     <select id = "FieldForms" multiple name=FieldForms data-iconpos="left" data-icon="grid"> 
      <OPTION>Select all that apply:</OPTION> 
     <option value = "Aquatic Plant Visual Assessment">Aquatic Plant Visual Assessment</option> 
      <option value = "Photos">Photos</option> 
      <option value = "Aquatic Plant Tracking Form">Aquatic Plant Tracking Form</option> 
      <option value = "Rosgen Form">Rosgen Form</option> 
      <option value = "NRCS Form">NRCS Form</option> 
      <option value = "EMAP Forms">EMAP Forms</option> 
      <option value = "Summary Form">Summary Form</option> 
      <option value = "Channel Cross-Section">Channel Cross-Section</option> 
      <option value = "Total Discharge">Total Discharge</option> 
     </select></div> 
<div class="_50"><Label class=select for=DataLoggers>Data Loggers</label> 
     <select id = "DataLoggers" multiple name=DataLoggers data-iconpos="left" data-icon="grid"> 
      <OPTION>Select all that apply:</OPTION> 
      <option value = "Temperature">Temperature</option> 
      <option value = "YSI">YSI</option> 
      <option value = "TruTrack">TruTrack</option> 
      <option value = "AquaRods">AquaRods</option> 
      <option value = "Weather Station">Weather Station</option> 
      <option value = "MiniDOT">MiniDOT</option> 
     </select></div></div> 

    </fieldset></div> 
     <div data-role="footer" data-id="SVFnav"> 
     <div data-role="navbar"> 
     <ul> 
     <li><a href="#chapter1"><h4>Site Info</h4></a></li> 
     <li><a href="#chapter2"><h4>Samples</h4></a></li> 
     <li><a class="ui-btn-active ui-state-persist"><h4>Field</h4></a></li> 
      <li><a href="#chapter4"><h4>Comments</h4></a></li> 
      <li><a href="#chapter5"><h4>Lab Info</h4></a></li> 
      </ul> 
      </div></div> 
      </div> 
    </body> 
</form> 

這裏是最新的按鈕腳本

<script type="text/javascript" src="printThis.js"></script> 
<input type="button" id="printThis" onclick="printThis()" data-icon="gear" data-theme="b" value="Print" /> 
<script> 
$(document).ready(function() { 
$("#printThis").click(function() { 
$('#Site,#Samples,#Field,#Comments').printThis({ 
    debug: true, 
    importCSS: true, 
    printContainer: false, 
    loadCSS: "form.css", 
    pageTitle: "Site Visit Form", 
    removeInline: false}); 
}); 
}); 
</script> 

(#Site,#Samples,#Field,#Comments是頁面ID)。這會打印表格,但它打印的唯一輸入是選擇&收音機而不是文本。我需要完整表格中的所有輸入。

我也試過以下

<div data-role="header"> 
<h1>Lab Information</h1> 
    <input type="button" class="ui-btn-right" id="print" onclick="printElement" data-icon="gear" data-theme="b" value="Print" /> 
</div><!--/header--> 

<script> 
$(document).ready(function() { 
$("#print").click(function(){ 
printElement({ printMode: 'popup' }); 
}); 
function printElem(options){ 
$('#SiteVisit').printElement(options); 
} 
}); 

</script> 

(現場訪問是表單的ID)

我知道這是不漂亮,我是一個進展中的工作,但有人可以告訴我我錯了。我的老闆們開始不滿意它花費的時間了。

+1

爲什麼不讓服務器生成一個可打印的版本? –

+0

它只是不打印?你看到什麼行爲? – Richard

+0

我不能使用.asp或.php,PrintThis插件只打印空白字段,它沒有選取字段中的值 – pja

回答

1

剛剛找到了答案,我自己。

檢查這個頁面在這裏StackOverflow上:

Is there a way to clone form field values in jQuery or javascript?

你需要觸摸的價值觀,使他們在「值」屬性明確。所以你需要直接修改printThis插件。

從printThis插件的1.3版本工作,我增加了行附加標題(線92)之後的下列行:

$('input:text').each(function() { 
    $(this).attr('value', $(this).val()); 
}); 

然後,我改變了追加代碼行(當選項printContainer被設置爲假),在線路#99:

$doc.find("body").append($(this).html()); 

變得

$doc.find("body").append($(this).clone(true)); 

它確保傳遞的數據包含值。

當您調用printThis時,一定要在選項中將printContainer設置爲false!

這應該可以解決您的問題。可能來不及幫助你,但至少應該幫助下一個人。

+0

因此,我的代碼中沒有任何內容需要更改,只是在printThis代碼中? – pja

+0

在你的代碼中,在你的printThis調用中,一定要設置printContainer = false。像$(「#divImPrinting」)。printThis({printContainer:false});這只是因爲我是一個懶鬼,並沒有打擾改變append來克隆printContainer = true條件! :-)如果你需要printContainer = true,它應該是一個簡單的改變來適應它,我可以試着幫助你。 – oceanfrog

+0

另外,爲了您自己的理智,一定要使用相同版本的printThis(1.3)。 – oceanfrog