2011-04-18 68 views
3

该评估JavaScript是让我疯了......的jQuery在HTML字符串并发症

我所要做的是更新一个网页的一部分,并为理由不值得说明的是,该请求是要求一整个新的HTML页面(包括它的头部),然后只提取指定元素中包含的HTML(由ID标识)。

我本来每当新的HTML AJAX请求完成后,将运行下面的JavaScript代码:

var $newContent = $(newHtmlContent); 
loadingElement.innerHTML = $("#" + loadingElementId, $newContent).html(); 

这是伟大的,直到我有一些HTML已加载的是,包含在指定范围内元素,包含了需要运行一些脚本,所以我改成了这样:

var $newContent = $(newHtmlContent); 
$(loadingElement).html($("#" + loadingElementId, $newContent).html()); 

我已阅读,jQuery将评估与HTML()函数的HTML字符串参数的脚本 - 但是,似乎问题是脚本是条纹的在此通话之前编辑。 有过通过萤火看看下面似乎是发生了什么:

$(newHtmlContent) // includes all 'script' elements 
$("#" + loadingElementId, $newContent) // has no scripts 
$("script", $newContent) // empty jQuery object 

有没有人有什么建议? 在此先感谢。

+0

的利息,可以是一个事实,即jQuery的“$ .load()”调用,它提供了正是你想要的功能在这里实现,当你以这种方式使用它时,也不会执行嵌入的'

1

编辑没关系;我想你在这里沉没了。只要您将内容移交给jQuery,我很确定您的脚本已被删除。如果“newContent”实际上是“native”页面的一部分,但是由于它在jQuery实例化的那个片段中,那么下面的东西技巧将会工作,这太迟了。

认为这会工作,但我承认我还没有加载的文件,就像你得到了什么尝试过:

$('#loadingElement').html($('#' + loadingElementId, $newContent)[0].innerHTML); 

的想法是绕过jQuery的拉出时加载部分的内容。

+0

'$(“#”+ loadingElementId,$ newContent)'简单地执行'$ newContent.find'我仍然坚持如何去除脚本。 – 2011-04-18 16:50:35

+0

我也很困惑;我不知道*做什么,或者为什么。我一直在玩jsfiddle,我只是越来越混乱... – Pointy 2011-04-18 16:52:58

+0

同样在这里。我发布了我的发现。 – 2011-04-18 17:24:01

0

你可以尝试的一件事是将包含的<script>元素和eval()这些元素或将它们追加到页面的head中。

1

有这个问题很长的解释在这里:http://forum.jquery.com/topic/jquery-removing-script-tags-from-html-string-when-using-html

从这个讨论:

如果你想选择一个HTML字符串/遍历一部分,你想要的HTML字符串中<script>要执行,您需要在选择/遍历之前将HTML字符串插入到DOM中。

因此,看起来问题在于您试图将元素从返回的HTML中提取出来,而无需先将其插入到DOM中。两种可能的解决方案:

  1. 将整个返回的HTML插入到DOM中。脚本标签将执行。然后移除你不需要的部分。这并不理想,因为它可能会显示您不想要的内容,除非您先隐藏loadingElement并在完成后显示。

  2. $(newHtmlContent)拉出脚本网址,使用$.getScript()检索并执行每个URL,然后添加检索元素融入DOM。这更加痛苦,但它应该正常工作,并且不必将不必要的内容插入到DOM中。

0

我猜在这里很好,但怎么样:

//scripts will be executed and HTML put into loadingElement 
$('#loadingElement').html(newHtmlContent); 

//find the specified element under #loadingElement, get it's HTML 
//and set it as the HTML for #loadingElement 
$('#loadingElement').html($('#loadingElement').find('#idToFind').html());