You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
3.0 KiB
87 lines
3.0 KiB
/** |
|
* Copyright 2013-2015, Facebook, Inc. |
|
* All rights reserved. |
|
* |
|
* This source code is licensed under the BSD-style license found in the |
|
* LICENSE file in the root directory of this source tree. An additional grant |
|
* of patent rights can be found in the PATENTS file in the same directory. |
|
* |
|
* @providesModule setInnerHTML |
|
*/ |
|
|
|
/* globals MSApp */ |
|
|
|
'use strict'; |
|
|
|
var ExecutionEnvironment = require("./ExecutionEnvironment"); |
|
|
|
var WHITESPACE_TEST = /^[ \r\n\t\f]/; |
|
var NONVISIBLE_TEST = /<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/; |
|
|
|
/** |
|
* Set the innerHTML property of a node, ensuring that whitespace is preserved |
|
* even in IE8. |
|
* |
|
* @param {DOMElement} node |
|
* @param {string} html |
|
* @internal |
|
*/ |
|
var setInnerHTML = function(node, html) { |
|
node.innerHTML = html; |
|
}; |
|
|
|
// Win8 apps: Allow all html to be inserted |
|
if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) { |
|
setInnerHTML = function(node, html) { |
|
MSApp.execUnsafeLocalFunction(function() { |
|
node.innerHTML = html; |
|
}); |
|
}; |
|
} |
|
|
|
if (ExecutionEnvironment.canUseDOM) { |
|
// IE8: When updating a just created node with innerHTML only leading |
|
// whitespace is removed. When updating an existing node with innerHTML |
|
// whitespace in root TextNodes is also collapsed. |
|
// @see quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html |
|
|
|
// Feature detection; only IE8 is known to behave improperly like this. |
|
var testElement = document.createElement('div'); |
|
testElement.innerHTML = ' '; |
|
if (testElement.innerHTML === '') { |
|
setInnerHTML = function(node, html) { |
|
// Magic theory: IE8 supposedly differentiates between added and updated |
|
// nodes when processing innerHTML, innerHTML on updated nodes suffers |
|
// from worse whitespace behavior. Re-adding a node like this triggers |
|
// the initial and more favorable whitespace behavior. |
|
// TODO: What to do on a detached node? |
|
if (node.parentNode) { |
|
node.parentNode.replaceChild(node, node); |
|
} |
|
|
|
// We also implement a workaround for non-visible tags disappearing into |
|
// thin air on IE8, this only happens if there is no visible text |
|
// in-front of the non-visible tags. Piggyback on the whitespace fix |
|
// and simply check if any non-visible tags appear in the source. |
|
if (WHITESPACE_TEST.test(html) || |
|
html[0] === '<' && NONVISIBLE_TEST.test(html)) { |
|
// Recover leading whitespace by temporarily prepending any character. |
|
// \uFEFF has the potential advantage of being zero-width/invisible. |
|
node.innerHTML = '\uFEFF' + html; |
|
|
|
// deleteData leaves an empty `TextNode` which offsets the index of all |
|
// children. Definitely want to avoid this. |
|
var textNode = node.firstChild; |
|
if (textNode.data.length === 1) { |
|
node.removeChild(textNode); |
|
} else { |
|
textNode.deleteData(0, 1); |
|
} |
|
} else { |
|
node.innerHTML = html; |
|
} |
|
}; |
|
} |
|
} |
|
|
|
module.exports = setInnerHTML;
|
|
|