对内联块元素使用 jQuery remove() 时遇到问题

Posted

技术标签:

【中文标题】对内联块元素使用 jQuery remove() 时遇到问题【英文标题】:Trouble with using jQuery remove() on elements that are inline-block 【发布时间】:2011-01-15 18:36:25 【问题描述】:

我有一条水平线 div 元素,它们是 display:inline-block 并且顶部对齐。

我可以添加元素,并且行会扩展。当我通过将宽度设置为 0 来移除元素时,该线不会保留其单线外观,而是会强制在动画期间临时出现第二条线。

在 IE、Webkit 和 Firefox 中的行为是相同的。

我可以改变界面来避免这个问题,但我仍然想知道是什么原因造成的,以及如果可能的话如何修复它。

这是一个按比例缩小的问题示例。

body 
    text-align: center;

#container 
    height: 20px;
    border: 1px dashed #AAA;
    background: #EEE;
    margin: 0 auto;
    display:table !important;
    display: -moz-inline-stack;  /* Pre FF3 fix */
    display: inline-block;
    zoom: 1;                    /* IE fix */
    *display: inline;           /* IE fix */

.item 
    cursor: pointer;
    width: 50px;
    height: 18px;
    border: 1px solid purple;
    vertical-align: top;
    display: inline-block;
    color: white;
    vertical-align: top;
    display: -moz-inline-stack;  /* Pre FF3 fix */
    display: inline-block;
    zoom: 1;                    /* IE fix */
    *display: inline;           /* IE fix */

.outer 
    background: orange;



$('#add').click(function() 
    $(this).before('<div class="item"></div>')
);

$('#add').click().click().click()

$('.item:not(.outer)').live('click', function()  
    $(this).animate(width: 1, paddingLeft: 0, 1000, function() $(this).remove()); 
);

<div id="container"><div class='item outer'></div><div id="add" class="item outer">Add</div></div>

【问题讨论】:

【参考方案1】:

好吧,如果有人感兴趣,这是我的解决方案。

我最后只是稍微修改了 jQuery 的源代码,它似乎运行良好。然后我通过必要的调整将更改滑入缩小版本。

这是我所做的(对于非缩小版):

在 jQuery 的 animate: 函数中,在检查“高度”和“宽度”的 if() 语句中,我添加了以下内容:

// Detect inline-block standard, pre ie8 fix, and pre Firefox 3 fix
opt.ibCheck =(jQuery.css(this,'display') === 'inline-block') || 
            (jQuery.css(this,'zoom') !== 'normal' && jQuery.css(this,'display') === 'inline') || 
            (jQuery.css(this,'display') === '-moz-inline-stack');

然后在jQuery.fx.prototype.update: 中,在检查“height”、“width”和“this.element.style”的if() 语句中,我将if() 语句更改为以下内容:

if ( ( this.prop === "height" || this.prop === "width" ) && this.elem.style && !this.options.ibCheck ) 

...检查在“animate”中设置的 ibCheck 属性。

一切似乎都运行良好。它检查 inline-block、常见的 pre-Firefox 3 修复或 pre-ie8 修复。如果找到,它将 ibCheck 设置为“真”。如果 ibCheck 为“真”,update() 函数不会将显示更改为“阻止”。

对 IE 可能有更好的检查。我想如果有人为“内联”元素设置动画,将“缩放”设置为“正常”以外的任何内容,可能会导致问题?至于我,直到昨天我才知道 IE 甚至接受了“缩放”属性!

【讨论】:

是的!感谢您的解决方案。此页面forum.jquery.com/topic/… 上有类似的解决方案,但我更喜欢您的解决方案,因为它缓存了测试结果。顺便说一句,我希望这在 jQuery 中得到修复,这样我们就不必部署被黑的版本。 :) @harpo - 不客气。也许值得一票? ;o) 我还没有解决这个问题,但是您可以将修改后的方法放在一个单独的文件中,以便覆盖 jQuery。然后你仍然可以使用 jQuery 的 CDN 版本。 好的,谢谢。您还回答了我的下一个问题,关于分离模组以使用 CDN。我现在正在尝试。 @harpo - 谢谢!让我知道结果如何。【参考方案2】:

也许这与jquery在为其宽度设置动画时必须将其转换为块元素的事实有关? This other question 可能会有所启发

【讨论】:

我确实看过那个,并假设 jQuery 可能正在更改“显示”属性。只是不确定为什么在内联块的情况下需要更改它。是否可以避免/覆盖该行为? 我发现浏览器支持存在问题,他们试图使动画尽可能交叉,而一些较旧的代理不支持它。也许链接中带有额外 html 的解决方案会以最小的附带损害来做到这一点? 感谢您的帮助。我决定稍微修改一下 jQuery,它运行良好。如果您有兴趣,我已经发布了我的解决方案。 再次感谢。

以上是关于对内联块元素使用 jQuery remove() 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

$("元素").remove();在 iframe 中使用 jquery [重复]

jquery之remove(),detach()方法详解

jquery 动态添加的元素 怎么删除元素

jquery的引入入口函数选择器对内容的操作对元素的操作属性操作

jQuery 删除元素remove()和empty() 用法

jQuery 删除复制和替换元素