我有以下技巧,将Ajax调用悬停在哪里并获取数据,创建内容并显示在屏幕上。但这不适用于动态内容,因为在页面上加载
<span class="more-tags otherPostTags" data-postId="{{$post->id}}">...</span>
在页面上变为静态,但在选项卡中也变为动态。

,因此以下代码适用于静态
<span class="more-tags otherPostTags" data-postId="{{$post->id}}">...</span>
,但不适用于动态。

<div id="template" style="display: none;">
    Loading a new image...
</div>

<span class="more-tags otherPostTags" data-postId="{{$post->id}}">...</span>

Tippy jquery:
const template = document.querySelector('#template');
const initialText = template.textContent;

const tip = tippy('.otherPostTags', {
    animation: 'shift-toward',
    arrow: true,
    html: '#template',
    onShow() {
        const content = this.querySelector('.tippy-content')
        if (tip.loading || content.innerHTML !== initialText) return
        tip.loading = true
        node = document.querySelectorAll('[data-tippy]');
        let id = node[0].dataset.postid;
        $.ajax({
            url: '/get/post/'+id+'/tags',
            type: 'GET',
            success: function(res){
                let preparedMarkup = '';
                res.tags.map(function(item) {
                    preparedMarkup +=
                        '<span class="orange-tag" style="background-color: '+item.color+'">'+
                            item.name +
                        '</span>';
                });
                content.innerHTML = preparedMarkup;
                tip.loading = false
            },
            error: function(error) {
                console.log(error);
                content.innerHTML = 'Loading failed';
                tip.loading = false
            },
        });
    },
    onHidden() {
        const content = this.querySelector('.tippy-content');
        content.innerHTML = initialText;

    },
    popperOptions: {
        modifiers: {
            preventOverflow: {
                enabled: false
            },
            hide: {
                enabled: false
            }
        }
    }
});

我在这里想念什么?

最佳答案

如果希望Tippy在新元素上激活,则需要使用事件委托(delegate)。 Tippy documentation对此进行了介绍(令人沮丧的是,没有 anchor 定链接到该链接;搜索“事件委托(delegate)”)。您使用父容器元素,然后告诉Tippy使用什么选择器来匹配子元素。文档中的示例为:

tippy('#parent', {
  target: '.child'
})

...因此,在您的示例中,使用所有.otherPostTags元素都位于的容器(在最坏的情况下为document.body),并使用.otherPostTags作为target:
tippy('selectorForParentElement', {
  target: '.otherPostTags'
});

现场示例:

tippy('#container', {
  target: '.otherPostTags'
});
var counter = 0;
var timer = setInterval(function() {
  ++counter;
  var tag = document.createElement("span");
  tag.title = "Tip for span #" + counter;
  tag.className = "otherPostTags";
  tag.innerHTML = "Span #" + counter;
  document.getElementById("container").appendChild(tag);
  if (counter === 6) {
    clearInterval(timer);
  }
}, 250);
.otherPostTags {
  color: white;
  background-color: #2020FF;
  border: 1px solid black;
  padding: 2px;
  margin-left: 2px;
  margin-right: 2px;
  border-radius: 4px;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/tippy.js/2.5.4/tippy.css" rel="stylesheet"/>

<div id="container"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/tippy.js/2.5.4/tippy.min.js"></script>

关于javascript - Javascript : Tippy. js无法用于动态内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52381990/

10-11 23:59