5

所以基本上我使用 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 时,它​​们在#videoContainerid 中显示得非常好,但是,每当返回 javascript 嵌入代码时,它不会在#videoContainerid 中显示任何内容。但我可以肯定地确认外部 php 页面正在返回数据,因为我可以在控制台中看到它。那么,我该如何解决这个问题?

4

3 回答 3

1

尝试添加一个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;
}

顺便说一句,请确保您具有良好的安全性eval()-如果有人可以拦截 ajax 调用并注入他们自己的代码,则很有可能造成混乱。

哦,由于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();
于 2013-08-30T03:03:02.373 回答
0

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

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

于 2013-08-30T03:13:31.430 回答
0

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

话虽如此,如果您想加载和执行从 AJAX 调用中获得的一些 JS,我建议您不要尝试添加script带有内容的整个标签,而是执行以下操作:

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;
}
于 2013-08-30T03:59:30.887 回答