首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用javascript在iframe中获取控制台消息?

如何使用javascript在iframe中获取控制台消息?
EN

Stack Overflow用户
提问于 2021-06-27 19:11:53
回答 1查看 88关注 0票数 1

我已经检查了所有其他的问题,但都不起作用。我正试着在下面的代码块上这样做。如何从iframe中获取控制台消息?我可以从iframe外部获取它,但不能将iframe内的控制台消息添加到html中。我在添加脚本标记时遇到了一些问题。

代码语言:javascript
运行
复制
function coderunfunc(cls, ind) {
    let html = document.querySelector(`.${cls} .html-code-run-${ind} code`).textContent;
    let css = document.querySelector(`.${cls} .css-code-run-${ind} code`).textContent;
    let js = document.querySelector(`.${cls} .javascript-code-run-${ind} code`).textContent;
  let sc1='script >';
let sc2='/script >';
let jsa = '<'+sc1 + js + '<' + sc2
    let cdo =`${html} <style>${css}</style> ${jsa}`
    var iframe = document.createElement('iframe');
    iframe.classList.add('iframe-css');
    iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(cdo);
    if (document.querySelector(`.${cls} iframe`)) {
        document.querySelector(`.${cls} iframe`).remove();
    }
    document.querySelector(`.${cls}`).appendChild(iframe);
}
代码语言:javascript
运行
复制
main.main pre {
  display: block;
  background-color: #f6f6f6;
  color: #000;
  padding: 10px;
  max-height: 350px;
  overflow-y: scroll;
  margin: 0;
  border: 1px solid #212121;
}

main.main code {
  background-color: #f6f6f6;
  margin: 0;
  padding: 0;
  color: #000;
  padding: 0px 5px;
}

.main pre code {
  padding: 0;
  margin: 0;
  word-break: break-all !important;
}

.info-r-h {
  width: 100%;
  display: flex;
  justify-content: space-between;
  align-items: center;
  border-top: 2px solid #212121;
  border-bottom: 2px solid #212121;
  padding-top: 2px;
  padding-bottom: 2px;
}

.info-r-h button {
  padding: 10px 20px;
  background-color: #212121;
  color: #fff;
  outline: none;
  border: none;
  border-right: 2px solid #fff;
  border-left: 2px solid #fff;
  cursor: pointer;
}

.code-run-button {
  display: block;
  padding: 10px 20px;
  margin-top: 10px;
  font-size: 20px;
  background-color: #0095ff;
  border: none;
  color: #fff;
  border-radius: 5px;
  cursor: pointer;
}

