1

在更改包含文本后,我在获取标签大小时遇到​​问题。我目前有一个我很不满意的解决方案。这就是我所拥有的(为咖啡脚本道歉,()=> 表示函数(){})

@textField = $('<'+tag+'></'+tag+'>')
@textField.html(text).delay(120).queue(()=>
    @textField.ready(@onTextReady)
)

如果我删除延迟,就没有 height(),我也不能使用 window.load,@textfield.load 似乎什么也没做。

您对解决此问题的最佳实践有何看法?

非常感激

/ 一个

4

2 回答 2

0

据我所知,元素在添加到 DOM 之前没有大小。不仅如此,我认为尺寸和显示都没有问题。如果您只对大小感兴趣而不是实际将元素添加到 DOM,我建议您使用可见性。

var $textField = $('<div>').text("FOO").css({
    visibility: "hidden",
    position: "absolute",
    display: "block"
}).appendTo($("body"));
var height = $textField.height();
$textField.remove();
alert(height);
于 2013-02-19T10:09:49.617 回答
0

由于 JavaScript 的单线程特性以及浏览器如何完成 HTML 呈现。当你将元素添加到 DOM 树中时,这并不意味着渲染器已经绘制了元素或计算了元素的属性等。你应该将元素添加到 DOM 树中,然后从 JavaScript 线程中中断,并将访问队列中元素属性的代码,以便在渲染后执行。

element.appendChild(aChild); // Adding a child to the DOM tree    
setTimeout(function() {
    aChild.height;           // Accessing the height of the element
},0);                        // Setting the timeout to 0 so that the code
                             // is executed immediately

事实上,这就是你在方法中所做的。通过添加 delay() 并在超时后执行回调。

我希望这能让您对这个不常见的问题有更多的了解。

于 2013-02-19T10:57:09.917 回答