如何在ajax调用中包含js文件?

时间:2010-04-20 08:19:22

标签: javascript ruby-on-rails ajax

我正在调用ajax方法来更新div。它包含需要java脚本文件的链接和函数。但是这些方法和函数没有被正确调用,因为java脚本文件没有通过ajax调用包含在内。例如,我试图调用一个灯箱功能,但它被重定向到不同的页面而不是灯箱。

提前致谢,Anubhaw Prakash

7 个答案:

答案 0 :(得分:2)

原型中的Ajax框架将正确执行<script>标记的文本内容,但通过<script src="somefile.js"/>导入新的脚本文件。我想出的唯一解决方案是在页面的头部导入我需要的所有javascript文件。这样,导入文件中的函数可用于Ajax响应中执行的内联javascript代码。

答案 1 :(得分:1)

我有一个类似的问题,我确实想要后载一些javascript。我做的是分离加载html片段并将脚本加载到两个调用中。为了加载脚本,我调用以下函数(我有JQuery处理ajax部分):

function loadModule(name, callback) {
    $.ajax({type: "POST"
          , url: "/js/" + name
          , dataType: "script"
          , success: callback
    });     
}

答案 2 :(得分:0)

我看到你正在使用Ruby on Rails - 这是否意味着你在客户端使用Prototype?如果是这样,Prototype的Ajax.Updater将忽略引用外部文件的脚本标记(它将评估内联内容的脚本标记)。因此,要将这些外部文件添加到您的页面,您必须通过onSuccess回调挂钩到该过程,在responseText中查找带有src属性的脚本标记,并处理这些你自己。一旦您确定了相关的脚本标记并提取了它们的src属性,您就可以通过动态添加脚本来包含它们,如this article中所述,来自非官方原型&amp; script.aculo.us wiki。

答案 3 :(得分:0)

写入<script>

innerHTML标记不会在写入时执行。您可以element.getElementsByTagName('script')尝试抓住它们并手动执行它们的脚本,但它非常难看并且不可靠。

<script>写入innerHTML的{​​{1}}元素发生的事情之间存在繁琐的浏览器差异,然后(直接或通过祖先)重新插入到文档中。你想避免这种事情:根本不要将<script>写入innerHTML

然后您也不必担心两次执行脚本,这是您不想对库脚本执行的操作。您不希望最终得到一个看起来相同但不比较相等的函数/类的两个副本,并且它们将钩子保持在彼此不能很好地相互作用的页面上。动态插入的库脚本是混淆失败的一种方法。

更好地静态包含脚本,并在将新元素写入页面后手动将它们绑定到页面元素。如果你真的需要,你可以让你的AJAX调用获取一个JSON对象,该对象包含要添加的新HTML和要执行的一串脚本。

答案 4 :(得分:0)

可能想尝试在:before选项中运行一些准备好的javascript,以使用正确的文件设置变量?

答案 5 :(得分:0)

嘿,我找到了添加它的方法.... :)

注意 - 这是一个同步过程,所以你不必担心脚本是否加载....脚本将始终加载实例你调用该函数,你可以立即开始使用加载的脚本..

让我们使用这两个函数

1)第一个是用于检索值的ajax函数 async应为true以同步发送请求

    // AJAX FUNCTION
    function loadXMLDoc(reqt,url,reqp,cfunc,async)
    {
        var xmlhttp;
        try// code for IE7+, Firefox, Chrome, Opera, Safari
        {
            xmlhttp=new XMLHttpRequest();
        }
        catch(err)// code for IE6, IE5
        {
            try{
                xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch(e){
                try{
                    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch(E){}
            }
        }
        if(!xmlhttp)
        {
            alert("error");
        }
    xmlhttp.onreadystatechange=function(){
        if(xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            cfunc(xmlhttp.responseText);
        }
    }
    if(reqt=='GET')
    {
        url+=(reqp!=""?"?":"")+reqp;
        xmlhttp.open("GET",url,(async?false:true));
        xmlhttp.send();
    }
    else if(reqt=='POST')
    {
        xmlhttp.open("POST",url,(async?false:true));
        xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xmlhttp.send(reqp);
    }
    else
    {
        return false;
    }
    }
    /*use this function
    loadXMLDoc(reqt,url,reqp,function(response){
    });
    */

2)然后我们使用ajax将js文件作为字符串加载,然后将其附加到新脚本标记的innerHTML然后将其附加到head部分,还有一件事要确保文件已经加载我使用了脚本的id tag作为文件的路径,这使得检查重复的确是一件容易的事......:)

    //add new script dynamically
    function add_script(src)
    {
        if(!document.getElementById(src))
        {
            loadXMLDoc("GET",src,"",function(jsresp){
                var head = document.getElementsByTagName("head")[0];
                var script=document.createElement("script");
                script.type='text/javascript';
                script.id=src;
                script.text=jsresp;
                head.appendChild(script);
            },true);
        }
    }

感谢我以前获得的所有帮助,并将从本网站及其用户获取用于开发目的......

关于VIPIN JAIN

答案 6 :(得分:-2)

  1. 在需要使用它们的页面上包含静态脚本(IE包含灯箱,然后包含灯箱脚本)
  2. 问题解决了。不要使用AJAX加载脚本
  3. 使用AJAX回调对静态脚本进行必要的函数调用