Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6c41bb3

Browse files
authored
Merge pull request #59 from github/fragment
Add custom events to provide fragment access
2 parents 8ac2a25 + 8be1d51 commit 6c41bb3

File tree

3 files changed

+58
-5
lines changed

3 files changed

+58
-5
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ Request lifecycle events are dispatched on the `<include-fragment>` element.
5252
- `load` - The request completed successfully.
5353
- `error` - The request failed.
5454
- `loadend` - The request has completed.
55+
- `include-fragment-replace` (cancelable) - The success response has been parsed. It comes with `event.detail.fragment` that will replace the current element.
56+
- `include-fragment-replaced` - The element has been replaced by the fragment.
5557

5658
```js
5759
const loader = document.querySelector('include-fragment')

src/index.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ async function handleData(el: IncludeFragmentElement) {
1010
// eslint-disable-next-line github/no-then
1111
return getData(el).then(
1212
function (html: string) {
13-
const parentNode = el.parentNode
14-
if (parentNode) {
15-
el.insertAdjacentHTML('afterend', html)
16-
parentNode.removeChild(el)
17-
}
13+
const template = document.createElement('template')
14+
template.innerHTML = html
15+
const fragment = document.importNode(template.content, true)
16+
const canceled = !el.dispatchEvent(new CustomEvent('include-fragment-replace', {cancelable: true, detail: {fragment}}))
17+
if (canceled) return
18+
el.replaceWith(fragment)
19+
el.dispatchEvent(new CustomEvent('include-fragment-replaced'))
1820
},
1921
function () {
2022
el.classList.add('is-error')

test/test.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,4 +371,53 @@ suite('include-fragment-element', function() {
371371
assert.equal(document.querySelector('#replaced').textContent, 'hello')
372372
})
373373
})
374+
375+
test.only('fires replaced event', function() {
376+
const elem = document.createElement('include-fragment')
377+
document.body.appendChild(elem)
378+
379+
setTimeout(function() {
380+
elem.src = '/hello'
381+
}, 10)
382+
383+
return when(elem, 'include-fragment-replaced').then(() => {
384+
assert.equal(document.querySelector('include-fragment'), null)
385+
assert.equal(document.querySelector('#replaced').textContent, 'hello')
386+
})
387+
})
388+
389+
test.only('fires events for include-fragment node replacement operations for fragment manipulation', function() {
390+
const elem = document.createElement('include-fragment')
391+
document.body.appendChild(elem)
392+
393+
setTimeout(function() {
394+
elem.src = '/hello'
395+
}, 10)
396+
397+
elem.addEventListener('include-fragment-replace', event => {
398+
event.detail.fragment.querySelector('*').textContent = 'hey'
399+
})
400+
401+
return when(elem, 'include-fragment-replaced').then(() => {
402+
assert.equal(document.querySelector('include-fragment'), null)
403+
assert.equal(document.querySelector('#replaced').textContent, 'hey')
404+
})
405+
})
406+
407+
test.only('does not replace node if event was canceled ', function() {
408+
const elem = document.createElement('include-fragment')
409+
document.body.appendChild(elem)
410+
411+
setTimeout(function() {
412+
elem.src = '/hello'
413+
}, 10)
414+
415+
elem.addEventListener('include-fragment-replace', event => {
416+
event.preventDefault()
417+
})
418+
419+
return when(elem, 'load').then(() => {
420+
assert(document.querySelector('include-fragment'), 'Node should not be replaced')
421+
})
422+
})
374423
})

0 commit comments

Comments
 (0)