diff --git a/src/client/updateClientMetaInfo.js b/src/client/updateClientMetaInfo.js index 792dfd6..26e5b47 100644 --- a/src/client/updateClientMetaInfo.js +++ b/src/client/updateClientMetaInfo.js @@ -42,7 +42,9 @@ export default function _updateClientMetaInfo (options = {}) { break // catch-all update tags default: - const { oldTags, newTags } = updateTags(options)(key, newInfo[key], document.getElementsByTagName('head')[0]) + const headTag = document.getElementsByTagName('head')[0] + const bodyTag = document.getElementsByTagName('body')[0] + const { oldTags, newTags } = updateTags(options)(key, newInfo[key], headTag, bodyTag) if (newTags.length) { addedTags[key] = newTags removedTags[key] = oldTags diff --git a/src/client/updaters/updateTags.js b/src/client/updaters/updateTags.js index 17c8193..d6332ae 100644 --- a/src/client/updaters/updateTags.js +++ b/src/client/updaters/updateTags.js @@ -5,15 +5,15 @@ export default function _updateTags (options = {}) { const { attribute } = options /** - * Updates meta tags inside on the client. Borrowed from `react-helmet`: + * Updates meta tags inside and on the client. Borrowed from `react-helmet`: * https://github.com/nfl/react-helmet/blob/004d448f8de5f823d10f838b02317521180f34da/src/Helmet.js#L195-L245 * * @param {('meta'|'base'|'link'|'style'|'script'|'noscript')} type - the name of the tag * @param {(Array|Object)} tags - an array of tag objects or a single object in case of base * @return {Object} - a representation of what tags changed */ - return function updateTags (type, tags, headTag) { - const nodes = headTag.querySelectorAll(`${type}[${attribute}]`) + return function updateTags (type, tags, headTag, bodyTag) { + const nodes = document.querySelectorAll(`${type}[${attribute}]`) const oldTags = toArray(nodes) const newTags = [] let indexToDelete @@ -72,7 +72,13 @@ export default function _updateTags (options = {}) { } oldTags.forEach((tag) => tag.parentNode.removeChild(tag)) - newTags.forEach((tag) => headTag.appendChild(tag)) + newTags.forEach((tag) => { + if (tag.inBody === true) { + bodyTag.appendChild(tag) + } else { + headTag.appendChild(tag) + } + }) return { oldTags, newTags } } diff --git a/src/server/generators/tagGenerator.js b/src/server/generators/tagGenerator.js index 02180d5..1169e73 100644 --- a/src/server/generators/tagGenerator.js +++ b/src/server/generators/tagGenerator.js @@ -10,9 +10,10 @@ export default function _tagGenerator (options = {}) { */ return function tagGenerator (type, tags) { return { - text () { + text ({inBody = false} = {}) { // build a string containing all tags of this type return tags.reduce((tagsStr, tag) => { + if (!!tag.inBody !== inBody) return tagsStr // build a string containing all attributes of this tag const attrs = Object.keys(tag).reduce((attrsStr, attr) => { switch (attr) {