如何使用innerHTML在AJAX中执行包含JS的页面?

时间:2010-03-07 08:42:06

标签: ajax callback javascript

我将带有AJAX的GET数据发送到另一个文件。另一个文件我有echo "<script>alert('Something');</script>";。这是用AJAX动态显示的,即

var ajaxDisplay = document.getElementById('edit');
ajaxDisplay.innerHTML = ajaxRequest.responseText;

<script>alert('Something');</script>置于 div,并使用名称编辑。 但它没有提醒任何事情。 如何让它发挥作用?

我混合了html / javascript。 这是代码。

function ajaxFunctions(){
    var ajaxRequest;  // The variable that makes Ajax possible!

    try{
        // Opera 8.0+, Firefox, Safari
        ajaxRequest = new XMLHttpRequest();
    } catch (e){
        // Internet Explorer Browsers
        try{
            ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try{
                ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e){
                // Something went wrong
                alert("Your browser broke!");
                return false;
            }
        }
    }
    // Create a function that will receive data sent from the server
    ajaxRequest.onreadystatechange = function(){
        if(ajaxRequest.readyState == 4){
            var ajaxDisplay = document.getElementById('edit');
            ajaxDisplay.innerHTML = ajaxRequest.responseText;
        }
    }


    var namef = document.getElementById('nameed').value;
    var queryString = "?namef=" + namef;
    ajaxRequest.open("GET", "try.php" + queryString, true);
    ajaxRequest.send(null);

}

也许要找到脚本标签并找到 eval ? 但是如何找到脚本标签?

3 个答案:

答案 0 :(得分:1)

不要试图在DOM中注入脚本元素,而是让脚本返回:

alert('Something');

然后使用eval(response);来运行它。或者您可以添加一个脚本元素,其src属性指向返回JavaScript的页面<head>(这是首选方法)。

function loadScript(url) {
    var head = document.getElementsByTagName("head")[0];
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = url;
    head.appendChild(script);
}

请记住,这不适用于跨域请求 - 脚本必须与运行代码的页面具有相同的来源。要解决这个问题,你必须使用回调。

答案 1 :(得分:0)

看起来设置innerHTML的唯一目的是尝试让JS执行。但是一旦页面被加载,JS就不会“知道”它需要解析并执行你已经改变的新文本,所以你的方法不起作用。在这种情况下,你想要的是一个回调函数:

http://api.jquery.com/jQuery.ajax/

我没有使用过jQuery,但看起来你只需要将一个'complete'属性添加到你传递给.ajax()调用的设置对象中,如下所示:

 $.ajax({
   // ......

   complete: function(){
     alert('Something');
   }

   // ......
 });

在这种情况下,一旦ajax调用完成,回调函数就会执行。如果您需要将代码附加到其他事件,您可以选择其他事件,例如成功,失败等等。

答案 2 :(得分:0)

  

但是如何找到脚本标签?

好吧,parent.getElementsByTagName('script')然后评估里面文本节点的data就可以了。

但是,插入包含脚本标记的内容是不可靠的,并且在浏览器中的工作方式略有不同。例如。 IE将在脚本节点第一次插入文档内的任何父节点时执行脚本,而Firefox将在第一次将包含脚本的子树添加到文档内的节点时执行脚本。因此,如果您不是非常小心,您可能会在某些浏览器上执行两次脚本,或者在进一步的页面操作后在错误的时间执行脚本。

所以不要。返回要对任何HTML内容单独执行的脚本,例如。使用包含HTML和JavaScript的JSON对象。