【问题标题】:jquery delegate attribute changesjQuery委托属性更改
【发布时间】:2015-06-11 16:44:55
【问题描述】:

在我的页面中,我根据另一个属性更改元素的一个属性。像这样:

$("body").find("[data-action=new]").attr("data-original-title", "Create appointment");

这样做,此元素将显示带有“创建约会”文本的工具提示。

像这样我还有其他的。

当我通过 JS 在我的 DOM 中插入一些元素时,问题就开始了。

有什么方法可以委托这个操作来避免每次插入一个元素时调用它?

更新

我正在寻找一个简单的解决方案来设置我的工具提示。 DOMObserver 看起来太重了,不适合在这里使用。还是不行?

【问题讨论】:

  • 我唯一能想到的就是设置一个MutationObserver 并让它处理属性的插入,或者创建一个自定义事件并在插入时触发它。不知道其中任何一个是否更好。
  • 有趣的相关帖子herehere。可能会提供一些有用的想法。
  • @Scott'scm6079' 它也指普通的javascript方法,而不仅仅是jquery ..该帖子上有很多答案..
  • 我再次浏览了帖子,我仍然认为该帖子根本没有回答这个问题——我花时间写了一个可以满足需求的解决方案。

标签: javascript jquery


【解决方案1】:

突变观察者似乎合适,监控 addedNodes 属性:

var targetNodes         = $("body"); // best to make this more specific, e.g. .myNodes
var MutationObserver    = window.MutationObserver || window.WebKitMutationObserver;
var myObserver          = new MutationObserver (mutationHandler);
var obsConfig           = { childList: true, characterData: true, attributes: true, subtree: true };

targetNodes.each ( function () {
    myObserver.observe (this, obsConfig);
} );

function mutationHandler (mutationRecords) {
    mutationRecords.forEach ( function (mutation) {
        if (typeof mutation.addedNodes == "object") {
            var jq = $(mutation.addedNodes);
            jq.find("[data-action=new]").attr("data-original-title", "Create appointment");
        }
    } );
}

【讨论】:

  • 是的,但我希望您需要一个备用IE < 11
  • @dave 好点 - 此解决方案适用于 Chrome、Safari、IE11+。 caniuse.com/#feat=mutationobserver
  • 这不会导致循环,因为它会再次更改 DOM 吗?
  • 在这种情况下,它们不会被添加节点 - 所以应该没问题。然而,对于将这篇文章用于相关项目的人来说,这是一个很好的观点。将更改放在内部查找的选择器中很容易排除更改。
猜你喜欢
  • 2017-07-07
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
相关资源
最近更新 更多