0

我正在尝试做一些动态加载,包括 javascript、css 和 html 文件。

我想这样做:

$.when($.ajax(htmlPath), $.get(cssPath), $.ajax({
    url: javascriptPath,
    dataType: "text"
}))
.done(function(response){
// i want to pass the data for each of these to the respective functions        
    appendHtml(what goes here??);       
    appendCss(what goes here??);
    executeJs(what goes here??);
})
.fail(function(){
    console.log("failed");
});

所以我对如何分离响应回调感到困惑。目前,您在我的 .done 函数中看到的响应对象只是我调用的 HTML 文件。这个函数进行了正确的ajax调用,并且正确的文件都被服务器响应了,但是一旦所有的调用都完成了,我该如何访问它们呢?需要这个,所以我不会将 css/js 应用于尚不存在的 HTML,等等。此外,我所做的是将 javascript 文件作为字符串返回,然后在 executeJs 函数中对其进行 eval()。我的理解是,这是可以使用 eval 的,因为它是由我们自己的服务器返回的文件,所以我看不出它是如何被篡改的。这个假设正确吗?

此外,在我的 appendCss 函数中,我只是将它添加到头部的“样式”元素中。这有什么大问题吗?我正在使用所有这些来制作“基于小部件/应用程序”的功能,其中每个“应用程序”都有一个 js、css 和 html,我只想在需要它们并且应用程序正在加载时查询服务器.

4

3 回答 3

3

如果您下载的数据是从与原始网页相同的服务器检索的,那么是的,通常情况下,您对该代码的信任程度与您对已经在浏览器中运行的代码的信任程度相同。

在这样的上下文中的问题eval()不一定是您不信任从您自己的服务器返回的代码。这是有人可能能够更改正在运行的 javascript,以便javascriptPath变量指向您没想到的地方。


就您的实际问题而言,您的done回调实际上将传递三个参数,因为您的when调用包含三个承诺。

由于您定义回调的方式(如function(response)),您只能看到第一个——来自 HTML 调用的返回值。其他两个参数被忽略。

您传递的三个参数中的每一个都是一个包含三个元素的数组:[wasSuccessful, statusText, jqxhr]. 要对它们做一些有用的事情,你可以像这样构造你的回调:

$.when($.ajax(htmlPath), $.get(cssPath), $.ajax({
    url: javascriptPath,
    dataType: "text"
}))
.done(function(htmlResponse, cssResponse, jsResponse){
    if (htmlResponse[0]) {
        appendHtml(htmlResponse[2].responseText);
    }
    if (cssResponse[0]) {
        appendCss(cssResponse[2].responseText);
    }
    if (jsResponse[0]) {
        executeJs(jsResponse[2].responseText);
    }
})

(假设您已经编写了适当appendHtmlappendCss、 和executeJs函数)


这个页面上有一些很好的例子:http: //api.jquery.com/jQuery.when/

这个页面有关于 jqxhr 对象的文档(每个数组中的第三个元素传递给你的 done 函数):http ://api.jquery.com/jQuery.ajax/#jqXHR

于 2012-02-07T17:05:16.050 回答
1

要访问所有响应,只需将三个参数传递给done()回调。尝试这个:

$.when($.ajax(htmlPath), $.get(cssPath), $.ajax({
    url: javascriptPath,
    dataType: "text"
}))
.done(function(responseHTML, responseCSS, responseJS){
    console.log(responseHTML[0]);       
    console.log(responseCSS[0]);
    console.log(responseJS[0]);
})

如果您尝试arguments在 done() 中打印对象,您可以清楚地看到所有响应都传递到回调中

于 2012-02-07T17:11:34.363 回答
0

关于 eval 的使用,请考虑改用 JSONP ( dataType: 'jsonp')。这样 jQuery 会为您执行代码。我想 jQuery 也在后台使用eval(),但至少你知道它是以正确的方式完成的。关于安全性,如果您还没有,还请参阅有关 eval() 何时是邪恶的相关问题。

于 2012-02-07T17:38:08.420 回答