2010-09-10 82 views
3

我使用$.get()从远程服务器检索HTML代码段并将该代码段插入到DOM中。该片段包含几个基本的HTML元素和一个脚本元素。所有基本元素都被插入,但脚本元素不会。

例片段:

<p>This is a paragraph</p> 
<script type="text/javascript"> 
// JavaScript that will work with the HTML in the snippet 
</script> 

我已经验证脚本元素是在检索到的片段通过查看Chrome的Web检查检索到的资源。那么,为什么$.get()插入脚本元素,并有可能做我想做的事情?

编辑:

为了澄清,我正在检索HTML片段与$.get()并将其与$().html(data)插入到DOM。

+1

为什么你需要脚本元素?通常你只需要它来执行,你的情况是不同的? – 2010-09-10 15:42:54

+0

该脚本包含处理代码片段中包含的表单元素的函数。这些函数将被绑定到诸如选择更改值和正在提交的表单之类的东西。没有发生这种情况。 – 2010-09-10 15:51:13

回答

1

应该插入脚本元素,就像静态内容一样 - 脚本不会执行。当您使用html()插入html时,它会映射到每个元素的内部属性。历史上,浏览器不会执行以这种方式插入的脚本元素(IE in certain circumstances除外)。

这也反映在HTML 5规范草案definition of innerHTML

注:脚本元素的innerHTML使用插入时,他们不执行插入。

如果要执行该脚本,你可以查找的元素和的eval()它的文本,或创建一个从文本的新脚本元素,并将其插入到DOM正常。

1

执行此操作时,脚本元素未绑定到文档。 您需要自己插入脚本。

要做到这一点的一种方法是通过调用一个回调函数来分析您的返回html并手动插入脚本。像这样的: `

_insertScripts: function(html) { 
     var sfrag = '<script[^>]*>([\\S\\s]*?)<\/script>'; 
     var matchAll = new RegExp(sfrag, 'img'); 
     var matchOne = new RegExp(sfrag, 'im'); 
     if(html.match(matchAll)) { 
      $.map(html.match(matchAll), function(script) { 
       eval((script.match(matchOne) || ['', ''])[1]); 
      }); 
     } 
    } 

`

我已经看到了一些解决方案,还可以使用实时()函数的jQuery,但我不知道它是如何工作的。