javascript代码通过ajax返回,但不显示

时间:2013-08-30 02:55:00

标签: php javascript jquery html ajax

所以基本上我使用jQuery post来对外部php页面进行ajax调用,然后我回显结果,然后在实际页面上显示它。

问题是,每当外部php页面返回一些javascript时,它就不会显示在实际页面上。

返回Javascript

<script type="text/javascript">z_media = "SQgeKL07Nr"; z_autoplay=false; z_width=899; z_height=506;</script><script type="text/javascript" src="http://www.zunux.com/static/js/embed.js"></script>

我的jQuery

function videoGrabber(mirror_id, video_version, firstVideo_version, videoNumber) {


        jQuery.post("/path/to/my/external/php/file.php", {firstParam : mirror_id, secondParam : video_version, thirdParam : firstVideo_version}, function(data) {
            //this is your response data from serv
        console.log(data);
        jQuery('#videoContainer').html(data);

    });
        return false;
}

现在一般情况下,当返回iframe时,它们在#videoContainer id中显示完全正常,但是,每当返回javascript嵌入代码时,它都不会在#videoContainer id中显示任何内容。但我可以肯定地确认外部php页面正在返回数据,因为我可以在控制台中看到它。那么,我该如何解决这个问题呢?

3 个答案:

答案 0 :(得分:2)

尝试添加eval()以实际运行您正在检索的Javascript代码:

function videoGrabber(mirror_id, video_version, firstVideo_version, videoNumber) {
    jQuery.post("/path/to/my/external/php/file.php", {firstParam : mirror_id, secondParam : video_version, thirdParam : firstVideo_version}, function(data) {
        //this is your response data from serv
        console.log(data);
        jQuery('#videoContainer').html(data);
        eval(data);
    });
    return false;
}

顺便说一句,确保你有良好的安全性 - 如果有人可以拦截ajax调用并注入自己的代码,那么eval()有很大的混乱可能性。

哦,由于eval()将尝试仅评估Javascript代码,因此您需要将返回代码更改为原始JS代码(无<script>标记):

z_media = "SQgeKL07Nr"; z_autoplay=false; z_width=899; z_height=506;

唯一需要处理的是:

<script type="text/javascript" src="http://www.zunux.com/static/js/embed.js"></script>

你可以在调用页面(带有ajax代码的页面)中包含该脚本,然后从你通过ajax获得的代码中触发它吗?所以你的ajax代码最终将返回类似:

z_media = "SQgeKL07Nr"; z_autoplay=false; z_width=899; z_height=506; triggerEmbedScript();

答案 1 :(得分:0)

为了安全起见,我会避免请求外部JavaScript,然后盲目地运行它,eval或其他方式。如果我是你,我会在JSON对象中返回这些变量。至于额外的脚本,我已经加载了它,并在需要时调用它。

你提到了返回的iframe以及它们如何正常工作。你的意思是说你的php文件可以返回任何HTML直接插入你的#videoContainer吗?我也会避免这种情况。 AJAX请求返回的数据刚刚通过未知领域:互联网。更好的结构可以帮助防止MITM攻击或XSS。

答案 2 :(得分:0)

正如我在上面的评论中提到的,你返回的JS代码并没有真正做任何事情。它只定义了一些(全局)变量。没有可见的内容可以显示在#videocontainer中,并且JS没有调用任何可能触发某些行为的函数。

话虽如此,如果您想加载并执行从AJAX调用中获得的某些JS,我建议您不要尝试添加包含内容的整个script标记,而是执行以下操作: / p>

var script = document.createElement("script");
script.type = "text/javascript";
script.text  = data;
document.body.appendChild(script);

当然,只有当您可以将从AJAX调用获得的数据更改为此字符串(没有标记)时,这才有效:

'z_media = "SQgeKL07Nr"; z_autoplay=false; z_width=899; z_height=506;'

总而言之,您的代码看起来像这样:

function videoGrabber(mirror_id, video_version, firstVideo_version, videoNumber) {
    jQuery.post("/path/to/my/external/php/file.php", {firstParam : mirror_id, secondParam : video_version, thirdParam : firstVideo_version}, function(data) {
        var script = document.createElement("script");
        script.type = "text/javascript";
        script.text  = data;
        document.body.appendChild(script);
    });
    return false;
}