これがあれば
window.onresize = function() {
alert('resized!!');
};
私の関数はサイズ変更中に複数回起動されますが、サイズ変更の完了をキャプチャしたいと考えています。これはIEにあります。
何か案は?そこにはさまざまなアイデアがありますが、これまでのところうまくいきませんでした (たとえば、IE の想定される window.onresizeend イベント)。
これがあれば
window.onresize = function() {
alert('resized!!');
};
私の関数はサイズ変更中に複数回起動されますが、サイズ変更の完了をキャプチャしたいと考えています。これはIEにあります。
何か案は?そこにはさまざまなアイデアがありますが、これまでのところうまくいきませんでした (たとえば、IE の想定される window.onresizeend イベント)。
この場合、デバウンスを強くお勧めします。私が見つけた JavaScript でこれを行うための最もシンプルで効果的で信頼性の高い方法は、Ben Alman の jQuery プラグインである Throttle/Debounce (jQuery の有無にかかわらず使用できます - 私は知っています...奇妙に聞こえます)。
デバウンスを使用すると、これを行うコードは次のように単純になります。
$(window).resize($.debounce(1000, function() {
// Handle your resize only once total, after a one second calm.
...
}));
誰かを助けることができることを願っています。;)
リサイズ後に何かしたい時はいつもこれを使っています。setTimeout
との呼び出しclearTimeout
は、サイズ変更の速度に顕著な影響を与えないため、これらが複数回呼び出されても問題ありません。
var timeOut = null;
var func = function() { /* snip, onresize code here */};
window.onresize = function(){
if(timeOut != null) clearTimeout(timeOut);
timeOut = setTimeout(func, 100);
}
これは完璧ではありませんが、必要なスタートを切ることができます。
var initialX = null;
var initialY = null;
var lastResize = null;
var waiting = false;
var first = true;
var id = 0;
function updateResizeTime()
{
if (initialX === event.clientX && initialY === event.clientY)
{
return;
}
initialX = event.clientX;
initialY = event.clientY;
if (first)
{
first = false;
return;
}
lastResize = new Date();
if (!waiting && id == 0)
{
waiting = true;
id = setInterval(checkForResizeEnd, 1000);
}
}
function checkForResizeEnd()
{
if ((new Date()).getTime() - lastResize.getTime() >= 1000)
{
waiting = false;
clearInterval(id);
id = 0;
alert('hey!');
}
}
window.onresize = function()
{
updateResizeTime();
}
実際には複数のイベントがあるため、複数のイベントを取得します。ウィンドウをドラッグすると、Windowsはサイズ変更を数回行うことでアニメーション化します(デフォルトでは、レジストリで変更できると思います)。
あなたができることは、遅延を追加することです。IE イベントが発生するたびに clearTimeout, setTimout(myResize,1000) を実行します。次に、最後のものだけが実際のサイズ変更を行います。
単純な純粋な JavaScript ソリューションです。1000 の int 値を低く変更して、応答性を高めます。
var resizing = false;
window.onresize = function() {
if(resizing) return;
console.log("resize");
resizing = true;
setTimeout(function() {resizing = false;}, 1000);
};
これが役立つかどうかはわかりませんが、完全に機能しているように見えるので、ここにあります. 前回の記事から抜粋して、少し修正しました。関数 doCenter() は、最初に px を em に変換し、次にオブジェクトの幅を引き、残りを 2 で割ります。結果は左マージンとして割り当てられます。doCenter() を実行して、オブジェクトを中央に配置します。doCenter() を再度実行してウィンドウのサイズが変更されると、タイムアウトが発生します。
function doCenter() {
document.getElementById("menuWrapper").style.position = "fixed";
var getEM = (window.innerWidth * 0.063);
document.getElementById("menuWrapper").style.left = (getEM - 40) / 2 + "em";
}
doCenter();
var timeOut = null;
var func = function() {doCenter()};
window.onresize = function(){
if (timeOut != null) clearTimeout(timeOut);
timeOut = setTimeout(func, 100);
};
私は Pim Jager のエレガントなソリューションが好きでしたが、最後に余分な括弧があり、おそらく setTimeout は "timeOut = setTimeout(func,100);" であるべきだと思います。
これが Dojo を使用した私のバージョンです (demo_resize() という名前の関数が定義されていると仮定します)...
var _semaphorRS = null; dojo.connect(window,"resize",function(){ if (_semaphorRS != null) clearTimeout(_semaphorRS); _semaphorRS = setTimeout(demo_resize, 500); });
注: 私のバージョンでは、末尾の括弧が必要です。