@@ -1491,6 +1491,16 @@ var hyperHTML = (function (document) {
1491
1491
1492
1492
var canDiff = function canDiff ( value ) {
1493
1493
return 'ELEMENT_NODE' in value ;
1494
+ } ; // borrowed from uhandlers
1495
+ // https://github.com/WebReflection/uhandlers
1496
+
1497
+
1498
+ var booleanSetter = function booleanSetter ( node , key , oldValue ) {
1499
+ return function ( newValue ) {
1500
+ if ( oldValue !== ! ! newValue ) {
1501
+ if ( oldValue = ! ! newValue ) node . setAttribute ( key , '' ) ; else node . removeAttribute ( key ) ;
1502
+ }
1503
+ } ;
1494
1504
} ;
1495
1505
1496
1506
var hyperSetter = function hyperSetter ( node , name , svg ) {
@@ -1556,77 +1566,78 @@ var hyperHTML = (function (document) {
1556
1566
// handle it differently from others
1557
1567
1558
1568
if ( name === 'style' ) return hyperStyle ( node , original , isSVG ) ; // direct accessors for <input .value=${...}> and friends
1559
- else if ( name . slice ( 0 , 1 ) === '.' ) return hyperSetter ( node , name . slice ( 1 ) , isSVG ) ; // the name is an event one,
1560
- // add/remove event listeners accordingly
1561
- else if ( / ^ o n / . test ( name ) ) {
1562
- var type = name . slice ( 2 ) ;
1563
-
1564
- if ( type === CONNECTED || type === DISCONNECTED ) {
1565
- observe ( node ) ;
1566
- } else if ( name . toLowerCase ( ) in node ) {
1567
- type = type . toLowerCase ( ) ;
1568
- }
1569
-
1570
- return function ( newValue ) {
1571
- if ( oldValue !== newValue ) {
1572
- if ( oldValue ) node . removeEventListener ( type , oldValue , false ) ;
1573
- oldValue = newValue ;
1574
- if ( newValue ) node . addEventListener ( type , newValue , false ) ;
1569
+ else if ( name . slice ( 0 , 1 ) === '.' ) return hyperSetter ( node , name . slice ( 1 ) , isSVG ) ; // boolean accessors for <input .value=${...}> and friends
1570
+ else if ( name . slice ( 0 , 1 ) === '?' ) return booleanSetter ( node , name . slice ( 1 ) ) ; // the name is an event one,
1571
+ // add/remove event listeners accordingly
1572
+ else if ( / ^ o n / . test ( name ) ) {
1573
+ var type = name . slice ( 2 ) ;
1574
+
1575
+ if ( type === CONNECTED || type === DISCONNECTED ) {
1576
+ observe ( node ) ;
1577
+ } else if ( name . toLowerCase ( ) in node ) {
1578
+ type = type . toLowerCase ( ) ;
1575
1579
}
1576
- } ;
1577
- } // the attribute is special ('value' in input)
1578
- // and it's not SVG *or* the name is exactly data,
1579
- // in this case assign the value directly
1580
- else if ( name === 'data' || ! isSVG && name in node && ! readOnly . test ( name ) ) {
1581
- return function ( newValue ) {
1582
- if ( oldValue !== newValue ) {
1583
- oldValue = newValue ;
1584
-
1585
- if ( node [ name ] !== newValue && newValue == null ) {
1586
- // cleanup on null to avoid silly IE/Edge bug
1587
- node [ name ] = '' ;
1588
- node . removeAttribute ( name ) ;
1589
- } else node [ name ] = newValue ;
1590
- }
1591
- } ;
1592
- } else if ( name in Intent . attributes ) {
1593
- return function ( any ) {
1594
- var newValue = Intent . attributes [ name ] ( node , any ) ;
1595
1580
1581
+ return function ( newValue ) {
1596
1582
if ( oldValue !== newValue ) {
1583
+ if ( oldValue ) node . removeEventListener ( type , oldValue , false ) ;
1597
1584
oldValue = newValue ;
1598
- if ( newValue == null ) node . removeAttribute ( name ) ; else node . setAttribute ( name , newValue ) ;
1585
+ if ( newValue ) node . addEventListener ( type , newValue , false ) ;
1599
1586
}
1600
1587
} ;
1601
- } // in every other case, use the attribute node as it is
1602
- // update only the value, set it as node only when/if needed
1603
- else {
1604
- var owner = false ;
1605
- var attribute = original . cloneNode ( true ) ;
1588
+ } // the attribute is special ('value' in input)
1589
+ // and it's not SVG *or* the name is exactly data,
1590
+ // in this case assign the value directly
1591
+ else if ( name === 'data' || ! isSVG && name in node && ! readOnly . test ( name ) ) {
1606
1592
return function ( newValue ) {
1607
1593
if ( oldValue !== newValue ) {
1608
1594
oldValue = newValue ;
1609
1595
1610
- if ( attribute . value !== newValue ) {
1611
- if ( newValue == null ) {
1612
- if ( owner ) {
1613
- owner = false ;
1614
- node . removeAttributeNode ( attribute ) ;
1615
- }
1616
-
1617
- attribute . value = newValue ;
1618
- } else {
1619
- attribute . value = newValue ;
1596
+ if ( node [ name ] !== newValue && newValue == null ) {
1597
+ // cleanup on null to avoid silly IE/Edge bug
1598
+ node [ name ] = '' ;
1599
+ node . removeAttribute ( name ) ;
1600
+ } else node [ name ] = newValue ;
1601
+ }
1602
+ } ;
1603
+ } else if ( name in Intent . attributes ) {
1604
+ return function ( any ) {
1605
+ var newValue = Intent . attributes [ name ] ( node , any ) ;
1620
1606
1621
- if ( ! owner ) {
1622
- owner = true ;
1623
- node . setAttributeNode ( attribute ) ;
1607
+ if ( oldValue !== newValue ) {
1608
+ oldValue = newValue ;
1609
+ if ( newValue == null ) node . removeAttribute ( name ) ; else node . setAttribute ( name , newValue ) ;
1610
+ }
1611
+ } ;
1612
+ } // in every other case, use the attribute node as it is
1613
+ // update only the value, set it as node only when/if needed
1614
+ else {
1615
+ var owner = false ;
1616
+ var attribute = original . cloneNode ( true ) ;
1617
+ return function ( newValue ) {
1618
+ if ( oldValue !== newValue ) {
1619
+ oldValue = newValue ;
1620
+
1621
+ if ( attribute . value !== newValue ) {
1622
+ if ( newValue == null ) {
1623
+ if ( owner ) {
1624
+ owner = false ;
1625
+ node . removeAttributeNode ( attribute ) ;
1626
+ }
1627
+
1628
+ attribute . value = newValue ;
1629
+ } else {
1630
+ attribute . value = newValue ;
1631
+
1632
+ if ( ! owner ) {
1633
+ owner = true ;
1634
+ node . setAttributeNode ( attribute ) ;
1635
+ }
1624
1636
}
1625
1637
}
1626
1638
}
1627
- }
1628
- } ;
1629
- }
1639
+ } ;
1640
+ }
1630
1641
} ,
1631
1642
// in a hyper(node)`<div>${content}</div>` case
1632
1643
// everything could happen:
0 commit comments