通过 AJAX 加载时 JQuery 脚本不运行

Posted

技术标签:

【中文标题】通过 AJAX 加载时 JQuery 脚本不运行【英文标题】:JQuery script does not run when loaded via AJAX 【发布时间】:2011-08-01 16:45:25 【问题描述】:

我花了一些时间阅读 jquery 文档和其他问题。我一生都无法弄清楚我做错了什么。只需将页面放在一起并加载页面,我就可以正常工作。但是当我通过 Ajax 加载代码时它不起作用。我阅读了其他一些有类似问题的人,每个人都说使用.live,但这对我也不起作用。我做错了什么?

我正在尝试修改表单 enctype,以便在选中某个框时不会上传文件。

这是通过 ajax 加载的表单:

<form id="RequestForm" enctype="multipart/form-data" method="post" action="/submit">
Input File: <input name="inputFile" value="" id="inputFile" type="file">
<input name="onDrive" id="change_form" value="1" type="checkbox"> Located on drive
</form>

我也有这个代码。它应该放在原始页面上还是可以放在通过 ajax 加载的内容中?我该怎么做才能使它与加载的内容一起工作,所以当 change_form 复选框被选中时,它会更新&lt;form enctype&gt;

<script> 
$(document).ready(function()
    $('#change_form').click(function() 
    if($('#change_form').is(":checked"))
        // update the apply button to enabled
        $('form#RequestForm').removeAttr('enctype');
     else 
        $('form#RequestForm').attr('enctype', 'multipart/form-data');   
    
    ); 
); 
</script>

更新:为了清楚起见,加载了一个 html 页面。然后上面列出的 FORM 根据用户的选择通过 AJAX 加载。我还将表单和脚本添加到 AJAX 加载的内容中,以便在调用 AJAX 事件以加载它之后将其添加到 HTML 页面中。

这里有更多代码的小解释http://pastebin.com/GbWkukQu

【问题讨论】:

一件事,只使用#RequestForm 而不是form#RequestForm,不确定这是否会导致您的问题。 是什么让你说使用“.live()”来设置事件处理程序不起作用?它当然应该。 它可能有效。但我无法让它工作。这就是我在这里寻求建议的原因。我已将alert('clicked') 放入点击事件中,因此我可以看到它正在工作并且它不会“提醒”。 你在为$('#change_form').live("click", function() ... );进行实时绑定吗? 是的。我试过了,它仍然没有用。我需要删除$(document).ready(function()吗? 【参考方案1】:

我绝不是 JQuery 专家,但我认为有一种方法可以完成这项工作并将脚本保留在您需要的 ajax 结果中:

    删除 .ready() 部分,在 html 表单结束后保留​​脚本代码。

    &lt;script type="text/javascript"&gt;

        $('#change_form').click(function() 
        if($('#change_form').is(":checked"))
            // update the apply button to enabled
            $('form#RequestForm').removeAttr('enctype');
         else 
            $('form#RequestForm').attr('enctype', 'multipart/form-data');   
        
    ); 
    

    &lt;/script&gt;

    确保在将 dataType 设置为 html 的情况下完成 JQuery ajax 调用,例如:

    $.ajax( ... dataType: "html"`` ... );`

这将告诉 JQuery 执行 ajax 响应中的所有标签。

或者(可能更安全)是将脚本代码移出 ajax 表单 html 并使用 $('#change_form').live("click", function () handle_code ); 。这将告诉 JQuery 监视 DOM 中的任何更改,因此一旦将表单添加到 DOM 中,它将隐藏 click 事件。

【讨论】:

也试过了。这开始听起来像是更深层次的东西。【参考方案2】:

如果设置 click 事件处理程序的代码正在 document.ready 上运行,但表单实际上并不存在,这可能是您的问题。

将脚本与 ajax 响应中的表单一起发送过来,脚本位于底部。

【讨论】:

我也试过了。我将表单和脚本放在 AJAX 内容上,以便在加载时将它们放在一起。它没有用。我还需要做些什么吗? 我会在 pastebin 上发布一些内容并更新问题。【参考方案3】:

您的问题是准备好的文档已被触发。

将包含的脚本修改为:

function addmystuff()

$('#change_form').click(function() 
    if($('#change_form').is(":checked"))
        // update the apply button to enabled
        $('#RequestForm').removeAttr('enctype');
     else 
        $('#RequestForm').attr('enctype', 'multipart/form-data');   
    
    ); 
;
addmystuff();

这会将事件处理程序添加为新内容的一部分。

假设:jQuery 被正确地添加到页面中。 测试是否添加了 jQuery:(在主页中不是 ajax 加载部分)

$(document).ready(function()
  alert("jquery got loaded");
);

【讨论】:

我没有对此进行测试,您可能必须在新的 div 容器之后添加脚本才能正确处理它。确保您也将类型放入 【参考方案4】:

解决方案不是我所期望的。我有点失望,它无法通过 jQuery 解决。我最终直接编写了 javascript。

function changeForm(chkbox) 
    if (chkbox.checked == 1) 
        document.getElementById("RequestForm").removeAttribute("enctype","");
     else 
        document.getElementById("RequestForm").setAttribute("enctype","multipart/form-data");
       

然后在复选框上添加onClick="changeForm(this);"。现在,即使它是通过 Ajax 加载的,对函数的调用也可以正常工作。它改变了形式,一切都很好。

jQuery 坏了吗?还是我只是错过了什么?

【讨论】:

【参考方案5】:

我不确定,但我遇到了类似的问题。 我有一个适用于菜单的脚本,然后加载包含新菜单的链接内容。 如果我继续单击第一个菜单,它会继续工作,但相同的脚本似乎不适用于新菜单

我认为这是因为 DOM 发生了变化,而 jQuery 仍在使用旧的 DOM。 因此,在您加载新内容后,请重新加载您的脚本。我还没有解决我自己的问题,因为我想重新加载我的脚本,但又不想推翻一些变量。

【讨论】:

以上是关于通过 AJAX 加载时 JQuery 脚本不运行的主要内容,如果未能解决你的问题,请参考以下文章

什么更快? Ajax 加载 JSON 或 Ajax 加载完整输出

如何调试通过 AJAX(特别是 jQuery)加载的 Javascript

脚本无法在 AJAX 页面加载时修改 jQuery Mobile 页面上的页脚?

通过 AJAX 加载 div 时 jQuery 拖放中断

首次加载页面时,Jquery UI 自动完成功能不起作用

通过 ajax 更改页面时如何运行 Greasemonkey 脚本?