【问题标题】:document.currentScript.parentNode.insertAdjacentHTML doesn't work in ajax calldocument.currentScript.parentNode.insertAdjacentHTML 在 ajax 调用中不起作用
【发布时间】:2020-11-11 22:59:35
【问题描述】:

我们有一个包含以下脚本块的组件,用于插入一个 js 可观察图像,当它出现时会更新:

<script type="text/javascript">
  document.currentScript.parentNode.insertAdjacentHTML('afterbegin', '<span class="js-dom-observable js-dom-observable--picture"><img src="http://www.fillmurray.com/200/300" data-src="http://www.fillmurray.com/500/500" alt="Image"></span>');
</script>

当组件直接加载到页面时效果很好,但是,当它由于 ajax 调用而在 html 中并附加到页面时,它不再添加图像 - 我猜这是因为document.currentScript 不再是它所在的脚本标记,而是执行 ajax 的脚本:

$.ajax({
  url: `/${APP_NAME}${filterResultEndpoint}`,
  type: 'POST',
  traditional: true,
  data: searchData.getPostData(),
  success: result => {
    $('.results').html(result);
  },
});

有没有办法让脚本标签中的 insertAdjacentHTML 在 ajax 调用中工作 - 如果我用简单的 document.write 替换 insertAdjacentHTML,它在这两种情况下都可以工作,但我无法使用它,因为它会使我们的编码分析策略失败

【问题讨论】:

    标签: javascript insertadjacenthtml


    【解决方案1】:

    document.currentScript 是一个全局变量,在解析所有脚本标签时会发生变化

    DOM 解析完成后变为 null。

    在进行任何异步操作之前,您必须将元素存储到变量中

    var element = document.currentScript
    $.ajax({
      success() {
        element.parentNode.insertAdjacentHTML(...)
      }
    })
    

    【讨论】:

    • hmm,如果ajax结果中有多个脚本标签被解析,我该如何处理呢?
    • document.currentScript 一次只能是一个,并且永远是当前正在处理的脚本标签
    猜你喜欢
    • 2017-04-07
    • 2017-06-10
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多