所以基本上我使用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页面正在返回数据,因为我可以在控制台中看到它。那么,我该如何解决这个问题呢?
答案 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;
}