解決策について言えます。これは、大部分は、DOM イベントなしで、setTimeout() を使用して要素の再帰チェックを使用して解決する非常に簡単な問題です。このソリューションの問題は、選択した要素の属性を毎秒チェックするために、膨大な量と絶え間ない DOM 走査を行うことです。したがって、このソリューションの落とし穴に照らして、DOMAttrModified と呼ばれるあまり知られていない DOM イベントを使用できます (これと他のすべての標準 DOM イベントの詳細については、http ://www.w3.org/TR/DOM-Level- を参照してください)。 2-イベント/events.html )
最善の解決策
このイベントは、すべてのブラウザーでまだサポートされていないため、一般的には使用されていません。そうは言っても、IE は「propertychange」と呼ばれる同様のイベントをサポートしており、少なくとも、何もサポートしていない他のすべてのブラウザーを扱っている場合は、常に最初の setTimeout() ソリューションに頼ることができます (私はChrome/Safari を見ています)。ブラウザーとイベントの互換性のリストは、http ://www.quirksmode.org/dom/events/index.html で確認できます。
jQuery は最近の開発者にとって事実上の Javascript ライブラリであるため、すべてのブラウザーで DOMAttrModified イベントを模倣するプラグインを作成しました。
コード
$.fn.watch = function(props, callback, timeout){
if(!timeout)
timeout = 10;
return this.each(function(){
var el = $(this),
func = function(){ __check.call(this, el) },
data = { props: props.split(","),
func: callback,
vals: [] };
$.each(data.props, function(i) { data.vals[i] = el.css(data.props[i]); });
el.data(data);
if (typeof (this.onpropertychange) == "object"){
el.bind("propertychange", callback);
} else if ($.browser.mozilla){
el.bind("DOMAttrModified", callback);
} else {
setInterval(func, timeout);
}
});
function __check(el) {
var data = el.data(),
changed = false,
temp = "";
for(var i=0;i < data.props.length; i++) {
temp = el.css(data.props[i]);
if(data.vals[i] != temp){
data.vals[i] = temp;
changed = true;
break;
}
}
if(changed && data.func) {
data.func.call(el, data);
}
}
}
初期化コード
jQuery(function($){
$(".demo span").watch('width,height', function(){
if(parseFloat($(this).width()) >= 150){
$(this).css({'background':'green'});
}
if(parseFloat($(this).height()) >= 200){
$(this).css({'background':'blue'});
}
});
$('.demo a').toggle(function(){
$('.demo span').animate({'width':'400px','height':'200px'}, 1000);
}, function(){
$('.demo span').css({'width':'50px','height':'50px','background':'red'});
});
});
ライブデモ
このプラグインを使用すると、変更を「監視」する属性を指定できます。属性の 1 つが変更されると、コールバック関数が起動されます。
http://darcyclarke.me/dev/watch/