@@ -53,52 +53,35 @@ module.exports = function draw(gd) {
53
53
return ;
54
54
}
55
55
56
- var legend = fullLayout . _infolayer . selectAll ( 'g.legend' )
57
- . data ( [ 0 ] ) ;
58
-
59
- legend . enter ( ) . append ( 'g' )
60
- . attr ( {
61
- 'class' : 'legend' ,
62
- 'pointer-events' : 'all'
63
- } ) ;
64
-
65
- var clipPath = fullLayout . _topdefs . selectAll ( '#' + clipId )
66
- . data ( [ 0 ] ) ;
67
-
68
- clipPath . enter ( ) . append ( 'clipPath' )
69
- . attr ( 'id' , clipId )
70
- . append ( 'rect' ) ;
56
+ var firstRender = false ;
57
+ var legend = Lib . ensureSingle ( fullLayout . _infolayer , 'g' , 'legend' , function ( s ) {
58
+ s . attr ( 'pointer-events' , 'all' ) ;
59
+ firstRender = true ;
60
+ } ) ;
71
61
72
- var bg = legend . selectAll ( 'rect.bg' )
73
- . data ( [ 0 ] ) ;
62
+ var clipPath = Lib . ensureSingleById ( fullLayout . _topdefs , 'clipPath' , clipId , function ( s ) {
63
+ s . append ( 'rect' ) ;
64
+ } ) ;
74
65
75
- bg . enter ( ) . append ( 'rect' ) . attr ( {
76
- 'class' : 'bg' ,
77
- 'shape-rendering' : 'crispEdges'
66
+ var bg = Lib . ensureSingle ( legend , 'rect' , 'bg' , function ( s ) {
67
+ s . attr ( 'shape-rendering' , 'crispEdges' ) ;
78
68
} ) ;
79
69
80
70
bg . call ( Color . stroke , opts . bordercolor )
81
71
. call ( Color . fill , opts . bgcolor )
82
72
. style ( 'stroke-width' , opts . borderwidth + 'px' ) ;
83
73
84
- var scrollBox = legend . selectAll ( 'g.scrollbox' )
85
- . data ( [ 0 ] ) ;
86
-
87
- scrollBox . enter ( ) . append ( 'g' )
88
- . attr ( 'class' , 'scrollbox' ) ;
74
+ var scrollBox = Lib . ensureSingle ( legend , 'g' , 'scrollbox' ) ;
89
75
90
- var scrollBar = legend . selectAll ( 'rect.scrollbar' )
91
- . data ( [ 0 ] ) ;
92
-
93
- scrollBar . enter ( ) . append ( 'rect' )
94
- . attr ( {
95
- 'class' : 'scrollbar' ,
76
+ var scrollBar = Lib . ensureSingle ( legend , 'rect' , 'scrollbar' , function ( s ) {
77
+ s . attr ( {
96
78
rx : 20 ,
97
79
ry : 3 ,
98
80
width : 0 ,
99
81
height : 0
100
82
} )
101
83
. call ( Color . fill , '#808BA4' ) ;
84
+ } ) ;
102
85
103
86
var groups = scrollBox . selectAll ( 'g.groups' )
104
87
. data ( legendData ) ;
@@ -129,7 +112,6 @@ module.exports = function draw(gd) {
129
112
. call ( setupTraceToggle , gd ) ;
130
113
} ) ;
131
114
132
- var firstRender = legend . enter ( ) . size ( ) !== 0 ;
133
115
if ( firstRender ) {
134
116
computeLegendDimensions ( gd , groups , traces ) ;
135
117
expandMargin ( gd ) ;
@@ -378,10 +360,7 @@ function drawTexts(g, gd) {
378
360
traceIndex = trace . index ,
379
361
name = isPie ? legendItem . label : trace . name ;
380
362
381
- var text = g . selectAll ( 'text.legendtext' )
382
- . data ( [ 0 ] ) ;
383
-
384
- text . enter ( ) . append ( 'text' ) . classed ( 'legendtext' , true ) ;
363
+ var text = Lib . ensureSingle ( g , 'text' , 'legendtext' ) ;
385
364
386
365
text . attr ( 'text-anchor' , 'start' )
387
366
. classed ( 'user-select-none' , true )
@@ -446,15 +425,11 @@ function setupTraceToggle(g, gd) {
446
425
var newMouseDownTime ,
447
426
numClicks = 1 ;
448
427
449
- var traceToggle = g . selectAll ( 'rect' )
450
- . data ( [ 0 ] ) ;
451
-
452
- traceToggle . enter ( ) . append ( 'rect' )
453
- . classed ( 'legendtoggle' , true )
454
- . style ( 'cursor' , 'pointer' )
455
- . attr ( 'pointer-events' , 'all' )
456
- . call ( Color . fill , 'rgba(0,0,0,0)' ) ;
457
-
428
+ var traceToggle = Lib . ensureSingle ( g , 'rect' , 'legendtoggle' , function ( s ) {
429
+ s . style ( 'cursor' , 'pointer' )
430
+ . attr ( 'pointer-events' , 'all' )
431
+ . call ( Color . fill , 'rgba(0,0,0,0)' ) ;
432
+ } ) ;
458
433
459
434
traceToggle . on ( 'mousedown' , function ( ) {
460
435
newMouseDownTime = ( new Date ( ) ) . getTime ( ) ;
0 commit comments