检测文档高度变化
我正在尝试检测document
高度何时发生变化。 一旦它,我需要运行一些function,以帮助组织我的页面布局。
我不是在寻找window.onresize
。 我需要整个文件,比窗口大。
我如何观察这个变化?
function onElementHeightChange(elm, callback){ var lastHeight = elm.clientHeight, newHeight; (function run(){ newHeight = elm.clientHeight; if( lastHeight != newHeight ) callback(); lastHeight = newHeight; if( elm.onElementHeightChangeTimer ) clearTimeout(elm.onElementHeightChangeTimer); elm.onElementHeightChangeTimer = setTimeout(run, 200); })(); } onElementHeightChange(document.body, function(){ alert('Body height changed'); });
现场演示
只是我的两分钱。 如果有可能你使用angular度,那么这将做的工作:
$scope.$watch(function(){ return document.height(); },function onHeightChange(newValue, oldValue){ ... });
您可以在要监视高度变化的元素内使用宽度为零的absolute
定位iframe
,并在其contentWindow
上侦听resize
事件resize
。 例如:
HTML
<body> Your content... <iframe class="height-change-listener" tabindex="-1"></iframe> </body>
CSS
body { position: relative; } .height-change-listener { position: absolute; top: 0; bottom: 0; left: 0; height: 100%; width: 0; border: 0; background-color: transparent; }
JavaScript(使用jQuery,但可以适应纯JS)
$('.height-change-listener').each(function() { $(this.contentWindow).resize(function() { // Do something more useful console.log('doc height is ' + $(document).height()); }); });
如果无论什么原因,你有height:100%
body
设置,你需要find(或添加)另一个容器元素来实现这一点。 如果要dynamic添加iframe
可能需要使用<iframe>.load
事件附加contentWindow.resize
侦听器。 如果你想在IE7以及浏览器中工作,你需要在容器元素中添加*zoom:1
hack,并且在<iframe>
元素本身上监听'proprietary'resize事件IE8-10中的contentWindow.resize
)。
这是一个小提琴
正如在vsync中提到的,没有事件,但是你可以使用定时器或者在其他地方附加处理程序:
// get the height var refreshDocHeight = function(){ var h = $(document).height(); $('#result').html("Document height: " + h); }; // update the height every 200ms window.setInterval(refreshDocHeight, 200); // or attach the handler to all events which are able to change // the document height, for example $('div').keyup(refreshDocHeight);
在这里findjsfiddle 。
vsync的答案是完全正确的。 以防万一你不喜欢使用setTimeout
,你可以使用requestAnimationFrame
( 见支持 ),当然你仍然感兴趣。
在下面的例子中,body得到一个额外的事件大小变化。 每当身体的高度或宽度发生改变时,都会触发。
(function checkForBodySizeChange() { var last_body_size = { width: document.body.clientWidth, height: document.body.clientHeight }; function checkBodySizeChange() { var width_changed = last_body_size.width !== document.body.clientWidth, height_changed = last_body_size.height !== document.body.clientHeight; if(width_changed || height_changed) { trigger(document.body, 'sizechange'); last_body_size = { width: document.body.clientWidth, height: document.body.clientHeight }; } window.requestAnimationFrame(checkBodySizeChange); } function trigger(element, event_name, event_detail) { var evt; if(document.dispatchEvent) { if(typeof CustomEvent === 'undefined') { var CustomEvent; CustomEvent = function(event, params) { var evt; params = params || { bubbles: false, cancelable: false, detail: undefined }; evt = document.createEvent("CustomEvent"); evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); return evt; }; CustomEvent.prototype = window.Event.prototype; window.CustomEvent = CustomEvent; } evt = new CustomEvent(event_name, {"detail": event_detail}); element.dispatchEvent(evt); } else { evt = document.createEventObject(); evt.eventType = event_name; evt.eventName = event_name; element.fireEvent('on' + event_name, evt); } } window.requestAnimationFrame(checkBodySizeChange); })();
现场演示
如果在项目中有一个自己的triggerEvent
函数,代码可以减less很多。 因此,只需删除完整的函数trigger
并replace行trigger(document.body, 'sizechange');
例如在jQuery $(document.body).trigger('sizechange');
。
watch()命令检查属性中的任何更改。
看到这个链接: 如何检测你的网页的高度变化?