diff --git a/src/browser/ui/ReactDOMComponent.js b/src/browser/ui/ReactDOMComponent.js index 3d2c2332b8d..246a0cdc837 100644 --- a/src/browser/ui/ReactDOMComponent.js +++ b/src/browser/ui/ReactDOMComponent.js @@ -41,6 +41,8 @@ var CONTENT_TYPES = {'string': true, 'number': true}; var STYLE = keyOf({style: null}); var ELEMENT_NODE_TYPE = 1; +var DOC_NODE_TYPE = 9; +var DOCUMENT_FRAGMENT_NODE_TYPE = 11; /** * Optionally injectable operations for mutating the DOM @@ -100,9 +102,19 @@ function putListener(id, registrationName, listener, transaction) { } var container = ReactMount.findReactContainerForID(id); if (container) { - var doc = container.nodeType === ELEMENT_NODE_TYPE ? - container.ownerDocument : - container; + + var doc = container; // Walk up from container to find best document + while (doc !== null && + doc.nodeType !== DOC_NODE_TYPE && + doc.nodeType !== DOCUMENT_FRAGMENT_NODE_TYPE) { + doc = doc.parentNode; + } + + // If the container isn't mounted in a document, register with the default document + if (doc === null && container.nodeType === ELEMENT_NODE_TYPE) { + doc = container.ownerDocument; + } + listenTo(registrationName, doc); } transaction.getPutListenerQueue().enqueuePutListener(