7

我有一个演示布局的页面设置:

+------------------------+
|prev                next|
|+----------------------+|
||         page         ||
||   dynamic content    ||
||                      ||
|+----------------------+|
+------------------------+

在上面的示例中,next/prev 是导航按钮,用于控制动态内容$("page").load(url);

在其中一个页面上,我有一个弹出窗口,其中包含链接到控制弹出窗口内容的 ajax 调用的按钮。

当页面首次加载时,这些按钮可以很好地完成它们的工作。如果页面被更改(使用导航按钮)然后又改回来,弹出窗口将打开但按钮不起作用。如果单击按钮,关闭弹出窗口,然后重新打开弹出窗口,您在第一次单击时请求的信息会显示,但按钮仍然不起作用。

这告诉我ajax请求很好,某处元素的绑定有问题。这是我的Javascript:

$('#resTable').on('click',this,function() {
    $('#ayAvgDPm').html("");
    $('#aoAvgDPm').html("");
    $('#ayTotProfit').html("");
    $('#aoTotProfit').html("");
    $('#ayAvgPcPm').html("");
    $('#aoAvgPcPm').html("");
    $('#ayTotPcProfit').html("");
    $('#aoTotPcProfit').html("");
    $('#ayrRes').html("");
    $('#etfProductPopup').bPopup();
});

$('div[class^="sideNav"]').on('click',this,function() {

    $('#yrSummary').fadeIn(200);

    $('#yAvgDPm').html("");
    $('#oAvgDPm').html("");
    $('#yTotProfit').html("");
    $('#oTotProfit').html("");
    $('#yAvgPcPm').html("");
    $('#oAvgPcPm').html("");
    $('#yTotPcProfit').html("");
    $('#oTotPcProfit').html("");
    $('#yrRes').html("");

    var yr = "20"+$(this).attr('class').substr(-2);

    var req = $.ajax({
        url : '../includes/prod_results.php',
        type : 'POST',
        dataType : "json",
        data : {
            y : yr,
            t : 'ETF'
        },
        success : function(j) {
            var table = "<table cellspacing='0'><tr><th>Year</th><th>Returns</th></tr>";
            for(var i = 0; i < 12; i++) {
                if (i === 5 && yr === '2014'){
                    break;
                }
                var obj = j[i];
                var month = obj['month'];
                var profit = obj['profit'];
                var bal = obj['bal'];
                table += "<tr><td style='width:75px'>"+month+"</td><td style='padding: 0 15px'>"+parseFloat(profit).toFixed(2)+"%</td><td style='width:75px'>$"+comma(parseFloat(bal).toFixed(2))+"</td></tr>";
                if (i === (11)) {
                    table += "</table>";
                }
            }
            var YAvgDPm = comma(parseFloat(j.YAvgDPm).toFixed(2));
            var OAvgDPm = comma(parseFloat(j.OAvgDPm).toFixed(2));
            var YTotProfit = comma(parseFloat(j.YTotProfit).toFixed(2));
            var OTotProfit = comma(parseFloat(j.OTotProfit).toFixed(2));
            var YAvgPcPm = comma(parseFloat(j.YAvgPcPm).toFixed(2));
            var OAvgPcPm = comma(parseFloat(j.OAvgPcPm).toFixed(2));
            var YTotPcProfit = comma(parseFloat(j.YTotPcProfit).toFixed(2));
            var OTotPcProfit = comma(parseFloat(j.OTotPcProfit).toFixed(2));

            $('#yAvgDPm').html("$"+YAvgDPm);
            $('#oAvgDPm').html("$"+OAvgDPm);
            $('#yTotProfit').html("$"+YTotProfit);
            $('#oTotProfit').html("$"+OTotProfit);
            $('#yAvgPcPm').html(YAvgPcPm+"%");
            $('#oAvgPcPm').html(OAvgPcPm+"%");
            $('#yTotPcProfit').html(YTotPcProfit+"%");
            $('#oTotPcProfit').html(OTotPcProfit+"%");
            $('#yrRes').html(table);
            $('#yrGraph').html("<img src='../images/graphs/etf_"+yr+".jpg'>");
            return false;
        }
    });
    return false;
});

我知道它相当长...

我已经在处理程序内部和外部尝试了上述脚本$(document).ready()

有人可以帮我看看我没有做什么吗?

编辑按要求,HTML:

<table id="resTable" cellspacing="0">
    <tr>
        <th>Year</th>
        <th> 1st Quarter</th>
        <th>2nd Quarter</th>
        <th>3rd Quarter</th>
        <th>4th Quarter</th>
        <th>Year Total</th>
        <th>Month Avg</th>
    </tr>
...
</table>

