如果我理解你的問題,我可能會有一個解決方案。 當我點擊上一個或下一個按鈕的速度太快時,畫布沒有時間刷新,並且繪製了兩個(或更多)頁面,這是不可讀的。
爲了解決這個問題,我使用下面的代碼:
var stop = false;
function goPrevious() {
if (pageNum > 1 && !stop)
{
stop = true;
pageNum--;
renderPage(pageNum);
}
}
function goNext() {
if (pageNum < pdfDoc.numPages && !stop)
{
stop = true;
pageNum++;
renderPage(pageNum);
}
}
我也曾在pdf.js文件修改的渲染功能:
render: function PDFPageProxy_render(params) {
this.renderInProgress = true;
var promise = new Promise();
var stats = this.stats;
stats.time('Overall');
// If there is no displayReadyPromise yet, then the operatorList was never
// requested before. Make the request and create the promise.
if (!this.displayReadyPromise) {
this.displayReadyPromise = new Promise();
this.destroyed = false;
this.stats.time('Page Request');
this.transport.messageHandler.send('RenderPageRequest', {
pageIndex: this.pageNumber - 1
});
}
var self = this;
function complete(error) {
self.renderInProgress = false;
stop = false;
if (self.destroyed || self.cleanupAfterRender) {
delete self.displayReadyPromise;
delete self.operatorList;
self.objs.clear();
}
if (error)
promise.reject(error);
else
promise.resolve();
}
var continueCallback = params.continueCallback;
//etc.
(在我pdf.js文件這是在第2563和2596行之間)。
因此,即使您在上一個/下一個按鈕上點擊得非常快,在上一頁完全繪製之前,不會繪製新頁面!
的其他解決方案是取消前繪圖:
function renderPage(num) {
pdfDoc.getPage(num).then(function(page) {
// canvas resize
viewport = page.getViewport(ratio);
canvas.height = viewport.height;
canvas.width = viewport.width;
// draw the page into the canvas
var pageTimestamp = new Date().getTime();
timestamp = pageTimestamp;
var renderContext = {
canvasContext: ctx,
viewport: viewport,
continueCallback: function(cont) {
if(timestamp != pageTimestamp) {
return;
}
cont();
}
};
page.render(renderContext);
// update page numbers
document.getElementById('page_num').textContent = pageNum;
document.getElementById('page_count').textContent = pdfDoc.numPages;
});
}
我希望它會幫助你,爲我的英語很抱歉;) 有一個愉快的一天
我已經嘗試這樣做,它似乎工作比以前好多了,但我仍然面對的問題,同時也點擊fast.I如果你正面臨着不知道它也。我希望我可以禁用按鈕,直到畫布完全加載,我嘗試使用window.onload(),沒有工作,因爲畫布需要更長的時間加載。 pdf.js的完整viewer.html具有暫停功能,但無法弄清楚他們是如何做到的。 – sss
我只試過你的第一個解決方案,讓我看看第二個解決方案。非常感謝你的努力,你的英語很棒。 :) – sss
我試着取消先前的繪圖,但是timestamp = pageTimestamp;錯誤時間戳是未定義的,所以我將代碼更改爲var timestamp = pageTimestamp;現在它永遠不會進入if(timestamp!= pageTimestamp)條件,因爲它們總是相等的。我究竟做錯了什麼 ?再次提前感謝。 :) – sss