使用Ajax,我创建了一种控制台,允许我动态执行一些PHP函数。
问题是在一堆命令之后,控制台变得难以阅读。所以我创建了一个名为“wipe();”的javascript函数,它清除了包含控制台的<div>
。
我使用chrome的开发工具(javascript控制台)测试了这个功能,它运行得很好。
但是当我尝试通过让PHP-AJAX返回“&lt; script&gt; wipe();&lt; / script&gt;”来调用此函数时,它不起作用。它什么都不做。
我在网上看到所有“&lt; script&gt;&lt; / script&gt;”彼此独立工作,但您可以从另一个&lt; script&gt;&lt; / script&gt;中调用<script>function</script>
块即可。
那么为什么没有这样做呢?
这是php代码:
echo '<script>wipe();</script>';
这是第一个&lt; script&gt;块:
var xmlhttp = new XMLHttpRequest();
var span = document.getElementById("screen");
function send(data) {
window.setInterval(function() {
var elem = document.getElementById('screen');
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "./_rcons-transmetter.php?data="+data, true)
xmlhttp.onloadend = function() {
span.innerHTML = span.innerHTML+escapeHtml(data)+'<br>'+xmlhttp.responseText+'<br><br>';
}
xmlhttp.send();
}
function wipe(){
span.innerHTML = '';
}
答案 0 :(得分:2)
为了避免安全问题(例如cross-site scripting攻击),HTML5指定通过innerHTML should not execute插入<script>
标记。
执行脚本的一种方法是使用eval()评估html。请注意:使用eval可能很危险。
var xmlhttp = new XMLHttpRequest();
var span = document.getElementById("screen");
function send(data) {
window.setInterval(function() {
var elem = document.getElementById('screen');
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "./_rcons-transmetter.php?data=" + data, true)
xmlhttp.onloadend = function() {
span.innerHTML = span.innerHTML + escapeHtml(data) + '<br>' + xmlhttp.responseText + '<br><br>';
evalJSFromHtml(span.innerHTML);
}
xmlhttp.send();
}
function wipe() {
span.innerHTML = '';
}
function evalJSFromHtml(html) {
var newElement = document.createElement('div');
newElement.innerHTML = html;
var scripts = newElement.getElementsByTagName("script");
for (var i = 0; i < scripts.length; ++i) {
var script = scripts[i];
eval(script.innerHTML);
}
}
}
答案 1 :(得分:0)
拨打&#39;擦除&#39;直接从发送&#39;作为回调函数。功能。检查状态= 200表示成功响应。
var xmlhttp = new XMLHttpRequest();
var span = document.getElementById("screen");
function send(data) {
window.setInterval(function() {
var elem = document.getElementById('screen');
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "./_rcons-transmetter.php?data="+data, true)
xmlhttp.onloadend = function() {
span.innerHTML = span.innerHTML+escapeHtml(data)+'<br>'+xmlhttp.responseText+'<br><br>';
}
xmlhttp.onreadystatechange = function()
{
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
wipe(); // 'Wipe' callback function
}
}
xmlhttp.send();
}
function wipe(){
span.innerHTML = '';
}
答案 2 :(得分:0)
但是当我尝试通过让PHP-AJAX返回“wipe();”来调用此函数时,它不起作用。它什么都不做。
尝试创建脚本标记并添加到文档而不是更改内部html。
var spaScript = document.getElementById("spaScript");
var wraper = document.createElement("div");
wraper.innerHTML = xmlhttp.responseText;
var script = document.createElement("script");
script.innerHTML = wraper.getElementsByTagName("script")[0].innerHTML;
spaScript.appendChild(script);
答案 3 :(得分:0)
测试wipe()
是否在输入中,是否触发它而不是ajax调用
var xmlhttp = new XMLHttpRequest();
var span = document.getElementById("screen");
function send(data) {
if (data.indexOf('wipe()') == -1) {
window.setInterval(function() {
var elem = document.getElementById('screen');
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "./_rcons-transmetter.php?data=" + data, true)
xmlhttp.onloadend = function() {
span.innerHTML = span.innerHTML + escapeHtml(data) + '<br>' + xmlhttp.responseText + '<br><br>';
}
xmlhttp.send();
}
} else {
wipe();
};
}
function wipe() {
span.innerHTML = '';
}
答案 4 :(得分:-1)
直接在元素中插入脚本标记应该不起作用(并且通过在控制台中生成错误的方式)。
在响应文本上使用本机eval()函数而不指定tag属性可以解决问题。
在服务器端
echo 'wipe()';
在客户端
eval(xmlhttp.responseText)