Skip to content

Commit fe46c63

Browse files
committedMar 26, 2016
Merge pull request #108 from evoyy/pr/override-anchor-to-document-body
[fixed] Restore Modal.setAppElement() functionality
2 parents b5e38cf + c13fed9 commit fe46c63

File tree

3 files changed

+12
-3
lines changed

3 files changed

+12
-3
lines changed
 

‎lib/components/Modal.js

+6-3
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@ var elementClass = require('element-class');
77
var renderSubtreeIntoContainer = require("react-dom").unstable_renderSubtreeIntoContainer;
88

99
var SafeHTMLElement = ExecutionEnvironment.canUseDOM ? window.HTMLElement : {};
10+
var AppElement = ExecutionEnvironment.canUseDOM ? document.body : {appendChild: function() {}};
1011

1112
var Modal = module.exports = React.createClass({
1213

1314
displayName: 'Modal',
1415
statics: {
15-
setAppElement: ariaAppHider.setElement,
16+
setAppElement: function(element) {
17+
AppElement = ariaAppHider.setElement(element);
18+
},
1619
injectCSS: function() {
1720
"production" !== process.env.NODE_ENV
1821
&& console.warn('React-Modal: injectCSS has been deprecated ' +
@@ -45,7 +48,7 @@ var Modal = module.exports = React.createClass({
4548
componentDidMount: function() {
4649
this.node = document.createElement('div');
4750
this.node.className = 'ReactModalPortal';
48-
document.body.appendChild(this.node);
51+
AppElement.appendChild(this.node);
4952
this.renderPortal(this.props);
5053
},
5154

@@ -55,7 +58,7 @@ var Modal = module.exports = React.createClass({
5558

5659
componentWillUnmount: function() {
5760
ReactDOM.unmountComponentAtNode(this.node);
58-
document.body.removeChild(this.node);
61+
AppElement.removeChild(this.node);
5962
},
6063

6164
renderPortal: function(props) {

‎lib/helpers/ariaAppHider.js

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ function setElement(element) {
66
element = 'length' in el ? el[0] : el;
77
}
88
_element = element || _element;
9+
return _element;
910
}
1011

1112
function hide(appElement) {

‎specs/Modal.spec.js

+5
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ describe('Modal', function () {
3131
var node = document.createElement('div');
3232
Modal.setAppElement(app);
3333
ReactDOM.render(React.createElement(Modal, {isOpen: true}), node);
34+
var modalParent = app.querySelector('.ReactModalPortal').parentNode;
35+
assert.notEqual(modalParent, document.body);
36+
assert.equal(modalParent, app);
3437
equal(app.getAttribute('aria-hidden'), 'true');
3538
ariaAppHider.resetForTesting();
3639
ReactDOM.unmountComponentAtNode(node);
@@ -54,6 +57,7 @@ describe('Modal', function () {
5457
return React.DOM.div({}, React.createElement(Modal, {isOpen: true, ariaHideApp: false}, 'hello'));
5558
}
5659
});
60+
Modal.setAppElement(document.body);
5761
ReactDOM.render(React.createElement(App), node);
5862
var modalParent = document.body.querySelector('.ReactModalPortal').parentNode;
5963
equal(modalParent, document.body);
@@ -78,6 +82,7 @@ describe('Modal', function () {
7882
equal(props.shouldCloseOnOverlayClick, true);
7983
ReactDOM.unmountComponentAtNode(node);
8084
ariaAppHider.resetForTesting();
85+
Modal.setAppElement(document.body); // restore default
8186
});
8287

8388
it('removes the portal node', function() {

0 commit comments

Comments
 (0)
Please sign in to comment.