jQuery live 无法按预期工作

发布于 2024-12-10 18:28:30 字数 1907 浏览 0 评论 0原文

我在使用 ajax 请求和简单 时遇到问题。

我用来在其他视图中加载视图,我的意思是模块化,使用 jquery 使用 .load(url) 从一个视图到另一个视图。 所以问题是,如果我在 view_1 中加载 view_2 并且 view_2 的 js 脚本在 view_1 中,我需要使用 live('click') 例如从 view_2 启动 xhr 请求,所以当我尝试同时启动3(多个)xhr,而不是一次只启动1个,不知道为什么。

我唯一知道的是:

  1. 在 view_1 中使用 live('click') 它会启动 3 个多个 XHR。
  2. 在 view_1 中使用 click() 它不起作用(显然我认为)。
  3. 直接在 view_2 中使用 click() 它可以工作(但我不能使用 js 在加载的视图中,我只能在“父”视图中使用js)

功能非常简单,真的不知道为什么我有这个问题(我还在ajax beforeSend中禁用了提交)检查这是一个在加载的view_1代码上运行view_2 并启动 3 XHR 进行点击:|

$(document).ready(function(){ 
   $('#save-doc').live('click',function(){
    var _title = $('#doc-title').val();
    var _doc = $('#doc-doc').val();
    update_doc(url_update_doc,{'title':_title,'doc':_doc,'id_doc':_choosed_doc,'id_project':id_project},this);
    });
});
function update_doc(_url,_data,_starter){
    $.ajax({
        type:'POST',
        data:_data,
        url:_url,
        dataType:'json',
        beforeSend:function(){
            $('.ajax-loading').show();
            $(_starter).attr('disabled','disabled');
        },
        error:function(){
            $('.ajax-loading').hide();
            $(_starter).removeAttr('disabled');
        },
        success:function(json){
            $('.ajax-loading').hide();
            $(_starter).removeAttr('disabled');
            if(json.error){
                $('#error-title').html(json.error_title);
                $('#error-doc').html(json.error_doc);
                $.scrollTo('.append-form-edit-doc','fast');
            }
            if(json.confirm){
               $.scrollTo('#top','fast');
               $.gritter.add({
                   title:'Document Saved',
                   text:json.confirm
               });
           }
        }
    });
}

i have problems with ajax requests and simple <input type="submit"/>.

i use to load views inside other views, modular i mean, with jquery using .load(url) from one view to another.
so the problem is that if i load view_2 inside view_1 and the js script for view_2 is inside view_1 i need to use live('click') for example to launch an xhr request from view_2, so when i try it launches 3 (multiple) xhr at same time, instead of only 1 at time, don't know why.

the only thing i know is:

  1. using live('click') in view_1 it launches 3 multiple XHR.
  2. using click() in view_1 it doesn't work(obviously i think).
  3. using click() directly inside view_2 it works (but i can't use js
    in loaded views, i can use js only in "parents" views)

the functions are really simple, really don't know why i have this problem (i also disabled submit in ajax beforeSend) check this is a view_1 code which runs on loaded view_2 and launches 3 XHR for click :|

$(document).ready(function(){ 
   $('#save-doc').live('click',function(){
    var _title = $('#doc-title').val();
    var _doc = $('#doc-doc').val();
    update_doc(url_update_doc,{'title':_title,'doc':_doc,'id_doc':_choosed_doc,'id_project':id_project},this);
    });
});
function update_doc(_url,_data,_starter){
    $.ajax({
        type:'POST',
        data:_data,
        url:_url,
        dataType:'json',
        beforeSend:function(){
            $('.ajax-loading').show();
            $(_starter).attr('disabled','disabled');
        },
        error:function(){
            $('.ajax-loading').hide();
            $(_starter).removeAttr('disabled');
        },
        success:function(json){
            $('.ajax-loading').hide();
            $(_starter).removeAttr('disabled');
            if(json.error){
                $('#error-title').html(json.error_title);
                $('#error-doc').html(json.error_doc);
                $.scrollTo('.append-form-edit-doc','fast');
            }
            if(json.confirm){
               $.scrollTo('#top','fast');
               $.gritter.add({
                   title:'Document Saved',
                   text:json.confirm
               });
           }
        }
    });
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

给妤﹃绝世温柔 2024-12-17 18:28:30

如果这是表单内的提交按钮,那么除非您阻止默认操作,否则表单将被提交。 (这相当于 2 个 POST,但不是 3 个。)

If that's a submit button inside the form then unless you prevent the default action, the form will be submitted. (That'd account for 2 POSTs, but not three.)

不乱于心 2024-12-17 18:28:30

请记住,.live() 将事件处理程序绑定到文档本身。考虑到这一点,每次点击时它都会在整个文档中搜索#save-doc。

如果文档中有多个具有“save-doc”ID 的元素,那么它们都会被触发。

然而,我敢打赌您正在发生的事情是您可能有多个分层表单,这些表单都由这一输入执行。

编辑:第三种可能性,就是Pointy提到的。通过事件处理程序执行提交,并由于浏览器行为而发生另一个提交。

请提供 HTML 以及正在加载的内容。

Remember that .live() is binding the event handler to the document itself. With that in mind, it is searching for #save-doc throughout the document on every click.

If there are multiple elements in the document with the 'save-doc' ID then they'll all be triggered.

However, what I bet is happening to you is you may have multiple forms layered which are all being executed by this one input.

Edit: Third possibility, is what Pointy mentions. Executing a submit via your event handler and another submit occurring because of browser behavior.

Please provide the HTML and what is being loaded into them.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文