【问题标题】:jQuery .getJSON function needs to rebind returned datajQuery .getJSON 函数需要重新绑定返回的数据
【发布时间】:2009-04-21 18:47:24
【问题描述】:

我无法让我的模式窗口函数绑定到一些返回的数据。我正在使用 Cody Lindy 的 http://swip.codylindley.com/DOMWindowDemo.html">Jquery.DomWindow 插件。请注意,除此问题外,一切正常。

当我的 jQuery.getJSON 调用返回的数据包含一个应该打开模式窗口的链接时,就会出现问题。但是,该链接不被 DOM 识别,因此不受任何函数的约束。

我的 jQuery 函数是:

$(".deleteThis").live("click", function(){
    var $this = $(this);

    $.getJSON(this.href, function(data) {
        if( data.success == '1') {
        $this.parent().html('<span style="background:#f1ffd6;padding:5px;">' +data.msg+'</span>');         
        } 
        else if( data.success == '2') {
        $this.parent().html('<span style="background:#f1ffd6;padding:5px;">' +data.msg+'</span>');         
        }      
        else {alert("Failure (most likely our fault).");}
    });

    return false;
});

jQuery 发送到的 php 脚本包含一些数据库脚本(下面没有显示,因为它不相关)。返回 JSON 数组的相关 php 代码是这样的:

if($del ==1 ){
    $msg= "$name has been deleted. (<a href='media/delete_coll.php?cid=$cid&delete=0' class='deleteThis' >undo</a>)";
    print json_encode(array("success" => 1,"msg" => $msg));
}

if($del ==0 ){ 
    $msg= "$name <a href='media/editCollab.php?coll=$coll_id' class='absoluteIframeDOMWindow'>edit</a> 
     <a href='media/delete_coll.php?cid=$coll_id&delete=1&coll=$coll' class='deleteThis' > delete</a> | 
     Collaborator has restored.";
     print json_encode(array("success" => 2, "msg" => $msg));
}

【问题讨论】:

    标签: php javascript jquery


    【解决方案1】:

    这是因为插件在页面加载时绑定了事件处理程序,然后您在事后向页面添加动态内容。最简单的解决方案是将您必须将 DomWindow 插件实例化的任何代码移动到一个函数中,并在页面加载时调用它一次,并在添加新链接时再次调用它。如果它开始对已经存在的链接进行双重绑定,那么您必须给动态链接一个不同的类,并为该类第二次实例化。

    编辑

    这里似乎有些误解,所以我再解释一下:

    jQuery live 功能(您用于.deleteThis)旨在解决您遇到的问题。您可能已经知道这一点,因此您正在使用它。上一段是因为我相信您所说的是您返回的 DomWindow edit 链接没有像您预期的那样打开 DomWindow。这是因为 DomWindow 在内部不使用live 来绑定事件。因此,当您最初在页面加载时启用 DomWindow 时,链接会被绑定,但新链接不会。如果您愿意编辑插件的源代码,您可以通过简单地使用live 来直接解决这个问题,但是将代码移动到一个函数并在任何时候调用它更容易(虽然不是“干净”) '正在向页面添加更多内容。

    【讨论】:

    • .live 事件(superUntitled 正在使用)应该处理任何当前和未来称为“.deleteThis”的元素。
    • 他的问题不在于 .deleteThis,他的问题在于 class='absoluteIframeDOMWindow' 的编辑链接 - 我假设他放弃了调用 DomWindow 插件以创建所有链接的部分class do X,但这就是他的问题所在。
    • 我创建了一个新函数和一个新类,它可以工作。我知道我将来会遇到这个问题,因为当有多个“编辑|删除”链接的实例和潜在的多个“撤消”链接时,我将不可避免地遇到“双重绑定”(在模态窗口将被调用两次,因此显示两次)。
    • 您可以做的是将参数传递给要绑定的类的函数。默认情况下,您可以使用 absoluteIframeDOMWindow,但您可以添加类似当前 php time(); 的内容。并将其添加为一个类。然后,您使用从 php 传递的时间作为类选择器调用绑定函数,瞧,只有正确的东西被绑定。那时您可能要考虑编辑源代码,但它肯定会起作用。 :)
    • 另外,我不确定 DomWindow 是否是,但是一些做类似事情的插件会考虑到这一点并且不会双重绑定,所以你可能会摆脱困境。我确信如果您多次调用,Thickbox (jquery.com/demo/thickbox) 不会双重绑定。
    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 2011-02-18
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    相关资源
    最近更新 更多