【问题标题】:Injecting Javascript to Iframe将 Javascript 注入 iframe
【发布时间】:2013-03-12 03:55:29
【问题描述】:

我正在为我的网站制作实时编辑器。我有 CSS 和 HTML 部分,现在唯一的问题是 JS 部分。这是一个sn-p的代码

var frame = $('#preview_content'),
           contents = frame.contents(),
           body = contents.find('body');
           csstag = contents.find('head').append('<style></style>').children('style');
           java = contents.find('head').append('<script><\/script>').children('script');//Issues here
       $('.area_content_box').focus(function() {
       var $this = $(this);
       var check = $this.attr('id');
        $this.keyup(function() {

        if (check === "html_process"){
        body.html($this.val());
        } else if(check === "css_process") {
        csstag.text($this.val());
        } else if (check === "java_process"){
        java.text( $this.val() );
        }

        });
      });

问题是当我尝试这个时,它没有在 iframe 主体和头部注入脚本标签。我已经阅读了有关注入和一些包含结束脚本标记的问题。我需要弄清楚如何注入脚本标签,真的希望它们在头脑中,但如果在身体中更容易,那很好。

jfriend00 - 我会专注于制作这个香草,如果你认为我应该诚实的话。

那么关于如何让我的编辑器与注入的 JS 一起正常工作有什么建议吗?

【问题讨论】:

  • 您是否考虑过使用 contenteditable 属性而不是 iframe?甚至 IE 也支持它。
  • contenteditable 是否能够像 iframe 一样显示?如果你明白我的意思吗?
  • 虽然不同,但可以达到相同的效果。这些天来,您真的只想在有限范围的场景中使用 iframe,您从其他网站嵌入一些内容。
  • 嗯,我确实计划使用托管在其他地方的我的一些其他网站作为我的用户查找和查看 ID/类名称的指南。这样做你知道是否有任何方法可以进行 iframe 注入吗?如果不是,内容编辑器将如何处理这个
  • 您找到解决方案了吗?其次,就我而言,iframe 来自不同的域。仍然可以注入 java-script 吗?

标签: javascript jquery iframe inject


【解决方案1】:

这两行代码看起来可能有问题:

csstag = contents.find('head').append('<style></style>').children('style');
java = contents.find('head').append('<script><\/script>').children('script');//Issues here

似乎创建样式标签并记住该 DOM 元素会更好。

var iframe = document.getElementById("preview_content");
var iframewindow = iframe.contentWindow || iframe.contentDocument.defaultView;
var doc = iframewindow.document;
var csstag = doc.createElement("style");
var scripttag = doc.createElement("script");
var head = doc.getElementsByTagName("head")[0];
head.appendChild.cssTag;
head.appendChild.scriptTag;

$('.area_content_box').focus(function() {
    var $this = $(this);
    var check = this.id;
    $this.keyup(function() {
        if (check === "html_process") {\
            // I would expect this to work
            doc.body.html($this.val());
        } else if(check === "css_process") {
            // I don't know if you can just replace CSS text like this 
            // or if you have to physically remove the previous style tag
            // and then insert a new one
            csstag.text($this.val());
        } else if (check === "java_process"){
            // this is unlikely to work
            // you probably have to create and insert a new script tag each time
            java.text( $this.val() );
        }
    });
});

这应该适用于正文 HTML,它可能适用于样式标签中的 CSS 文本。

我不相信它适用于 javascript,因为您无法通过按照您的方式将文本分配给标签来更改脚本。一旦脚本被解析,它就位于 javascript 命名空间中。

据我所知,没有用于删除先前定义和解释的脚本的公共 API。您可以使用后续脚本重新定义全局符号,但不能删除以前的脚本或其效果。

如果这是我的代码,我会删除之前的样式标签,创建一个新的,在其插入 DOM 之前设置文本,然后将其插入 DOM。

如果您不打算那样做,那么您将必须测试以查看在已插入(并已解析)的样式标签上设置 .text() 的概念是否适用于所有相关浏览器。

对于脚本标签,我很确定您必须创建一个新的脚本标签并重新插入它,但是除了重新定义全局符号之外,没有其他方法可以摆脱已经解析过的旧代码。如果您真的想从头开始编写代码,则必须从头开始创建一个新的 iframe 对象。


这也有其他问题。每次 .area_content_box 获得焦点时,您都​​在安装 .keyup() 事件处理程序,这很容易导致安装许多事件处理程序,所有事件处理程序都被调用并且都试图做同样的工作。

【讨论】:

  • 嗯,明天我要上床睡觉时再看看这个。我知道 CSS 有效。这只是一个实时编辑器。元素中没有样式。该人单击 HTML 文本区域并编写 HTML。然后他们单击 CSS 框并设置这些元素的样式。然后 javascript 将在脚本标签内以相同的方式大声笑。它有点像 JSBin,但我是专门为我的网站制作的,并添加了一些与托管公司合作的功能。仍然为您实际来阅读此书投了赞成票。谢谢
  • 在我的情况下,iframe 来自不同的域,仍然可以注入 java-script 吗?
  • @coding_idiot - 出于安全原因,您不能修改来自不同域的 iframe。见同源政策here
  • 一定有办法。我正在考虑小程序和闪存。你觉得有可能吗?!
  • @coding_idiot - 你读过我引用的关于同源安全限制的参考吗?除非您可以更改其他域上 iframe 中的代码以通过 window.postMessage() 之类的方式进行协作,否则您无法修改其他域上的框架。
猜你喜欢
  • 2013-04-18
  • 1970-01-01
  • 2012-08-15
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
相关资源
最近更新 更多