代码之家  ›  专栏  ›  技术社区  ›  Nathan Bubna

当只针对一个元素时,对页面中的每个元素调用jquery-ajax事件

  •  2
  • Nathan Bubna  · 技术社区  · 15 年前

    所以,你有一个页面:

    <html><head>
    <script type="text/javascript" src="jquery.1.3.2.js"></script>
    <script type="text/javascript">
    $(function() {
      var onajax = function(e) { alert($(e.target).text()); };
      var onclick = function(e) { $(e.target).load('foobar'); };
      $('#a,#b').ajaxStart(onajax).click(onclick);
    });
    </script></head><body>
    <div id="a">foo</div>
    <div id="b">bar</div>
    </body></html>
    

    当您单击“foo”时,您希望收到一个或两个警报吗?我希望只有一个,但我有两个。为什么一个事件有多个目标?这似乎违背了最不令人吃惊的原则。我错过什么了吗?有没有一种方法可以通过事件对象来区分对哪个DIV进行LOAD()调用?那肯定会有帮助…

    编辑:为了澄清,点击资料只是为了演示。我的目标是拥有一个非通用的AjaxStart处理程序。我希望Div A在Ajax事件的主题时做一件事情,而Div B做一些不同的事情。因此,从根本上讲,我希望能够知道在捕获Ajax事件时调用了哪个DIV。我开始觉得这是不可能的。也许我应该和jquery-dev一起讨论这个问题…

    3 回复  |  直到 15 年前
        1
  •  1
  •   Nathan Bubna    15 年前

    好的,我接着看了jQueryAjax和事件代码。jquery只全局触发Ajax事件(不带目标元素):

    jQuery.event.trigger("ajaxStart");
    

    没有其他信息。:(

    因此,当trigger方法得到这样的调用时,它会查看jquery.cache并查找所有为该事件类型和jquery.event.trigger绑定了处理程序的元素,但这次是以该元素为目标。

    所以,它和演示中显示的完全一样。当一个实际的Ajax事件发生时,jQuery会为该事件的处理程序绑定到的每个元素触发一个非冒泡事件。

    所以,我想我必须游说他们在执行load()调用时发送更多信息以及“ajaxstart”触发器。

    更新:Ariel最近对此提供了支持。它应该在jquery 1.4中(或者他们决定调用下一个版本的任何内容)。

        2
  •  0
  •   Jason    15 年前

    当你把半开半开的时候,两个沙发都会关上的。所以,当您将每个DIV设置为对AjaxStart事件作出响应时,每次Ajax启动时,它们都会关闭…

    您应该为每个单击处理程序分别执行一些操作,并为AjaxStart事件执行一些常规操作…

        3
  •  -1
  •   Powerlord    15 年前

    因为您有一个带有两个元素的选择器,所以要创建两个AjaxStart处理程序。AjaxStart是一个全局事件,因此一旦触发任何Ajax事件,Onajax函数将被调用两次。所以是的,你会得到两个弹出窗口。