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


jQuery event triggering multiple times because of multiple javascript inclusions/requires

我遇到了一个问题,这让我很生气。我维护一个遗留的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以及其他一些辅助方法。为了让东西"工作",它有一个require"js.php";否则,A展开按钮不起作用,因为在执行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");
    ...

ajax_B.php->访问数据库并返回将放入A项div的html代码的ajax。这里我必须需要SearchResults.php,因为我调用了该类的一些方法。

为什么它包含jQ(文档).ready,并被多次执行?我该怎么修?有什么方法可以重新组织代码吗?

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

我无法对此进行篡改,因为其中包含ajax。

编辑:

我尝试过解除绑定("click").bind("clink",()),但没有成功。

事件似乎在jQ(".loadBfromA") 上被多次绑定

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

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

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