<div id="etfProductPopup">
<h1 style="text-align:center">ETF - Compounded Results</h1>
<div id="popupLeftBar">
    <div class="sideNav14">
        2014
    </div>
    <div class="sideNav13">
        2013
    </div>
    <div class="sideNav12">
        2012
    </div>
    <div class="sideNav11">
        2011
    </div>
    <div class="sideNav10">
        2010
    </div>
    <div class="sideNav09">
        2009
    </div>
    <div class="sideNav08">
        2008
    </div>
    <div class="sideNav07">
        2007
    </div>
    <div class="sideNav06">
        2006
    </div>
    <div class="sideNav05">
        2005
    </div>
    <div class="sideNav04">
        2004
    </div>
    <div class="sideNav03">
        2003
    </div>
</div>
<div id="popupMain">
    <div id="yrSummary">
        <table cellspacing="0">
            <tr>
                <th></th>
                <th>Avg<br>$/Mth</th>
                <th>Total<br>$ Profit</th>
                <th>Avg<br>%/Mth</th>
                <th>Total<br>% Profit</th>
            </tr>
            <tr>
                <th>Year</th>
                <td id="yAvgDPm"></td>
                <td id="yTotProfit"></td>
                <td id="yAvgPcPm"></td>
                <td id="yTotPcProfit"></td>
            </tr>
            <tr>
                <th>Overall</th>
                <td id="oAvgDPm"></td>
                <td id="oTotProfit"></td>
                <td id="oAvgPcPm"></td>
                <td id="oTotPcProfit"></td>
            </tr>
        </table>
    </div>
    <div id="yrGraph"></div>
    <div id="yrRes"></div>
</div>

真的吗?没有人对此有任何其他想法?我真的需要你们帮我解决这个问题!

导航按钮的代码:

function nav(d) {
n = page + d;
$('#slide').load('p/'+n+'.php');

}

HTML:

<div class="prev" onClick="nav(-1)" title="Previous Page">&lt;&lt; Previous</div>
<div class="next" onClick="nav(1)" title="Next Page">Next &gt;&gt;</div>

编辑

所以我已经尝试了所有 3 个(当前)答案,但一无所获!这非常令人沮丧!

我开始认为可能存在一些潜在问题,并且绑定不是完整的问题。

该页面显然需要像浏览器刷新一样加载。页面在第一次加载时运行良好,无论它是如何加载的,这一事实告诉我绑定都很好。

该页面在没有弹出窗口的情况下也可以正常工作。

除了绑定之外,还有什么想法可以解决潜在的问题吗?

另外,我知道我发布指向相关网页的链接是违反 SO 规则的,但如果有人想要一个链接,我非常绝望地私下提供它。请问。

编辑

所以,我在想,隐藏的 div(用于弹出窗口)即使在我使用以下脚本后仍保持填充状态:

$('#etfProductPopup').bPopup({
        onClose : function() {
            postLoadBindings();
            $('#ayAvgDPm').html("");
            $('#aoAvgDPm').html("");
            $('#ayTotProfit').html("");
            $('#aoTotProfit').html("");
            $('#ayAvgPcPm').html("");
            $('#aoAvgPcPm').html("");
            $('#ayTotPcProfit').html("");
            $('#aoTotPcProfit').html("");
            $('#ayrRes').html("");
        }
    });

我认为问题可能与弹出脚本有关...

https://raw.githubusercontent.com/dinbror/bpopup/master/jquery.bpopup.min.js

编辑

还刚刚注意到弹出 div 在页面加载时被复制。从控制台:

<div id="etfProductPopup" style="display: none; left: 440px; position: absolute; top: 156px; z-index: 2147483650; opacity: 0;">...</div>

<div id="etfProductPopup" style="display: none; left: 440px; position: absolute; top: 156px; z-index: 2147483650; opacity: 0;">...</div>

编辑

(是的,我意识到如果有“最多编辑自己的问题”的徽章,那么我会赢,但我认为我提供的数据越多,回复的机会就越大)

#resTable在另一个页面上创建了一个元素(加载方式与上一个相同)。我注意到,即使$('#resTable').unbind()在文档就绪处理程序中使用,单击元素也会弹出上一页的弹出窗口!

当弹出窗口的脚本甚至不存在于该页面上时,这怎么可能,更不用说内容了?

有人,请!对此必须有一个合理的解释!我不是想给人类编程,这是一个计算机代码,这是一组数据,不能简单地随着它的进行而编造!

有人可以帮我吗?

到此为止: Popup 正在外部页面(带有导航按钮的页面)内创建重复的 div。我猜它这样做是为了让它在整个页面上正确分层,而不仅仅是包含 div 原始代码的页面。

编辑

更深入地了解正在发生的事情。弹出窗口的 div 显然在页面内,而不是容器内。bPopup 将 div 移动到<body>包含页面的标签内。这意味着 div 在 bPopup 调用后导航到的所有页面上都可用。关闭弹出窗口不会将 div 向后移动,因此当使用导航按钮重新加载页面时,会复制 div。

