【问题标题】:Executing javascript script after ajax-loaded a page - doesn't work在ajax加载页面后执行javascript脚本 - 不起作用
【发布时间】:2012-06-08 22:34:30
【问题描述】:

我正在尝试使用 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();'”,我必须为此添加事件侦听器(“change”,functionName,false)。在正在评估的脚本中。

【问题讨论】:

  • 请提供一个发出 AJAX 请求并处理响应的代码示例。

标签: php javascript ajax google-maps


【解决方案1】:

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

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

    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, '');

现在它将收集所有

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我能够正则表达式脚本,所以我只能得到脚本。然后我对它们运行 eval,但它不适用于...说添加的 DOM 元素,其中包含引用未通过 AJAX 加载的主要函数的脚本。
    • 如果服务器直接返回 javascript 怎么办?这将使eval 更易于使用。 (但要小心CSRF。)
    • 当然可以;如果你得到的是纯 JavaScript,那就另当别论了。了解信任问题绝对很重要。
    【解决方案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);

    【讨论】:

      【解决方案4】:

      在 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();
      ​
      

      【讨论】:

      • 我的方法看起来很相似,虽然我有一个更动态的 ajax 函数。它工作正常,除了执行javascripts。我会将代码添加到我的帖子中。
      • @Deukalion,没问题,我喜欢您在问题中发布的解决方案的灵活性。附言如果我的回答有帮助,请投票和/或检查答案。谢谢! :)
      • 不,它没有。我的 php 文件包含一个简单的“alert()”,但它没有执行它。使用 Ajax 加载页面时,我无法访问静态构建的函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 2011-09-02
      • 2021-03-02
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      相关资源
      最近更新 更多