在微博上看到有人提及不使用定时器实现iframe自适应(onReadyStateChange + onLoad + onResize + onDOMSubtreeModified),然后就去折腾了,这篇与之前的文章:《不使用定时器实现onhashchange》有点类似
/*****此方法暂时只支持同域下,跨域的问题有待解决****/
以往要使iframe的高度自适应,往往用定时器在跑,这个方法不错。但如果遇到这样的场景,可能会有点问题,就是某个页面嵌入一个app页面(iframe),
而这个app页面,可能经常会发生一些dom的更改,而且是由成千上万的第三方开发者开发的。而且如果定时器一直开着(只要iframe存在),总归不太好~
这样就面临着一个问题:
开发者可能需要对DOM进行修改,而iframe的高度如果需要改变,就必须由第三方开发者调用父层的,每一处DOM修改都要调用一次…
把调整iframe高度的方法暴露给第三方开发者,显示不大合适。有没有更好的方法,有,那就是DOMSubtreeModified。
在折腾的过程中,其实遇到了很我问题,不过基本上通过google就可以解决掉。某人讲的话还是挺有道理的:“Web前端开发无难点,贵在研究问题的精神和过程,方法论只是结果,价值观才是精髓~”
这个属于DOM 3 Level的事件,关于此事件的详情,可以参考以下网址:
相应的还有DOMAttrModified、DOMNodeInserted、DOMNodeRemoved等等事件
举个DOMSubtreeModified的简单例子:
/**
* ( modified from Nicholas's book )
*/
function() {
var _EventUtil = {
/**
* 注册event handler
*/
function( element, type, handler ) {
if( element.addEventListener ) {
false );
if( element.attachEvent ) {
'on' + type, handler );
else {
'on' + type ] = handler;
16: }
17: },
/**
* 停止event capturing and bubbling
*/
event ) {
event.preventDefault ) {
event.preventDefault();
else {
false;
26: }
27: },
/**
* 获取事件触发的事件源
*/
event ) {
event.srcElement;
33: },
/**
* 获取event对象
*/
event ) {
event;
39: }
40: }
41: window.EventUtil = _EventUtil;
42: })();