Skip to content

Commit d6479c2

Browse files
committed
Reload iframe only after necessary attributes changed #30
1 parent 7cd3a67 commit d6479c2

File tree

2 files changed

+19
-14
lines changed

2 files changed

+19
-14
lines changed

index.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@
1111
<pdfjs-viewer-element
1212
src="/fake-file.pdf"
1313
viewer-path="/pdfjs-4.0.379-dist"
14-
style="height: clamp(600px, 600px, 80dvh)">
14+
style="height: 600px">
1515
</pdfjs-viewer-element>
1616
<pdfjs-viewer-element
1717
id="hideOpenFileViewer"
1818
src="/sample-pdf-with-images.pdf"
1919
viewer-path="/pdfjs-4.0.379-dist"
2020
locale="de"
2121
page="2"
22-
style="height: clamp(600px, 600px, 80dvh)">
22+
style="height: 600px">
2323
</pdfjs-viewer-element>
2424
<button onclick="document.querySelector('#hideOpenFileViewer').setAttribute('viewer-extra-styles', '#download { display: none }')">Hide download button</button>
2525
<button onclick="document.querySelector('#hideOpenFileViewer').setAttribute('viewer-extra-styles', '')">Show download button</button>
@@ -29,7 +29,7 @@
2929
viewer-path="/pdfjs-4.0.379-dist"
3030
viewer-css-theme="DARK"
3131
locale="es"
32-
style="height: clamp(600px, 600px, 80dvh)">
32+
style="height: 600px">
3333
</pdfjs-viewer-element>
3434

3535
<button onclick="document.querySelector('#themedViewer').setAttribute('viewer-css-theme', 'LIGHT')">Change theme</button>
@@ -38,7 +38,7 @@
3838
<button onclick="document.querySelector('#themedViewer').setAttribute('page', '1')">Reset page</button>
3939
<button onclick="document.querySelector('#themedViewer').setAttribute('locale', 'de')">Change locale</button>
4040
<button onclick="document.querySelector('#themedViewer').setAttribute('locale', 'es')">Reset locale</button>
41-
<button onclick="document.querySelector('#themedViewer').setAttribute('text-layer', 'visible')">Change text text layer</button>
41+
<button onclick="document.querySelector('#themedViewer').setAttribute('text-layer', 'visible')">Change text layer</button>
4242
<button onclick="document.querySelector('#themedViewer').setAttribute('text-layer', 'none')">Reset text layer</button>
4343
<button onclick="document.querySelector('#themedViewer').setAttribute('search', 'iss')">Change search text</button>
4444
<button onclick="document.querySelector('#themedViewer').setAttribute('search', '')">Reset search text</button>

src/pdfjs-viewer-element.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const DEFAULTS = {
88
page: '',
99
search: '',
1010
phrase: '',
11-
zoom: 'auto',
11+
zoom: '',
1212
pagemode: 'none',
1313
locale: '',
1414
textLayer: '',
@@ -22,6 +22,8 @@ export const ViewerCssTheme = {
2222
DARK: 2,
2323
} as const
2424

25+
export const hardRefreshAttributes = ['src', 'viewer-path', 'locale', 'viewer-css-theme', 'viewer-extra-styles']
26+
2527
export class PdfjsViewerElement extends HTMLElement {
2628
constructor() {
2729
super()
@@ -42,8 +44,8 @@ export class PdfjsViewerElement extends HTMLElement {
4244

4345
connectedCallback() {
4446
this.iframe = this.shadowRoot!.querySelector('iframe') as PdfjsViewerElementIframe
45-
document.addEventListener('webviewerloaded', () => {
46-
this.setCssTheme()
47+
document.addEventListener('webviewerloaded', async () => {
48+
this.setCssTheme(this.getCssThemeOption())
4749
this.setViewerExtraStyles(this.getAttribute('viewer-extra-styles'))
4850
if (this.getAttribute('src') !== DEFAULTS.src) this.iframe.contentWindow?.PDFViewerApplicationOptions?.set('defaultUrl', '')
4951
this.iframe.contentWindow?.PDFViewerApplicationOptions?.set('disablePreferences', true)
@@ -52,7 +54,13 @@ export class PdfjsViewerElement extends HTMLElement {
5254
});
5355
}
5456

55-
attributeChangedCallback() {
57+
attributeChangedCallback(name: string) {
58+
if (!hardRefreshAttributes.includes(name)) {
59+
this.onIframeReady(() => {
60+
this.iframe.src = this.getIframeSrc()
61+
})
62+
return
63+
}
5664
this.onIframeReady(() => this.mountViewer(this.getIframeSrc()))
5765
}
5866

@@ -74,9 +82,7 @@ export class PdfjsViewerElement extends HTMLElement {
7482
const viewerCssTheme = this.getAttribute('viewer-css-theme') || DEFAULTS.viewerCssTheme
7583
const viewerExtraStyles = Boolean(this.getAttribute('viewer-extra-styles') || DEFAULTS.viewerExtraStyles)
7684

77-
const updatedSrc = `${viewerPath}${DEFAULTS.viewerEntry}?file=${encodeURIComponent(src)}#page=${page}&zoom=${zoom}&pagemode=${pagemode}&search=${search}&phrase=${phrase}&textLayer=${textLayer}${locale ? '&locale='+locale : ''}&viewerCssTheme=${viewerCssTheme}&viewerExtraStyles=${viewerExtraStyles}`
78-
if (updatedSrc !== this.iframe.getAttribute('src')) return updatedSrc
79-
return ''
85+
return `${viewerPath}${DEFAULTS.viewerEntry}?file=${encodeURIComponent(src)}#page=${page}&zoom=${zoom}&pagemode=${pagemode}&search=${search}&phrase=${phrase}&textLayer=${textLayer}${locale ? '&locale='+locale : ''}&viewerCssTheme=${viewerCssTheme}&viewerExtraStyles=${viewerExtraStyles}`
8086
}
8187

8288
private mountViewer(src: string) {
@@ -97,9 +103,8 @@ export class PdfjsViewerElement extends HTMLElement {
97103
: ViewerCssTheme[DEFAULTS.viewerCssTheme]
98104
}
99105

100-
setCssTheme() {
101-
const cssTheme = this.getCssThemeOption()
102-
if (cssTheme === ViewerCssTheme.DARK) {
106+
private setCssTheme(theme: 0 | 1 | 2) {
107+
if (theme === ViewerCssTheme.DARK) {
103108
const styleSheet = this.iframe.contentDocument?.styleSheets[0];
104109
const cssRules = styleSheet?.cssRules || [];
105110
const rules = Object.keys(cssRules)

0 commit comments

Comments
 (0)