javascript - 流检查错误:fjs.parentNode.insertBefore
问题描述
这是代码
// Load the SDK asynchronously
((d, s, id) => {
let js = null;
let fjs = null;
// eslint-disable-next-line prefer-destructuring
fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s);
js.id = id;
js.src = '//connect.facebook.net/en_US/sdk.js';
fjs.parentNode.insertBefore(js, fjs);
})(document, 'script', 'facebook-jssdk');
这是流量检查错误:
无法调用fjs.parentNode.insertBefore
,因为insertBefore
null 或 undefined [1] 中缺少属性。
如何解决这个问题?谢谢你。
解决方案
问题是由于某种原因它找不到<script>
标签。因此,让我们尝试将其附加到文档中的某个位置:
// Load the SDK asynchronously
((d, s, id) => {
let js = null;
let fjs = null;
// eslint-disable-next-line prefer-destructuring
fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s);
js.id = id;
js.src = '//connect.facebook.net/en_US/sdk.js';
(fjs ? fjs.parentNode : document.lastElementChild).insertBefore(js, fjs);
})(document, 'script', 'facebook-jssdk');
这似乎可以解决它。我希望这有帮助。或者,如果您需要在生产网站上加载 SDK,我建议您执行以下操作。使用setTimeout
延迟0ms
相当于setImmediate
嵌套深度不超过 4 层。
<script>setTimeout(function(){var d=document, s=d.createElement("script");s.id="facebook-jssdk";s.src="//connect.facebook.net/en_US/sdk.js";(d.head||d.all[1]).appendChild(s)},0);</script>
我上面的代码片段将在 DOMContentLoaded 事件之后立即异步加载脚本,这样window.onload
就不会被阻止。我的代码在 IE4+ 中应该可以正常运行,在 IE10+ 中最好,但是 sdk 可能会也可能不会在这些旧浏览器中运行。
推荐阅读
- php - 有没有办法在 OctoberCms 中设置特定 CMS 页面的用户权限?
- python - 如何创建同一类的多个对象,每个对象内部都有一个无限循环
- python - 如何将提交的日期规范化为 UTC 格式 (2019-10-29T02:20:30.45Z) [这不是重复的问题,请阅读整个问题一次]
- c++ - Why do semi-colons in c++ seem to implicitly handle errors? [tldr: they don't]
- python - 我可以在一个函数中调用当前时间两次吗?
- regex - 正则表达式匹配自定义密钥对在 linux 中不起作用
- listview - 如何在 Flutter 中制作动态页面 Item?
- vba - 是否有 View.GetOutline() 的替代方法可以提供更好的轮廓?
- c# - 组合框在搜索文本时选择第一项
- java - 如何设计一个浮动按钮,如附图所示