向Iframe注入Javascript

向Iframe注入Javascript,javascript,jquery,iframe,inject,Javascript,Jquery,Iframe,Inject,我正在为我的网站制作一个实时编辑器。我有CSS和HTML部分了,现在唯一的问题是JS部分。下面是一段代码 var frame = $('#preview_content'), contents = frame.contents(), body = contents.find('body'); csstag = contents.find('head').append('<style></style>').c

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

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() );
        }

        });
      });
var frame=$(“#预览内容”),
contents=frame.contents(),
body=contents.find('body');
csstag=contents.find('head').append('').children('style');
java=contents.find('head').append('').children('script')//这里的问题
$('.area\u content\u box')。焦点(函数(){
var$this=$(this);
var check=$this.attr('id');
$this.keyup(函数(){
如果(检查==“html\U进程”){
html($this.val());
}else if(检查==“css_进程”){
csstag.text($this.val());
}else if(检查==“java_进程”){
text($this.val());
}
});
});
问题是,当我尝试此操作时,它并没有将脚本标记注入iframes的身体或头部。我已经阅读了关于注入和一些包含结束脚本标签的问题。我需要弄清楚如何注入脚本标记,真的希望它们在头部,但如果在身体中更容易,那就好了

如果你认为我应该诚实的话,我将专注于制作这种香草


因此,关于如何让我的编辑器正确使用注入式JS,有什么建议吗?

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

csstag = contents.find('head').append('<style></style>').children('style');
java = contents.find('head').append('<script><\/script>').children('script');//Issues here
这应该适用于主体HTML,也可能适用于样式标记中的CSS文本

我认为它对javascript不起作用,因为您无法通过将文本指定给标记的方式来更改脚本。一旦脚本被解析,它就位于javascript名称空间中

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

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

如果不打算这样做,则必须测试在已插入(并已解析)的样式标记上设置
.text()
的概念是否在所有相关浏览器中都有效

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



这也有其他问题。每次
.area\u content\u box
获得焦点时,您都在安装一个
.keyup()
事件处理程序,这很容易导致安装了许多事件处理程序,所有事件处理程序都被调用,并且都试图执行相同的工作。

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

csstag = contents.find('head').append('<style></style>').children('style');
java = contents.find('head').append('<script><\/script>').children('script');//Issues here
这应该适用于主体HTML,也可能适用于样式标记中的CSS文本

我认为它对javascript不起作用,因为您无法通过将文本指定给标记的方式来更改脚本。一旦脚本被解析,它就位于javascript名称空间中

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

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

如果不打算这样做,则必须测试在已插入(并已解析)的样式标记上设置
.text()
的概念是否在所有相关浏览器中都有效

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



这也有其他问题。每次
.area\u content\u box
获得焦点时,您都在安装一个
.keyup()
事件处理程序,这很容易导致安装了许多事件处理程序,所有事件处理程序都被调用,并且都试图执行相同的工作。

您是否考虑过使用contenteditable属性而不是iframe?甚至IE都支持它。contenteditable可以像iframe一样显示吗?如果你明白我的意思,这是不同的,但同样的效果是可以达到的。现在,你只想在有限的场景中使用iframe,在这些场景中,你将嵌入来自另一个网站的内容。我确实计划使用我的一些其他网站,这些网站在其他地方托管,作为我的用户查找和查看ID/类名的指南。那么,您是否知道iframe注入是否有任何方法?如果没有,contenteditable将如何处理?您找到了解决方案吗?其次,在我的例子中,iframe来自不同的领域。注入java脚本是否仍然可行?您是否考虑过使用contenteditable属性而不是iframe?甚至IE都支持它。contenteditable可以像iframe一样显示吗?如果你明白我的意思,这是不同的,但同样的效果是可以达到的。现在,你只想在有限的场景中使用iframe,在这些场景中,你将嵌入来自另一个网站的内容。我确实计划使用我的一些其他网站,这些网站在其他地方托管,作为我的用户查找和查看ID/类名的指南。那么,您是否知道iframe注入是否有任何方法?如果没有,contenteditable将如何处理?您找到了解决方案吗?其次,在我的例子中,iframe来自不同的领域。是注入javascr吗