javascript - 在 DOM 加载后执行 append 的 <script> 标签

标签 javascript vue.js append

我正在尝试在模态中观看视频 onClick,而无需自己访问视频页面。

我正在使用 Vue.js,通过一系列 Ajax 调用,我能够完成大部分工作。

编码:https://codepen.io/nolaandy/pen/BrbBzO

如果您点击顶部的“vs Suns”,您会看到所有视频帖子的列表。然后单击任何图像,模态组件弹出并动态接收帖子的标题。

我也想在那里播放视频,所以我尝试运行这个脚本标签:

 < script class="_nbaVideoPlayerScout" data-team="warriors" data-videoId="/video/{{unique videoId from post ajax call}}" data-width="768" data-height="732" src="https://www.nba.com/scout/team/cvp/videoPlayerScout.js"></script>

当模式弹出时,我看到了我点击的帖子/图片的正确标题,并且我看到的脚本标签与检查器中应该显示的完全一样,但脚本标签从未运行。

我应该以其他方式注入(inject)此脚本吗? (这是在 axios 响应调用中)

let theVideoId = response.data.content[0].videoID


let s = document.createElement('script')
s.setAttribute('class', '_nbaVideoPlayerScout')
s.setAttribute('data-team', 'warriors') 
s.setAttribute('data-videoId', '/video/' + theVideoId) 
s.setAttribute('data-width', '768') 
s.setAttribute('data-height', '732') 
s.setAttribute('src', 'https://www.nba.com/scout/team/cvp/videoPlayerScout.js')
document.getElementById('popupVideo').appendChild(s);

模态组件——点击其中一个帖子缩略图时触发

const videoModal = Vue.component('VideoModal', {
props: {
    id: {
    type: String,
    required: true
    }
},
data: function () {
  return {
    post: [],
  }
},
mounted() {
  const singleApi = 'https://cors-anywhere.herokuapp.com/www.nba.com/warriors/api/1.1/json?textformat=html&nid='
  axios.get(singleApi + this.id).then((response) => {
    this.post = response.data.content[0]
    console.log('THE RESPONSE', response)

    let theVideoId = response.data.content[0].videoID


let s = document.createElement('script')
s.setAttribute('class', '_nbaVideoPlayerScout')
s.setAttribute('data-team', 'warriors') 
s.setAttribute('data-videoId', '/video/' + theVideoId) 
s.setAttribute('data-width', '768') 
s.setAttribute('data-height', '732') 
s.setAttribute('src', 'https://www.nba.com/scout/team/cvp/videoPlayerScout.js')
document.getElementById('popupVideo').appendChild(s);
  }).catch((error) => {
    console.log(error)
  })

},
methods: {
  goBack: function () {
    router.go(-1)
  }
},
template:`<div>
<div id="video-popup">
  <button class="close-video-popup" @click="goBack">close me</button>
  <div class="video-popup-wrapper">
    <div class="video-popup--title">{{post.title}}</div>
    <div class="video-popup--video" id="popupVideo"></div>
  <div class="video-popup--share"></div>
</div>
</div>
</div>`
})

最佳答案

我一时兴起做了这个改变:

// document.getElementById('scriptMe').appendChild(s);
document.body.appendChild(s);

然后繁荣、脚本运行和视频加载。

这非常有趣,因为“为什么”,对吧?

编辑: 另外,尝试其他脚本注入(inject)方式discussed here .

document.write方法

document.write(s.outerHTML) // s is a script node

也有效。事实上,您可以将该脚本节点嵌入到 div 中。它也能正常工作。

createContextualFragment 方法

// var $container = document.getElementById('scriptMe'); // does not work
var $container = document.body
var range = document.createRange()
$container.appendChild(range.createContextualFragment(script_str))

作品,其中 script_str是一个 html 字符串文字。这将同时用作 "<script>....</script>""<div id="myDiv"><script>...</script></div>"

但我测试的所有方法最终都需要在 body 中完成注入(inject).

codepen

关于javascript - 在 DOM 加载后执行 append 的 &lt;script&gt; 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49761241/

相关文章:

javascript - jsPDF - 包含其他 pdf

vue.js - 来自 ElementUI 的 VueJs + Webpack 延迟加载模块

javascript - 创建具有不同颜色比例的双色 Canvas

javascript - 如何处理 Array.prototype.reduce() 函数中的 eslint no-param-reassign 规则

javascript - 使用javascript将颜色设置为字符串

javascript - Vue slot-scope 在孙子元素内不起作用

javascript - 如何使用 Vue.js 在 html 中制作 <select> 标签仅显示依赖于另一个 <select> 标签的一些数据

javascript - append 一个新对象然后设置动画

jQuery:append() 对象,用delay() 删除它

javascript - 查找孤立作用域以减少内存泄漏