dom-delegator
Version:
Decorate elements with delegated events
133 lines (101 loc) • 3 kB
JavaScript
var test = require("tape")
var cuid = require("cuid")
var setImmediate = require("timers").setImmediate
var document = require("global/document")
var EventSinks = require("event-sinks/geval")
var h = require("./lib/h.js")
var addSinkEvent = require("./lib/add-sink-event.js")
var createEvent = require("./lib/create-event.js")
var Delegator = require("../index.js")
test("Delegator is a function", function (assert) {
assert.equal(typeof Delegator, "function")
assert.end()
})
test("can listen to events", function (assert) {
var elem = h("div")
document.body.appendChild(elem)
var d = Delegator(elem)
var events = EventSinks(d.id, ["foo"])
var called = 0
var id = cuid()
addSinkEvent(elem, "click", events.sinks.foo, {
id: id
})
events.foo(function (value) {
called++
assert.equal(value.id, id)
})
var ev = createEvent("click")
elem.dispatchEvent(ev)
setImmediate(function () {
assert.equal(called, 1)
document.body.removeChild(elem)
assert.end()
})
})
test("can set different data on same sink", function (assert) {
var elem = h("foo", [
h("bar"),
h("baz")
])
document.body.appendChild(elem)
var d = Delegator(elem)
var events = EventSinks(d.id, ["foo"])
var foo = events.sinks.foo
var values = []
addSinkEvent(elem.childNodes[0], "click", foo, {
name: "bar"
})
addSinkEvent(elem.childNodes[1], "click", foo, {
name: "baz"
})
events.foo(function (value) {
values.push(value)
})
var ev = createEvent("click")
elem.childNodes[0].dispatchEvent(ev)
var ev2 = createEvent("click")
elem.childNodes[1].dispatchEvent(ev2)
setImmediate(function () {
assert.equal(values.length, 2)
assert.equal(values[0].name, "bar")
assert.equal(values[1].name, "baz")
document.body.removeChild(elem)
assert.end()
})
})
test("can register multiple sinks", function (assert) {
var elem = h("foo", [
h("bar"),
h("baz")
])
document.body.appendChild(elem)
var d = Delegator(elem)
var events = EventSinks(d.id, ["bar", "baz"])
var bar = events.sinks.bar, baz = events.sinks.baz
var hash = {}
addSinkEvent(elem.childNodes[0], "click", bar, {
name: "baz"
})
addSinkEvent(elem.childNodes[1], "click", baz, {
name: "bar"
})
events.bar(function (value) {
hash.bar = value
})
events.baz(function (value) {
hash.baz = value
})
var ev = createEvent("click")
elem.childNodes[0].dispatchEvent(ev)
var ev2 = createEvent("click")
elem.childNodes[1].dispatchEvent(ev2)
setImmediate(function () {
assert.ok("bar" in hash)
assert.ok("baz" in hash)
assert.equal(hash.bar.name, "baz")
assert.equal(hash.baz.name, "bar")
document.body.removeChild(elem)
assert.end()
})
})