//插入html代码 const html = { document: false, init: function(doc) { this.document = doc.$refs.initHtml.$el; }, insert: function(html) { var self = this; var div = document.createElement('div'); div.innerHTML = html; this.document.appendChild(div); var scripts = div.querySelectorAll('script'); return Array.prototype.slice.apply(scripts).reduce((chain, script) => { return chain.then(() => self.runScript(script)); }, Promise.resolve()); }, //执行script代码 runScript: function(script) { return new Promise((reslove, rejected) => { const newScript = document.createElement('script'); newScript.innerHTML = script.innerHTML; const src = script.getAttribute('src'); if (src) newScript.setAttribute('src', src); // script 加载完成和错误处理 newScript.onload = () => reslove(); newScript.onerror = err => rejected(); document.head.appendChild(newScript); document.head.removeChild(newScript); if (!src) { // 如果是 inline script 执行是同步的 reslove(); } }) }, } export default html;