javascript - colorbox(使用 live)在 ​​jQuery ajax 调用后没有重新绑定(bind)

标签 javascript jquery ajax colorbox yii

我有一个通过 ajax(使用 jQuery 的 .load())加载的元素列表。这些元素中的每一个旁边都有一个(编辑)链接,灯箱(使用颜色框)有点编辑形式。当灯箱关闭时,我使用 onClosed 回调重新加载 ajax 列表以显示和编辑期间所做的更改。

colorbox 调用看起来像这样:

$('.colorbox').colorbox({
  'iframe':true,
  'onClosed':function(){
    $("#featureList").load("/template/featureList","id="+$("#model_id").val());
  }
});

我的列表是这样的:

<div id="featureList">
  <ul id="features">
    <li id="item_000000000008+0">Element 1 (<a class="colorbox" href="/template/featureLightbox?template_id=000000000008&amp;delta=0">Edit</a>)</li>
    <li id="item_000000000008+1">Element 2 (<a class="colorbox" href="/template/featureLightbox?template_id=000000000008&amp;delta=1">Edit</a>)</li>
  </ul>
</div>

我查看了 colorbox source code并看到它使用 jquery live() 进行绑定(bind)。在这里:

$('.' + boxElement).live('click', function (e) {
  if ((e.button !== 0 && typeof e.button !== 'undefined') || e.ctrlKey || e.shiftKey || e.altKey) {
    return true;
  } else {
    launch(this);   
    return false;
  }
});

您可以在上面看到 colorbox 的工作方式是绑定(bind)到“boxElement”,这是它创建的一个名为“cboxElement”的类。在 live() 绑定(bind) colorbox 之前,将此类 (cboxElement) 添加到与选择器匹配的所有元素(在我的示例中为 .colorbox),然后绑定(bind)到这个新类。

所以认为如果我将 colorbox 绑定(bind)放在 ajax 内容之外,它会在我用 ajax 替换 #featureList div 后绑定(bind)到链接,因为 live() 应该“现在或将来”绑定(bind)到元素.但这不是因为它绑定(bind)到 .cboxElement 而不是 .colorbox 所以当 ajax 重新加载 colorbox 时不会将 .cboxElement 类重新添加到元素。

我尝试在 ajax 内容中调用 $.fn.colorbox.init() 来让 colorbox 将 .cboxElement 类重新添加到元素中,但这没有效果。 (我在处理 shadowbox 时做了类似的事情,但它似乎对 colorbox 不起作用。)

然后我尝试将所有颜色框代码放在 ajax 内容中。当我这样做时,颜色框绑定(bind)正在堆叠/链接。所以我第二次调用它时,我得到了两个颜色框(并且必须点击“关闭”按钮两次才能返回主屏幕)。第三次我得到三个。这是因为当我再次调用 colorbox 时,它添加了 .cboxElement 类,使旧的 live() 绑定(bind)再次激活,并且它还添加了另一个 live() 绑定(bind)。我试图通过先调用 .die() 来清除 .live() 绑定(bind),但由于某种原因它不起作用。

我找到了几个相关的帖子,但没有一个解决了这个问题,因为 colorbox 已经在使用 live():
Problem with jQuery Colorbox
jQuery AJAX table to a page but now the colorbox overlays no longer work

还有其他想法吗?我真的很难过。我觉得我应该换一个不同的灯箱,但总的来说我喜欢 colorbox 并且在出现这个 ajax 问题之前它在网站的其他任何地方都运行良好。

谢谢!!!

编辑:

因此,在这种情况中,我的问题是我的框架 ( Yii ) 在每个 AJAX 调用中包含重复的 colorbox 脚本,这导致了问题。所以要小心!

对于没有遇到重复脚本问题的每个人来说: @Relic 在下面指出你可以通过自己做来“回避”一些问题 jQuery delegate() bind 对 colorbox 进行“直接调用”,而不是依赖于 colorbox 的默认 live() 绑定(bind)。对于我的情况,我会像这样调整它:

$(document).delegate("#features a", "click", function (event) { // $.colorbox() call  }

最佳答案

首先,您不应该使用 .live(),它已被弃用。相反,学习如何使用 .delegate() 您会发现这是一个更强大的监听器,将有助于解决您的问题。

最初加载页面时,DOM 已准备就绪,并且颜色框已为选择器初始化 AJAX 使用颜色框选择器列表中的一些 DOM 元素调用页面的新部分,但未被注意到,因为它是在 javascript 读取选择器后加载到页面中的。

尝试以下操作 - 因为它会监视 body #main 中所有现有的和新的 a[rel='lightbox']:

$("body #main").delegate("a[rel='lightbox']", "click", function (event) {
                    event.preventDefault();
                    $.colorbox({href: $(this).attr("href"),
                            transition: "fade",
                            innerHeight: '515px',
                            innerWidth: '579px',
                            overlayClose: true,
                            iframe: true,
                            opacity: 0.3});});

编辑“.on()”

$("body #main").on("click", "a[rel='lightbox']", function (event) {
                        event.preventDefault();
                        $.colorbox({href: $(this).attr("href"),
                                transition: "fade",
                                innerHeight: '515px',
                                innerWidth: '579px',
                                overlayClose: true,
                                iframe: true,
                                opacity: 0.3
                         });
});

是的,很大的变化,我知道,但重点是“on”方法也可以用作“bind”,所以这很酷。

关于javascript - colorbox(使用 live)在 ​​jQuery ajax 调用后没有重新绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3542549/

相关文章:

javascript - 动态设置类型颜色时 Ng-repeat 生成错误

javascript - 如何通过分页更改 Bootstrap 选项卡

javascript - 一次只显示三个 Div

javascript - JQuery 文件输入验证和隐藏 div

javascript - 按多列对 Slickgrid 进行排序?

javascript - 第三部分不在屏幕上

jquery - 当多个图像映射位于同一页面上时,如何使用 jQuery 定位单个图像映射区域

javascript - Ajax 成功后,重新加载部分页面,而不是整个页面。拉维尔

jquery - 什么是好的 jQuery/Ajax 灯箱插件?

php - 保存数据而不重新加载页面