可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a website on Backbone. When I try to execute Disqus code i get
Uncaught TypeError: Cannot read property 'appendChild' of null
How can I fix it? Why is this happening?
var disqus_shortname = 'mysite'; /* * * DON'T EDIT BELOW THIS LINE * * */ (function() { var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js'; (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq); })();
console:
undefined embed.js:1 Unsafe attempt to redefine existing module: BASE embed.js:1 Unsafe attempt to redefine existing module: apps embed.js:1 Unsafe attempt to redefine existing module: get ... embed.js:1 Unsafe attempt to redefine existing module: configAdapter embed.js:1 Unsafe attempt to redefine existing module: removeDisqusLink embed.js:1 Unsafe attempt to redefine existing module: loadEmbed embed.js:1 Unsafe attempt to redefine existing module: reset embed.js:1 Uncaught TypeError: Cannot read property 'appendChild' of null
回答1:
It appears your document is missing both a head
and a body
for some reason.
Try this:
(function() { var dsq = document.createElement('script'); var head = document.getElementsByTagName('head')[0]; var body = document.getElementsByTagName('body')[0]; dsq.type = 'text/javascript'; dsq.async = true; dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js'; console.log('head', head); console.log('body', body); (head || body).appendChild(dsq); }());
Then look in the console.
回答2:
For those just finding this in 2015, in addition to occurring when "head" or "body" is missing, this error will occur when you do not have the following div somewhere in your page:
<div id="disqus_thread"></div>
Put that div where you want the disqus thread to actually appear.
回答3:
I've solved like this:
// Only if disqus_thread id is defined load the embed script if (document.getElementById('disqus_thread')) { var your_sub_domain = ''; // Here goes your subdomain var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; dsq.src = '//' + your_sub_domain + '.disqus.com/embed.js'; (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq); }
Thx to @boutell and @June for the clue.