使用 Ajax,我创建了一种允许我动态执行一些 PHP 函数的控制台。
问题是,在一堆命令之后,控制台变得难以阅读。所以我创建了一个名为“wipe();”的 javascript 函数,它清除了 <div>
。包含控制台。
我用 chrome 的开发者工具(javascript 控制台)测试了这个功能,它工作得很好。
但是当我尝试通过使 PHP-AJAX 返回“<script>wipe();</script>”来调用此函数时,它不起作用。它什么都不做。
我在网上读到所有的“<script></script>”都是独立工作的,但是你可以调用一个<script>function</script>
来自另一个 <script></script> block 。
那么为什么它没有这样做呢?
这是PHP代码:
echo '<script>wipe();</script>';
这是第一个 <script> block :
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 = '';
}
最佳答案
为了避免安全问题(如 cross-site scripting 攻击)HTML5 指定 <script>
通过 innerHTML 插入的标签 should not execute .
执行脚本的一种方法是使用 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);
}
}
}
关于来自 ajax 的 javascript 没有得到正确的执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39611635/