【问题标题】:jQuery tooltip position after an ajax requestajax请求后的jQuery工具提示位置
【发布时间】:2014-05-13 16:40:14
【问题描述】:

这个问题有很多内容,所以我会尽量保持简单。基本上我在表格中的 td 列上有一个 jQuery 工具提示。我做了一个 ajax 请求来提取一些数据并显示它......我在等待回调完成时显示一个加载 gif。一旦完成,内容将替换为返回的内容......我将在几秒钟内显示一些代码以帮助澄清。我使用 javascript 返回一个 HTML 表格。该表可以有 1、2 或 3 行,具体取决于从 ajax 请求返回的内容。 所有这些都很好。

我遇到的问题是,一旦将 gif 替换为表格,它的大小就会变大,这会导致间距出现问题。我录制了一段视频让你看看会发生什么......当我第二次将鼠标悬停在 td 上时,工具提示正确显示(在 td 上方)而不是覆盖它。它这样做是因为它偏离了最高位置(内置 jQuery 方法来设置偏移量)。 THIS VIDEO

对此的任何帮助将不胜感激!


Java 脚本部分的 HTML

var setWhateverData = function(sent){
    if(sent){
        var $finishThisShitStr ="";
            if(thingy['type'] =="whatever"){
                var $whateverStr = '<table>' +
                    '<tr>' +
                        '<td><div><img src="my-logo.png"></div></td>' +
                        '<td>' + thingy.whatever + '</td>' +
                    '</tr>' +
                '</table> ';
            }
            else if (thingy['type'] == "maybe") {
                var $maybeStr = '<table>' +
                    '<tr>' +
                        '<td><div><img src="my-logo.png"></div></td>' +
                        '<td>' + thingy.maybe + '</td>' +
                    '</tr>' +
                '</table> ';

            }
            else if (thingy['type'] == "haha"){
                var $hahaStr = '<table>' +
                    '<tr>' +
                        '<td><div><img src="my-logo.png"></div></td>' +
                        '<td>' + thingy.haha + '</td>' +
                    '</tr>' +
                '</table> ';
            }
            else{
                $finishThisShitStr = '<span>YOU DUN GOOFED</span>'
            }
        };
        if($whateverStr){   // add strings of html to final string to return
            $finishThisShitStr = $finishThisShitStr + $whateverStr;
        }
        if($maybeStr){
            $finishThisShitStr = $finishThisShitStr + $maybeStr;
        }
        if($hahaStr){
            $finishThisShitStr = $finishThisShitStr + $hahaStr;
        }
        return $finishThisShitStr;
    }
}

JQUERY 工具提示部分

$('td').tooltip({ 
    items: "[data-whatever]",
    content: function(){
        var el = $(this),
            content = el.data('ajax-stuff');
        if(content)
            return content;    
        return '<img src=mySpinnerGif.gif>';
    },
    open: function(){
        var elem = $(this),
            info = elem.data('ajax-stuff');
        if (info) {
          elem.tooltip('option', 'content', info);
        } else {
          var id = elem.data('whatever');
            $.ajax('/echo/html/' + id).always(function(result)  {
                var $data = setWhateverData(result)
                elem.tooltip('option', 'content', $data);
                elem.data('ajax-stuff', $data);
            });
        }
    }
});

如您所见,我调用该函数来设置数据并将返回的内容传递给它...我只是不太熟悉工具提示以及如何检查返回的内容..

附加说明:

我是否应该像这样在 javascript 中返回 html(我通常不喜欢,但没有看到其他选项)?

有没有办法让它锚定在工具提示的底部而不是顶部?

编辑: 这是一个重复类似案例的jsfiddle。问题是当数据更新时它不会重新定位自身 - 而是离开位置的顶部。所以我需要喜欢回忆位置功能或类似的东西。 http://jsfiddle.net/gF3sG/2/

已解决供他人使用----最终解决方案:

$('td').tooltip({ 
    items: "[data-whatever]",
    content: function(){
        var el = $(this),
            content = el.data('ajax-stuff');
        if(content)
            return content;    
        return '<img src=mySpinnerGif.gif>';
    },
    open: function(){
        var elem = $(this),
            info = elem.data('ajax-stuff');
        if (info) {
          elem.tooltip('option', 'content', info);
        } else {
          var id = elem.data('whatever');
            $.ajax('/echo/html/' + id).always(function(result)  {
                var $data = setWhateverData(result)
                elem.data('ajax-stuff', $data);
                elem.tooltip("close");
                elem.tooltip("open");
            });
        }
    }
});