.iframe-css {
  display: block;
  width: 100%;
  border: 1px solid #212121;
  background-color: #fff;
  margin-top: 10px;
  height: auto;
}
代码语言:javascript
运行
复制
<main class="main">
  <div class="code-run-1" id="1">
    <div class="info-r-h"><span>HTML</span><button onclick="copyelement('html-code-run-1')">Kopyala</button></div>

    <pre class="html-code-run-1" spellcheck="false">
                <code>asdasdasdas</code>
                      </pre>

    <div class="info-r-h"><span>CSS</span><button onclick="copyelement('css-code-run-1')">Kopyala</button></div>

    <pre class="css-code-run-1" spellcheck="false">
                <code>  *{
                                color:red;
                                }</code></pre>

    <div class="info-r-h"><span>JAVASCRIPT</span><button onclick="copyelement('javascript-code-run-1')">Kopyala</button></div>

    <pre class="javascript-code-run-1" spellcheck="false">
                <code>   console.log(&#39;asd&#39;);</code></pre>
    <button class="code-run-button" id="1" onclick="coderunfunc('code-run-1',1)">RUN</button></div>
  <div class="denem"></div>
</main>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-27 19:29:47

您可以在iframe js代码中添加以下内容。这将使用自定义日志方法替换原始的window.console.log,该方法也会将数据发送到父框架。

代码语言:javascript
运行
复制
const originalLog = console.log;
console.log = (...args) => {
  parent.window.postMessage({ type: 'log', args: args }, '*')
  originalLog(...args)
};

在您的父母中,您可以收听以下message事件:

代码语言:javascript
运行
复制
window.addEventListener('message', e => {
  const data = e.data
  if (data.type === 'log') {
     console.log('received from child', data.args)
  }
})

下面是一个有效的例子:

代码语言:javascript
运行
复制
function coderunfunc(cls, ind) {
    let html = document.querySelector(`.${cls} .html-code-run-${ind} code`).textContent;
    let css = document.querySelector(`.${cls} .css-code-run-${ind} code`).textContent;
    let js = document.querySelector(`.${cls} .javascript-code-run-${ind} code`).textContent;
    js = `const originalLog = console.log;
          console.log = (...args) => {
            parent.window.postMessage({ type: 'log', args: args }, '*')
            originalLog(...args)
          };` + js
  let sc1='script >';
let sc2='/script >';
let jsa = '<'+sc1 + js + '<' + sc2
    let cdo =`${html} <style>${css}</style> ${jsa}`
    var iframe = document.createElement('iframe');
    iframe.classList.add('iframe-css');
    iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(cdo);
    if (document.querySelector(`.${cls} iframe`)) {
        document.querySelector(`.${cls} iframe`).remove();
    }
    document.querySelector(`.${cls}`).appendChild(iframe);
}
window.addEventListener('message', e => {
  const data = e.data
  if (data.type === 'log') {
     console.log('received from child', data.args)
  }
})
代码语言:javascript
运行
复制
main.main pre {
  display: block;
  background-color: #f6f6f6;
  color: #000;
  padding: 10px;
  max-height: 350px;
  overflow-y: scroll;
  margin: 0;
  border: 1px solid #212121;
}

main.main code {
  background-color: #f6f6f6;
  margin: 0;
  padding: 0;
  color: #000;
  padding: 0px 5px;
}

.main pre code {
  padding: 0;
  margin: 0;
  word-break: break-all !important;
}

.info-r-h {
  width: 100%;
  display: flex;
  justify-content: space-between;
  align-items: center;
  border-top: 2px solid #212121;
  border-bottom: 2px solid #212121;
  padding-top: 2px;
  padding-bottom: 2px;
}

.info-r-h button {
  padding: 10px 20px;
  background-color: #212121;
  color: #fff;
  outline: none;
  border: none;
  border-right: 2px solid #fff;
  border-left: 2px solid #fff;
  cursor: pointer;
}

.code-run-button {
  display: block;
  padding: 10px 20px;
  margin-top: 10px;
  font-size: 20px;
  background-color: #0095ff;
  border: none;
  color: #fff;
  border-radius: 5px;
  cursor: pointer;
}

.iframe-css {
  display: block;
  width: 100%;
  border: 1px solid #212121;
  background-color: #fff;
  margin-top: 10px;
  height: auto;
}
代码语言:javascript
运行
复制
<main class="main">
  <div class="code-run-1" id="1">
    <div class="info-r-h"><span>HTML</span><button onclick="copyelement('html-code-run-1')">Kopyala</button></div>

    <pre class="html-code-run-1" spellcheck="false">
                <code>asdasdasdas</code>
                      </pre>

    <div class="info-r-h"><span>CSS</span><button onclick="copyelement('css-code-run-1')">Kopyala</button></div>

    <pre class="css-code-run-1" spellcheck="false">
                <code>  *{
                                color:red;
                                }</code></pre>

    <div class="info-r-h"><span>JAVASCRIPT</span><button onclick="copyelement('javascript-code-run-1')">Kopyala</button></div>

    <pre class="javascript-code-run-1" spellcheck="false">
                <code>   console.log(&#39;asd&#39;);</code></pre>
    <button class="code-run-button" id="1" onclick="coderunfunc('code-run-1',1)">RUN</button></div>
  <div class="denem"></div>
</main>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68150546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档