Comparing version 0.2.2 to 0.2.3
@@ -146,2 +146,8 @@ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | ||
function fnInvoker(arr) { | ||
return function (ev) { | ||
arr[0](ev); | ||
}; | ||
} | ||
function updateEventListeners(oldVnode, vnode) { | ||
@@ -159,6 +165,16 @@ var name, | ||
if (old === undefined) { | ||
elm.addEventListener(name, is.array(cur) ? arrInvoker(cur) : cur); | ||
} else if (is.array(old)) { | ||
if (is.array(cur)) { | ||
elm.addEventListener(name, arrInvoker(cur)); | ||
} else { | ||
cur = [cur]; | ||
on[name] = cur; | ||
elm.addEventListener(name, fnInvoker(cur)); | ||
} | ||
} else if (old.length === 2) { | ||
old[0] = cur[0]; // Deliberately modify old array since it's | ||
old[1] = cur[1]; // captured in closure created with `arrInvoker` | ||
on[name] = old; | ||
} else { | ||
old[0] = cur; | ||
on[name] = old; | ||
} | ||
@@ -316,4 +332,4 @@ } | ||
style = s.remove, | ||
amount = 0; | ||
var applied = []; | ||
amount = 0, | ||
applied = []; | ||
for (name in style) { | ||
@@ -338,2 +354,3 @@ applied.push(name); | ||
// jshint newcap: false | ||
/* global require, module, document, Element */ | ||
'use strict'; | ||
@@ -347,2 +364,5 @@ | ||
} | ||
function isDef(s) { | ||
return s !== undefined; | ||
} | ||
@@ -367,3 +387,3 @@ function emptyNodeAt(elm) { | ||
key = children[i].key; | ||
if (!isUndef(key)) map[key] = i; | ||
if (isDef(key)) map[key] = i; | ||
} | ||
@@ -375,3 +395,4 @@ return map; | ||
return function () { | ||
if (--listeners === 0) parentElm.removeChild(childElm); | ||
//if (--listeners === 0) parentElm.removeChild(childElm); | ||
if (--listeners === 0) childElm.parentElement.removeChild(childElm); | ||
}; | ||
@@ -394,11 +415,12 @@ } | ||
function createElm(vnode) { | ||
var i; | ||
if (!isUndef(i = vnode.data) && !isUndef(i = i.hook) && !isUndef(i = i.init)) { | ||
i(vnode); | ||
var i, | ||
data = vnode.data; | ||
if (isDef(data)) { | ||
if (isDef(i = data.hook) && isDef(i = i.init)) i(vnode); | ||
if (isDef(i = data.vnode)) vnode = i; | ||
} | ||
if (!isUndef(i = vnode.data) && !isUndef(i = i.vnode)) vnode = i; | ||
var elm, | ||
children = vnode.children, | ||
sel = vnode.sel; | ||
if (!isUndef(sel)) { | ||
if (isDef(sel)) { | ||
// Parse selector | ||
@@ -410,3 +432,3 @@ var hashIdx = sel.indexOf('#'); | ||
var tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel; | ||
elm = vnode.elm = document.createElement(tag); | ||
elm = vnode.elm = isDef(data) && isDef(i = data.ns) ? document.createElementNS(i, tag) : document.createElement(tag); | ||
if (hash < dot) elm.id = sel.slice(hash + 1, dot); | ||
@@ -423,4 +445,4 @@ if (dotIdx > 0) elm.className = sel.slice(dot + 1).replace(/\./g, ' '); | ||
i = vnode.data.hook; // Reuse variable | ||
if (!isUndef(i)) { | ||
if (i.create) i.create(vnode); | ||
if (isDef(i)) { | ||
if (i.create) i.create(emptyNode, vnode); | ||
if (i.insert) insertedVnodeQueue.push(vnode); | ||
@@ -431,15 +453,8 @@ } | ||
} | ||
return elm; | ||
return vnode.elm; | ||
} | ||
function addVnodes(parentElm, before, vnodes, startIdx, endIdx) { | ||
if (isUndef(before)) { | ||
for (; startIdx <= endIdx; ++startIdx) { | ||
parentElm.appendChild(createElm(vnodes[startIdx])); | ||
} | ||
} else { | ||
var elm = before.elm; | ||
for (; startIdx <= endIdx; ++startIdx) { | ||
parentElm.insertBefore(createElm(vnodes[startIdx]), elm); | ||
} | ||
for (; startIdx <= endIdx; ++startIdx) { | ||
parentElm.insertBefore(createElm(vnodes[startIdx]), before); | ||
} | ||
@@ -449,9 +464,11 @@ } | ||
function invokeDestroyHook(vnode) { | ||
var i = vnode.data.hook, | ||
var i = vnode.data, | ||
j; | ||
if (!isUndef(i) && !isUndef(j = i.destroy)) j(vnode); | ||
for (i = 0; i < cbs.destroy.length; ++i) cbs.destroy[i](vnode); | ||
if (!isUndef(vnode.children)) { | ||
for (j = 0; j < vnode.children.length; ++j) { | ||
invokeDestroyHook(vnode.children[j]); | ||
if (isDef(i)) { | ||
if (isDef(i = i.hook) && isDef(i = i.destroy)) i(vnode); | ||
for (i = 0; i < cbs.destroy.length; ++i) cbs.destroy[i](vnode); | ||
if (isDef(i = vnode.children)) { | ||
for (j = 0; j < vnode.children.length; ++j) { | ||
invokeDestroyHook(vnode.children[j]); | ||
} | ||
} | ||
@@ -467,11 +484,16 @@ } | ||
ch = vnodes[startIdx]; | ||
if (!isUndef(ch)) { | ||
listeners = cbs.remove.length + 1; | ||
rm = createRmCb(parentElm, ch.elm, listeners); | ||
for (i = 0; i < cbs.remove.length; ++i) cbs.remove[i](ch, rm); | ||
invokeDestroyHook(ch); | ||
if (ch.data.hook && ch.data.hook.remove) { | ||
ch.data.hook.remove(ch, rm); | ||
if (isDef(ch)) { | ||
if (isDef(ch.sel)) { | ||
invokeDestroyHook(ch); | ||
listeners = cbs.remove.length + 1; | ||
rm = createRmCb(parentElm, ch.elm, listeners); | ||
for (i = 0; i < cbs.remove.length; ++i) cbs.remove[i](ch, rm); | ||
if (isDef(i = ch.data) && isDef(i = i.hook) && isDef(i = i.remove)) { | ||
i(ch, rm); | ||
} else { | ||
rm(); | ||
} | ||
} else { | ||
rm(); | ||
// Text node | ||
parentElm.removeChild(ch.elm); | ||
} | ||
@@ -491,3 +513,3 @@ } | ||
var newEndVnode = newCh[newEndIdx]; | ||
var oldKeyToIdx, idxInOld, elmToMove; | ||
var oldKeyToIdx, idxInOld, elmToMove, before; | ||
@@ -535,12 +557,17 @@ while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) { | ||
} | ||
if (oldStartIdx > oldEndIdx) addVnodes(parentElm, oldStartVnode, newCh, newStartIdx, newEndIdx);else if (newStartIdx > newEndIdx) removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx); | ||
if (oldStartIdx > oldEndIdx) { | ||
before = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm; | ||
addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx); | ||
} else if (newStartIdx > newEndIdx) { | ||
removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx); | ||
} | ||
} | ||
function patchVnode(oldVnode, vnode) { | ||
var i; | ||
if (!isUndef(i = vnode.data) && !isUndef(i = i.hook) && !isUndef(i = i.patch)) { | ||
i = i(oldVnode, vnode); | ||
var i, hook; | ||
if (isDef(i = vnode.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) { | ||
i(oldVnode, vnode); | ||
} | ||
if (!isUndef(i = oldVnode.data) && !isUndef(i = i.vnode)) oldVnode = i; | ||
if (!isUndef(i = vnode.data) && !isUndef(i = i.vnode)) vnode = i; | ||
if (isDef(i = oldVnode.data) && isDef(i = i.vnode)) oldVnode = i; | ||
if (isDef(i = vnode.data) && isDef(i = i.vnode)) vnode = i; | ||
var elm = vnode.elm = oldVnode.elm, | ||
@@ -550,18 +577,21 @@ oldCh = oldVnode.children, | ||
if (oldVnode === vnode) return; | ||
if (!isUndef(vnode.data)) { | ||
if (isDef(vnode.data)) { | ||
for (i = 0; i < cbs.update.length; ++i) cbs.update[i](oldVnode, vnode); | ||
i = vnode.data.hook; | ||
if (!isUndef(i) && !isUndef(i = i.update)) i(vnode); | ||
if (isDef(i) && isDef(i = i.update)) i(oldVnode, vnode); | ||
} | ||
if (isUndef(vnode.text)) { | ||
if (!isUndef(oldCh) && !isUndef(ch)) { | ||
if (isDef(oldCh) && isDef(ch)) { | ||
if (oldCh !== ch) updateChildren(elm, oldCh, ch); | ||
} else if (!isUndef(ch)) { | ||
addVnodes(elm, undefined, ch, 0, ch.length - 1); | ||
} else if (!isUndef(oldCh)) { | ||
} else if (isDef(ch)) { | ||
addVnodes(elm, null, ch, 0, ch.length - 1); | ||
} else if (isDef(oldCh)) { | ||
removeVnodes(elm, oldCh, 0, oldCh.length - 1); | ||
} | ||
} else if (oldVnode.text !== vnode.text) { | ||
elm.childNodes[0].nodeValue = vnode.text; | ||
elm.textContent = vnode.text; | ||
} | ||
if (isDef(hook) && isDef(i = hook.postpatch)) { | ||
i(oldVnode, vnode); | ||
} | ||
return vnode; | ||
@@ -573,7 +603,14 @@ } | ||
insertedVnodeQueue = []; | ||
for (i = 0; i < cbs.pre.length; ++i) cbs.pre[i](); | ||
if (oldVnode instanceof Element) { | ||
oldVnode = emptyNodeAt(oldVnode); | ||
if (oldVnode.parentElement !== null) { | ||
createElm(vnode); | ||
oldVnode.parentElement.replaceChild(vnode.elm, oldVnode); | ||
} else { | ||
oldVnode = emptyNodeAt(oldVnode); | ||
patchVnode(oldVnode, vnode); | ||
} | ||
} else { | ||
patchVnode(oldVnode, vnode); | ||
} | ||
for (i = 0; i < cbs.pre.length; ++i) cbs.pre[i](); | ||
patchVnode(oldVnode, vnode); | ||
for (i = 0; i < insertedVnodeQueue.length; ++i) { | ||
@@ -580,0 +617,0 @@ insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]); |
@@ -16,5 +16,6 @@ function pre(vnode, newVnode) { | ||
function destroy(vnode) { | ||
// Remove placeholder | ||
vnode.elm.parentElement.removeChild(vnode.elm); | ||
// Remove real element from where it was inserted | ||
var attachData = vnode.data.attachData; | ||
attachData.target.removeChild(attachData.real); | ||
vnode.elm = vnode.data.attachData.real; | ||
} | ||
@@ -21,0 +22,0 @@ |
@@ -43,4 +43,3 @@ var raf = requestAnimationFrame || setTimeout; | ||
var name, elm = vnode.elm, idx, i = 0, maxDur = 0, | ||
compStyle, style = s.remove, amount = 0; | ||
var applied = []; | ||
compStyle, style = s.remove, amount = 0, applied = []; | ||
for (name in style) { | ||
@@ -47,0 +46,0 @@ applied.push(name); |
{ | ||
"name": "snabbdom", | ||
"version": "0.2.2", | ||
"version": "0.2.3", | ||
"description": "A virtual DOM library with focus on simplicity, modularity, powerful features and performance.", | ||
@@ -5,0 +5,0 @@ "main": "snabbdom.js", |
@@ -164,2 +164,14 @@ # Snabbdom | ||
#### The `remove` hook | ||
Allows you to hook into the removal of an element. The hook is called once a | ||
vnode is to be removed from the DOM. The handling function recieves both the | ||
vnode and a callback. You can control and delay the removal with the callback. | ||
It should be invoked once the hook is done doing its business and the element | ||
will only be removed once all `remove` hooks have invoked their callback. | ||
The hook is only triggered when and element is to be removed from its parent – | ||
not if it is the child of an element that is removed. For that see the destroy | ||
hook. | ||
## Modules documentation | ||
@@ -166,0 +178,0 @@ |
@@ -32,5 +32,5 @@ // jshint newcap: false | ||
function createRmCb(parentElm, childElm, listeners) { | ||
function createRmCb(childElm, listeners) { | ||
return function() { | ||
if (--listeners === 0) parentElm.removeChild(childElm); | ||
if (--listeners === 0) childElm.parentElement.removeChild(childElm); | ||
}; | ||
@@ -113,3 +113,3 @@ } | ||
listeners = cbs.remove.length + 1; | ||
rm = createRmCb(parentElm, ch.elm, listeners); | ||
rm = createRmCb(ch.elm, listeners); | ||
for (i = 0; i < cbs.remove.length; ++i) cbs.remove[i](ch, rm); | ||
@@ -116,0 +116,0 @@ if (isDef(i = ch.data) && isDef(i = i.hook) && isDef(i = i.remove)) { |
@@ -77,2 +77,25 @@ var assert = require('assert'); | ||
}); | ||
it('remove hook recieves real element', function() { | ||
function rm(vnode, cb) { | ||
console.log(vnode); | ||
console.log(vnode.elm); | ||
console.log(vnode.elm.parentElement); | ||
assert.equal(vnode.elm.tagName, 'DIV'); | ||
assert.equal(vnode.elm.innerHTML, 'First text'); | ||
cb(); | ||
} | ||
var vnode1 = h('div', [ | ||
h('div#wrapper', [ | ||
h('div', 'Some element'), | ||
attachTo(elm, h('div#attached', {hook: {remove: rm}}, 'First text')), | ||
]), | ||
]); | ||
var vnode2 = h('div', [ | ||
h('div#wrapper', [ | ||
h('div', 'Some element'), | ||
]), | ||
]); | ||
patch(vnode0, vnode1); | ||
patch(vnode1, vnode2); | ||
}); | ||
}); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
478315
31
9783
278
12