17

我尝试使用.load()$.ajax获取一些需要附加到容器的 HTML,但是当我将返回的 HTML 中的 Javascript 附加到元素时,它没有被执行。

使用.load()

$('#new_content').load(url+' #content > *',function() {
    alert('returned');
});

我也尝试过切换到 $.ajax 调用。然后我从返回的 HTML 中提取脚本,然后将其附加到容器中,但同样的问题是,在这种情况下,JS 没有被执行甚至附加,据我所知,试图将 a 附加<script>到 DOM 元素像这样不受欢迎?

使用$.ajax

$.ajax({ url: url }).done(function(response) {
    var source  = $("<div>").html(response).find('#overview_script').html();
    var content = $("<div>").html(response).find('#content').html();

    $('#new_content').html(content);
    $('<script>').appendTo('#new_content').text(source).html();

});

理想情况下,我会在附加 HTML 后在回调中运行这个 javascript,但是变量被设置为从控制器返回的值。

因此,总而言之,我正在尝试获取一些包含 JS 的 HTML,这些 JS 需要在附加该 HTML 之后运行,但是我没有运气使用.load()或者$.ajax()返回的 HTML 中的脚本在附加它时消失,或者它确实根本不执行。

4

3 回答 3

22

load()与片段选择器一起使用时,脚本元素将在添加片段之前被剥离,因此脚本不会被执行

当使用没有后缀选择器表达式的 URL 调用 .load() 时,内容会在脚本被删除之前传递给 .html()。这会在脚本块被丢弃之前执行它们。但是,如果调用 .load() 时将选择器表达式附加到 URL,则脚本会在 DOM 更新之前被剥离,因此不会执行。两种情况的示例如下所示:

所以试试

$.get('partial.html', function(result){
    $result = $(result);

    $result.find('#content').appendTo('#new_content');
    $result.find('script').appendTo('#new_content');
}, 'html');

演示:小提琴

于 2013-05-03T05:48:50.703 回答
4

如果您知道要执行的脚本是什么,则可以在 ajax 响应之外的其他地方定义脚本,然后从回调中调用它。所以而不是:

$('#new_content').load(url+' #content > *',function() {alert('returned');});

您可以使用

$('#new_content').load(url+' #content > *',function() {my_function(my_param);});
于 2013-09-25T09:54:04.150 回答
2

这个代码怎么样,

$('#new_content').append($('<script>').html(source));

或者您可以简单地将您的 JavaScript 内容移动到单独的文件并使用

$.getScript("url to js file");

或者只是使用,

eval(source); 
于 2013-05-03T05:53:13.967 回答