1

我正在尝试使用 AJAX 获取页面,但是当我获取该页面并且它包含 Javascript 代码时 - 它不会执行它。

为什么?

我的 ajax 页面中的简单代码:

<script type="text/javascript">
alert("Hello");
</script>

...并且它不执行它。我正在尝试使用 Google Maps API 并使用 AJAX 添加标记,所以每当我添加一个标记时,我都会执行一个获取新标记的 AJAX 页面,将其存储在数据库中,并且应该将标记“动态”添加到地图中。

但是由于我不能以这种方式执行单个 javascript 函数,我该怎么办?

我事先在页面上定义的函数是受保护的还是私有的?

** 使用 AJAX 功能更新 **

function ajaxExecute(id, link, query)
{
    if (query != null)
    {
        query = query.replace("amp;", "");
    }

    if (window.XMLHttpRequest)
    {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {
        // code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            if (id != null)
            {
                    document.getElementById(id).innerHTML=xmlhttp.responseText;
            }
        }
    }

    if (query == null)
    {
        xmlhttp.open("GET",link,true);
    }
    else
    {
        if (query.substr(0, 1) != "?")
        {
            xmlhttp.open("GET",link+"?"+query,true);
        }
        else
        {
            xmlhttp.open("GET",link+query,true);
        }
    }
    xmlhttp.send();
}

** Deukalion 的解决方案 **

var content = xmlhttp.responseText;

if (id != null)
{

    document.getElementById(id).innerHTML=content;
    var script = content.match("<script[^>]*>[^<]*</script>");

    if (script != null)
    {
        script = script.toString().replace('<script type="text/javascript">', '');
        script = script.replace('</script>', '');
        eval(script);

    }
}

在某些事件上,我必须在脚本中添加事件侦听器,而不仅仅是制作“select onchange='executeFunctionNotIncludedInAjaxFile();'”,我必须为此添加EventListener("change", functionName, false)。在正在评估的脚本中。

4

4 回答 4

5

当您通过将容器设置innerHTML为一些更新的内容来更新页面时,浏览器根本不会运行其中的脚本。您可以找到<script>标签,获取它们innerHTML(IE 可能更喜欢innerTEXT),然后eval()自己编写脚本(这几乎是 jQuery 所做的,尽管它会在更新 DOM 之前使用正则表达式找到脚本)。

于 2012-06-04T21:08:32.283 回答
3

使用这个功能:

function parseScript(_source) {
    var source = _source;
    var scripts = new Array();

    // Strip out tags
    while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1) {
        var s = source.indexOf("<script");
        var s_e = source.indexOf(">", s);
        var e = source.indexOf("</script", s);
        var e_e = source.indexOf(">", e);

        // Add to scripts array
        scripts.push(source.substring(s_e+1, e));
        // Strip from source
        source = source.substring(0, s) + source.substring(e_e+1);
    }

    // Loop through every script collected and eval it
    for(var i=0; i<scripts.length; i++) {
        try {
            eval(scripts[i]);
        }
        catch(ex) {
            // do what you want here when a script fails
        }
    }

    // Return the cleaned source
    return source;
}

然后parseScript(xmlhttp.responseText);在您替换/添加内容时执行此操作。

于 2012-06-05T00:11:25.540 回答
2

万一其他人偶然发现了这个旧线程,Deukalion 接受的答案存在一个问题,有一个问题可能被忽略了:正如所写,脚本仅查找第一个脚本标记。如果存在多个脚本标签,则忽略所有其他标签。

一些小的调整可以解决这个问题。将一行从:

    var script = content.match("<script[^>]*>[^<]*</script>");

至:

    var script = content.match(/<script[^>]*>[^<]*<\/script>/g);

另一个来自:

    script = script.toString().replace('<script type="text/javascript">', '');

至:

    script = script.join("").replace(/<script type="text\/javascript">/g, '');

现在它将收集所有 <script> 代码并按照页面上的顺序执行它们。否则,这是一个很好的解决方案。

于 2013-05-30T00:48:16.540 回答
0

在 AJAX 请求之后,您可以创建一个“成功”函数,该函数可以获取返回的 html 并对其进行处理。然后将执行某些操作。

如果有代码示例,那么我可以针对这种情况提供代码解决方案。但仅使用标准 xmlhttprequest,可以完成以下操作:

xhr = new XMLHttpRequest();
xhr.open("GET","ajax_info.txt",true);
xhr.onreadystatechange=function()
{
if (xhr.readyState==4 && xhr.status==200)
  {
  document.getElementById("myDiv").innerHTML = xhr.responseText;
  }
}
xhr.send();
​
于 2012-06-04T21:07:16.383 回答