【问题标题】:Dynamic jQuery dialog after data append w/o reloading page. Possible?数据附加后没有重新加载页面的动态 jQuery 对话框。可能的?
【发布时间】:2010-06-08 21:31:07
【问题描述】:

所以我在某种 CRUD 界面中有一个包含巨大表格的页面。跨度中的每个链接都调用一个 jQuery UI 对话框表单,该表单从另一个页面获取它的内容。当发生的动作(在本例中为创建)完成时,它会将生成的新数据附加到表中并强制使用表。这一切都发生在 JS 和 DOM 中。

问题在于,新表格行的 CRUD 链接实际上并没有触发对话表单的创建,因为跨度中的所有原始链接仅在 document.ready 上进行扫描,并且由于我没有重新加载页面,所以看不到新链接。

代码如下:

$(document).ready(function() {
    var $loading = $('<img src="/images/loading.gif" alt="Loading">');
    $('span a').each(function() {
        var $dialog = $('<div></div>')
            .append($loading.clone());

        var $link = $(this).one('click', function() {
            // Dialog Stuff
            success: function(data) {
                $('#studies tbody').append(
                    '<tr>' +
                        '<td><span><a href="./?action=update&study=' + data.study_id + '" title="Update Study">Update</a></span></td>' +
                    '</tr>'
                );
                fdTableSort.init(#studies); // This re-sorts the table.
                $(this).dialog('close');
            }
            $link.click(function() {
                $dialog.dialog('open');
                return false;
            });

            return false;
        });
    });
});

基本上,我的问题是,是否有任何方法可以触发 jQuery 重新评估页面链接而不强迫我刷新浏览器页面?

【问题讨论】:

    标签: jquery dialog append reload


    【解决方案1】:

    尝试通过jquery live函数绑定新创建的链接。

    【讨论】:

    • 这是关于 .each 还是原始基础问题?我尝试将 .live 添加到看起来最明智(根据文档也是合乎逻辑的)和 nada 的部分。如果您建议我替换 .each,我想我可以,但如果可以的话,我宁愿希望避免这种情况。谢谢。
    • 我会删除 each(或至少尝试删除),因为“span a”适用于您表中的任何 a,如果您需要,您可以将选择器更改为更合适的选择器。但我认为将每个选择器更改为其“实时”版本,即 $link.live('click', function() { ... }) 就可以了。还尝试将 $(this).one('click'... 更改为 live 或 bind。因为如文档中所述,处理程序将在第一次执行后解除绑定,这意味着它只会工作一次,但当然仅当那不是预期的行为时。
    • 这最终奏效了。必须对代码进行大量更改才能使其正常工作,但它的工作非常出色。谢谢!
    【解决方案2】:

    如果我理解正确,我认为您可以稍微更改代码以使其适合您:

    $(document).ready(function() {
      var $loading = $('<img src="/images/loading.gif" alt="Loading">');
      $('span a').click(function() { //changed here
        var $dialog = $('<div></div>')
            .append($loading.clone());
    
        //rest of your code  
    }
    

    }

    因此,通过这种方式,您的对话框是完全动态创建的,并在 span a 元素的单击事件上附加到您的 DOM。

    您问题的另一点是,如果对话框是浮动 div(很可能),则页面刷新可能会导致在提供页面后对话框不显示。所以你不想也负担不起页面刷新。

    【讨论】:

    • 改变是不行的。 .each 是必要的,因为该表包含相同类型(和其他类型)链接的行,并且没有 .each 的(循环?),只有第一个呈现的链接实际上适用于每种类型。关于浮动 div 对话框,它会在成功时关闭。我会将其添加到我的原始帖子中以供将来清楚起见。感谢您的尝试!
    猜你喜欢
    • 2014-01-06
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2014-03-07
    相关资源
    最近更新 更多