javascript - ajax 调用后脚本加载到哪里?

标签 javascript jquery jquery-selectors

假设您有一个动态加载内容的简单网页,如下所示:

- main.html -

<!DOCTYPE html>
<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript"
   src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-1.6.2.js">
</script>
<script type="text/javascript">
$(function() {
    $.ajax({
         type: 'get', cache: false, url: '/svc.html',
         success: function(h) {
             $('#main').html(h);
         }
    });
});
</script>
</head>

<body>
    <div id='main'>
    loading...
    </div>
</body>
</html>

并且它加载的页面在单独的文件中使用了一点 Javascript:

- svc.html -

<script type="text/javascript"
   src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-1.6.2.js">
</script>
<script type="text/javascript" src="/plugin.js" css="/plugin.css"></script>
<div id='inner'>
dynamically loaded content
</div>

注意脚本标签上的 css 属性 - 它表示属于脚本的样式表,脚本将为我们加载。这是脚本:

- plugin.js -

var css = $('<link />', {
    rel: "stylesheet", type: "text/css", href: $('script:last').attr('css')
});
$('head').append(css);

最后是样式表,它只是为加载的 inner div 着色,以证明一切正常:

- plugin.css -

#inner
{
    border: solid 1px blue;
}

现在,您会注意到样式表的加载方式:我们查看 $('script') 并选择最后一个,然后我们获取 css 属性并将 link 项附加到文档的头部。

我可以访问 /svc.html 并且 javascript 运行,加载我的样式表,一切都很酷 - 但是,如果我访问 /main.html,javascript运行但未能在 $('script') 的数组中找到 plugin.js 的加载(因此无法加载样式表)。请注意,插件脚本会运行,只是看不到它自己。

这是一个错误吗? jQuery AJAX 方法的限制? $('script') 不应该反射(reflect)所有 已加载的脚本吗?

* 编辑 *

在痛哭流涕和咬牙切齿之后,我决定采用 Kevin B 的解决方案,但是,我无法让它工作,主要是因为 plugin.js 代码在scriptNode 被插入,但在插件代码中,该节点尚未插入,因此在 $('script') 数组中不可用 - 所以我还是SOL。我已将所有代码放在此处以供审查:

http://www.arix.com/tmp/loadWithJs/

最佳答案

将 HTML 添加到 DOM 的 jQuery 代码总是去掉 <script>标签。它运行它们,然后将它们丢弃。

该行为的一个异常(exception)是当您使用“$.load()”和允许您加载页面片段的 hack 时:

$.load("http://something.com/whatever #stuff_I_want", function() { ... });

在这种情况下,脚本会被剥离并且不会评估/运行。

关于javascript - ajax 调用后脚本加载到哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8234215/

相关文章:

javascript - 从函数 javascript 返回数组

JavaScript 日期 : Why those two dates are different?

jquery - "magical"使用 jQuery 设置 HTML 元素的样式

javascript - 如何在 jQuery 中单击时查找 data-* 属性值?

jquery - 组合选择器?

javascript - web3 立即触发回调

javascript - jQuery Slider 通过 AJAX 发送错误值

javascript - 选择日期选择器的父元素

javascript - $(li).width() 返回值包括填充?

javascript - JQuery 选择 ul 中的所有后代 li?