由于多个javascript包含/要求,jQuery事件多次触发

由于多个javascript包含/要求,jQuery事件多次触发,javascript,php,jquery,html,ajax,Javascript,Php,Jquery,Html,Ajax,我这里有个问题,这让我很生气。我维护一个遗留的php系统。它组织得很糟糕,没有使用框架,还有很多其他问题,例如,系统的不同部分使用了至少5个不同的查询版本 所以我现在的问题是,我有一个搜索表单,当点击一个按钮时,它会显示一个项目列表,我们称之为“a”对象列表。在每个A项中,都有一个展开/切换按钮来显示属于A的B项(这是使用ajax完成的,通过将特定div的html设置为ajax响应)。然后每个B还有一个展开/切换按钮来显示属于B的C项 发生了什么:我点击搜索,所有的A都显示出来。我单击展开以显示

我这里有个问题,这让我很生气。我维护一个遗留的php系统。它组织得很糟糕,没有使用框架,还有很多其他问题,例如,系统的不同部分使用了至少5个不同的查询版本

所以我现在的问题是,我有一个搜索表单,当点击一个按钮时,它会显示一个项目列表,我们称之为“a”对象列表。在每个A项中,都有一个展开/切换按钮来显示属于A的B项(这是使用ajax完成的,通过将特定div的html设置为ajax响应)。然后每个B还有一个展开/切换按钮来显示属于B的C项

发生了什么:我点击搜索,所有的A都显示出来。我单击展开以显示一个A对象的B项,它们将显示出来。我单击B将其隐藏,它将隐藏,然后再次显示。如果我再次单击它,它将隐藏、显示和隐藏。因此,就像每个ajax请求都包含javascript代码并运行它一样

我认为这在很大程度上是一个组织问题,我不知道如何正确地包含/要求和插入js。我从昨天开始就一直在试图解决这个问题,我想我已经看过很多次代码了,以至于我无法跳出框框去思考

下面是一些组织(我更改了名称,因为有一些业务规则):

SearchResults.php->声明了一个类,该类有静态方法来打印每个项目a、B和C的HTML以及一些其他帮助程序方法。为了让东西“工作”,它需要一个“js.php”;否则,展开按钮不起作用,因为它在执行js时不存在,并且没有绑定任何函数

search.php->包含所有搜索选项的HTML表单,不重要

js.php->javascript的东西,为什么在“.php”中?我甚至记不起来了,但我认为这是因为有了php,我可以要求/包括:

<script type="text/javascript" src="../util/js/jquery/1.8.1/jquery.min.js"></script>

<script>

var jQ = jQuery.noConflict(true);

jQ(document).ready(function() {

  jQ(".loadBfromA").click( function(e) {

    if (div.style.display == 'none')
       alert("was hidden, now is showing");
       //call ajax_B.php
       //response is put into the div using .html(data)

    else
       alert("was showing, now is hidden");
    ...

var jQ=jQuery.noConflict(true);
jQ(文档).ready(函数(){
jQ(“.loadBfromA”)。单击(函数(e){
如果(div.style.display=='none')
警报(“已隐藏,现在显示”);
//调用ajax_B.php
//使用.html(数据)将响应放入div
其他的
警报(“正在显示,现在隐藏”);
...
ajax_B.php->访问数据库并回显将放入A items div的html代码的ajax。这里我需要SearchResults.php,因为我调用了类的一些方法

为什么它包含jQ(文档)。准备好多次执行了吗?我如何修复它?有没有办法重新组织代码

当需要SearchResults.php时,ajax_B.php是否再次包括js,因为SearchResults.php需要js.php?这是否会得到响应,然后放入div

我不能对此胡说八道,因为包含了ajax

编辑:


我已尝试解除绑定(“单击”).bind(“单击”,())但无效。

事件似乎在
jQ(“.loadBfromA”)上绑定了多次。

我知道这不是最干净的解决方案,但您可以重写实际绑定:

jQ(".loadBfromA").bind('click.loadbfroma', function(e) {
    // Do your code
    $(this).unbind('click.loadbfroma');
});

这样,您至少可以确保始终只绑定一个事件,无论代码段被包含多少次。我知道这对解决根本问题没有帮助,但这只是一个开始。

哦,是的,我忘了添加到问题中,我尝试了这个问题和off()函数和两者都不起作用。我将添加它。我不明白为什么它不起作用,但它不起作用。嗯,您是否尝试过跟踪触发事件的次数?控制台.log('message whatever')单击事件的内部将允许您跟踪它是否在单击时被多次弹出。是的,我有,并且它确实触发了多次。好的,让我编辑我的初始帖子,看看在单击事件内部解除绑定是否有帮助。但是,我不完全确定您的代码是否要求单击事件在使用后保持绑定在元素上。我将立即进入工作状态。由于firefox的原因,我不得不更改。在firefox中,您必须将事件作为参数传递给onclick html属性。将它从侦听器更改为单击,而不使用preventDefault()。您尝试过$(document).off()吗?@sushant不,它是做什么的?我应该把它放在哪里?在。准备好了吗?把它放在。准备好了,它仍然会开火多次。