【问题讨论】:

  • 您始终可以动态添加 html,即var txt = "&lt;p&gt;InnerHTML&lt;/p&gt;"==var txt = $("&lt;p&gt;&lt;/p&gt;").text("InnerHTML")==var txt = document.createElement("p"); txt.innerHTML="InnerHTML"。另外,你有没有试过在内容返回后销毁tooltip,设置内容,然后再次调用open
  • @ElliotM 我该怎么做?我尝试破坏并打开但无法让它工作..只是在实例化之前尝试调用它的错误。
  • 如果你制作一个 jsfiddle 来模拟这种情况会非常有帮助。
  • @ElliotM 好的,我刚刚添加了一个复制问题的小提琴。它不是 ajax 调用,但想法是一样的。
  • 您似乎已经提交了一个错误:bugs.jqueryui.com/ticket/9018

标签: jquery css-position offset jquery-tooltip jquery-ui-tooltip


【解决方案1】:

我能够通过首先关闭工具提示,重新添加定位和内容,然后打开它来完成所描述的内容。这似乎相当多余,但它确实有效。

$("#trigger").tooltip({
position: {
    my: "center bottom-20", // the "anchor point" in the tooltip element
    at: "center top" // the position of that anchor point relative to selected element
},
items: '#trigger',
content: function(response) {

    setTimeout( function() {

      doIt();

    }, 1500);
    return 'Testing.<br>testing<br>testing<br>testing<br>testing<br>';
}
});

function doIt(){

$("#trigger").tooltip("close");

 var html = '';
for ( var i = 0; i < 10; i++ ){
     html += 'Hello ' + i + '<br />';
}

$("#trigger").tooltip({
position: {
    my: "center bottom-20", // the "anchor point" in the tooltip element
    at: "center top" // the position of that anchor point relative to selected element
},
items: '#trigger',
content: html
});

$("#trigger").tooltip("open");
}

http://jsfiddle.net/fenderistic/W6x83/

【讨论】:

  • 太棒了!我必须做一些改变才能让它和我的一起工作。但逻辑是我感到困惑的。不过有一点有点奇怪,它会将其刷新到正确的位置,然后再次重新加载。函数调用 doIt() 在 ajax 回调中。原因是因为那是在一个 open: 函数中,在您重新打开工具提示(它又再次调用 doIt() 函数)后会调用它的想法?
  • 基本上 doIt() 函数会被调用两次,因为它在 open: function().. 并且每次工具提示被实例化时都会调用 open 函数。这是一个复制它的小提琴。 jsfiddle.net/W6x83/19
  • Nvm 我解决了。我必须在 doIt 函数中设置我的检查器...基本上我设置data('ajax-stuff') 的位置是我检查它之前是否被实例化的方式。所以我必须在 doIt 函数中设置它,而不是在调用函数之后立即设置。再次感谢您的帮助!!我会给你一些额外的 +1 :)
  • 如果你想看看我做了什么,我用最终解决方案编辑了我的答案,所以其他人可以复制这个:)再次感谢!
【解决方案2】:

在您的 ajax 方法或 setTimeout 中,您可以使用 widget 函数获取对工具提示的引用。一旦你有了对“加载”工具提示的引用,你就可以在设置 ajax 数据之前关闭它。设置新数据后,工具提示将使用新高度重新打开。

$('#trigger').tooltip();
//Get refrence to the tooltip widget
var w = $('#trigger').tooltip('widget');
w.tooltip('close');

分叉小提琴:http://jsfiddle.net/smurphy/wqH22/2/

【讨论】:

  • 所以这不是我想要的,因为它会将工具提示刷新到 div 的底部,而不是锚定顶部以保持它在那里
  • 它在底部刷新,因为顶部没有足够的空间......我在测试我的实现时遇到了同样的问题。只需添加更多 &lt;br&gt;s 即可。
  • 添加 br 的内容对他仍然无效。我在你的回答 ElliotM 上用小提琴编辑了我的评论
  • 它使用工具提示逻辑重新渲染工具提示。如果顶部有空间,它会在那里渲染,如果底部有空间,它会在那里渲染。您可以将碰撞逻辑设置为适合,这将迫使它保持在您指定的位置。它默认翻转。 jsfiddle.net/smurphy/wqH22/3
  • 我不知道有碰撞选项。我刚刚找到了来源以查看更多选项。非常好。我不再需要执行 doIt() 函数了,我只测试了关闭然后打开它就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 2013-09-30
相关资源
最近更新 更多