@@ -53,52 +53,35 @@ module.exports = function draw(gd) {
5353 return ;
5454 }
5555
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+ } ) ;
7161
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+ } ) ;
7465
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' ) ;
7868 } ) ;
7969
8070 bg . call ( Color . stroke , opts . bordercolor )
8171 . call ( Color . fill , opts . bgcolor )
8272 . style ( 'stroke-width' , opts . borderwidth + 'px' ) ;
8373
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' ) ;
8975
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 ( {
9678 rx : 20 ,
9779 ry : 3 ,
9880 width : 0 ,
9981 height : 0
10082 } )
10183 . call ( Color . fill , '#808BA4' ) ;
84+ } ) ;
10285
10386 var groups = scrollBox . selectAll ( 'g.groups' )
10487 . data ( legendData ) ;
@@ -129,7 +112,6 @@ module.exports = function draw(gd) {
129112 . call ( setupTraceToggle , gd ) ;
130113 } ) ;
131114
132- var firstRender = legend . enter ( ) . size ( ) !== 0 ;
133115 if ( firstRender ) {
134116 computeLegendDimensions ( gd , groups , traces ) ;
135117 expandMargin ( gd ) ;
@@ -378,10 +360,7 @@ function drawTexts(g, gd) {
378360 traceIndex = trace . index ,
379361 name = isPie ? legendItem . label : trace . name ;
380362
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' ) ;
385364
386365 text . attr ( 'text-anchor' , 'start' )
387366 . classed ( 'user-select-none' , true )
@@ -446,15 +425,11 @@ function setupTraceToggle(g, gd) {
446425 var newMouseDownTime ,
447426 numClicks = 1 ;
448427
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+ } ) ;
458433
459434 traceToggle . on ( 'mousedown' , function ( ) {
460435 newMouseDownTime = ( new Date ( ) ) . getTime ( ) ;
0 commit comments