我遇到了一个问题,这让我很生气。我维护一个遗留的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');
});
这样,无论代码片段被包含多少次,您至少可以确保始终只绑定一个事件。我知道这并不能真正帮助你解决根本问题,但这只是一个开始。