来自ajax的javascript无法正常执行

时间:2016-09-21 08:46:04

标签: javascript php jquery html ajax

使用Ajax,我创建了一种控制台,允许我动态执行一些PHP函数。

看起来像screenshot

问题是在一堆命令之后,控制台变得难以阅读。所以我创建了一个名为“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 = '';
        }

5 个答案:

答案 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)