最新进展

不幸的是,在与客户交谈后,我无法发布实时链接。创建 jsFiddle 需要很长时间。

正如上面的编辑所解释的,问题是 bPopup 在父页面内重新创建弹出 div,而不是在弹出关闭时将其删除。

我不确定是否有办法删除页面上的元素?问题是,如果可以删除元素,bpopup 创建的副本与原始元素完全相同,因此任何针对副本的脚本也将针对原始元素

4

4 回答 4

1

我没有对此进行任何尝试,但是您是否尝试过将弹出按钮的事件绑定放在 ajax 请求的“完整”处理程序上?确保绑定到单个元素似乎是一种更安全的方法:

var req = $.ajax({
    url : '../includes/prod_results.php',
    type : 'POST',
    dataType : "json",
    data : {
        y : yr,
        t : 'ETF'
    },
    success : function(j) {
        var table = "<table cellspacing='0'><tr><th>Year</th><th>Returns</th></tr>";
        for(var i = 0; i < 12; i++) {
            if (i === 5 && yr === '2014'){
                break;
            }
            var obj = j[i];
            var month = obj['month'];
            var profit = obj['profit'];
            var bal = obj['bal'];
            table += "<tr><td style='width:75px'>"+month+"</td><td style='padding: 0 15px'>"+parseFloat(profit).toFixed(2)+"%</td><td style='width:75px'>$"+comma(parseFloat(bal).toFixed(2))+"</td></tr>";
            if (i === (11)) {
                table += "</table>";
            }
        }
        var YAvgDPm = comma(parseFloat(j.YAvgDPm).toFixed(2));
        var OAvgDPm = comma(parseFloat(j.OAvgDPm).toFixed(2));
        var YTotProfit = comma(parseFloat(j.YTotProfit).toFixed(2));
        var OTotProfit = comma(parseFloat(j.OTotProfit).toFixed(2));
        var YAvgPcPm = comma(parseFloat(j.YAvgPcPm).toFixed(2));
        var OAvgPcPm = comma(parseFloat(j.OAvgPcPm).toFixed(2));
        var YTotPcProfit = comma(parseFloat(j.YTotPcProfit).toFixed(2));
        var OTotPcProfit = comma(parseFloat(j.OTotPcProfit).toFixed(2));

        $('#yAvgDPm').html("$"+YAvgDPm);
        $('#oAvgDPm').html("$"+OAvgDPm);
        $('#yTotProfit').html("$"+YTotProfit);
        $('#oTotProfit').html("$"+OTotProfit);
        $('#yAvgPcPm').html(YAvgPcPm+"%");
        $('#oAvgPcPm').html(OAvgPcPm+"%");
        $('#yTotPcProfit').html(YTotPcProfit+"%");
        $('#oTotPcProfit').html(OTotPcProfit+"%");
        $('#yrRes').html(table);
        $('#yrGraph').html("<img src='../images/graphs/etf_"+yr+".jpg'>");
        return false;
    }, 
    complete:function(){
        //put the bindings to popup here
    }
});
于 2014-07-08T09:10:45.387 回答
1

@Sudhir 提到的事件委托应该有效,但是,如果您遇到问题,您可能想尝试在每次页面加载时强制绑定新事件。就像是 -

Prev在具有和Next按钮的主页中,定义所有功能 -

var bindEvents = function(){
    //we are unbinding to make 
    //sure we are not attaching more than once since
    //instead of on, I am using direct CLICK binding.
    $('#resTable').unbind("click").click(function() { 
        ....
    });

    $('div[class^="sideNav"]').unbind("click").click(function() {
        ....
    });
};

var nav = function(d) {
    n = page + d;
    $('#slide').empty();
    $('#slide').load('p/'+n+'.php', function(){
         //bind events
         bindEvents();
    });
}

$(function(){
    //the first page call, when page loads
    nav(0);
});

请记住,这不是最好的方法,但这将确保其他事情正常。如果此绑定有效,那么我们可以隔离问题并确认您使用绑定的方式存在问题。让我知道它是否仍然不起作用。

于 2014-07-02T04:51:42.523 回答
1

改变:

$('#resTable').on('click',this,function() {
...

$(document).on('click','#resTable',function() {
...

$('div[class^="sideNav"]').on('click',this,function() {
...

$(document).on('click','div[class^="sideNav"]',function() {
...
于 2014-06-30T04:05:37.383 回答
0

尝试这个

$("body").delegate('#resTable','click',function() {
    //some codes
}


$("body").delegate('div[class^="sideNav"]','click',function() {
    //some codes
}
于 2014-07-09T02:59:12.513 回答