Dea*_*unt 590 javascript javascript-events window-resize
如何挂钩浏览器窗口调整大小事件?
有一种jQuery方式可以监听resize事件,但我不想将它带入我的项目中,只需要这个要求.
oll*_*iej 626
jQuery只是包装标准resizeDOM事件,例如.
window.onresize = function(event) {
...
};
Run Code Online (Sandbox Code Playgroud)
jQuery 可能会做一些工作来确保在所有浏览器中一致地触发resize事件,但我不确定是否有任何浏览器不同,但我鼓励你在Firefox,Safari和IE中进行测试.
Ale*_*x V 518
永远不要覆盖window.onresize函数.
而是创建一个函数来向对象或元素添加事件侦听器.这会检查并使侦听器不起作用,然后它会覆盖对象的函数作为最后的手段.这是jQuery等库中使用的首选方法.
object:元素或窗口对象
type:resize,scroll(事件类型)
callback:函数引用
var addEvent = function(object, type, callback) {
if (object == null || typeof(object) == 'undefined') return;
if (object.addEventListener) {
object.addEventListener(type, callback, false);
} else if (object.attachEvent) {
object.attachEvent("on" + type, callback);
} else {
object["on"+type] = callback;
}
};
Run Code Online (Sandbox Code Playgroud)
然后使用是这样的:
addEvent(window, "resize", function_reference);
Run Code Online (Sandbox Code Playgroud)
或者使用匿名函数:
addEvent(window, "resize", function(event) {
console.log('resized');
});
Run Code Online (Sandbox Code Playgroud)
Jon*_*dlm 514
首先,我知道addEventListener上面的评论中已经提到过该方法,但我没有看到任何代码.由于它是首选方法,因此它是:
window.addEventListener('resize', function(event){
// do stuff here
});
Run Code Online (Sandbox Code Playgroud)
Und*_*ned 32
不应该直接使用resize事件,因为在我们调整大小时它会被连续触发.
使用去抖功能可以缓解多余的呼叫.
window.addEventListener('resize',debounce(handler, delay, immediate),false);
这是一个常见的辩论,在网络上漂浮,虽然在lodash中寻找更高级的辩护.
const debounce = (func, wait, immediate) => {
var timeout;
return () => {
const context = this, args = arguments;
const later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
const callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
Run Code Online (Sandbox Code Playgroud)
这可以这样使用......
window.addEventListener('resize', debounce(() => console.log('hello'),
200, false), false);
Run Code Online (Sandbox Code Playgroud)
它永远不会每200ms发射一次以上.
对于移动方向更改,请使用
window.addEventListener('orientationchange', () => console.log('hello'), false);
Run Code Online (Sandbox Code Playgroud)
这是一个小型图书馆,我把它整齐地放在一起照顾这个.
Web*_*rer 15
我相信@Alex V已经提供了正确的答案,但答案确实需要一些现代化,因为它已经超过五年了.
有两个主要问题:
切勿object用作参数名称.这是一个保留的词.有了这个说法,@ Alex V提供的功能将不起作用strict mode.
addEvent@Alex V提供的功能event object如果使用该addEventListener方法则不返回.应该在addEvent函数中添加另一个参数以允许此操作.
注意:新参数to addEvent是可选的,因此迁移到此新函数版本不会破坏以前对此函数的任何调用.将支持所有旧版用途.
以下是更新后的addEvent功能:
/*
function: addEvent
@param: obj (Object)(Required)
- The object which you wish
to attach your event to.
@param: type (String)(Required)
- The type of event you
wish to establish.
@param: callback (Function)(Required)
- The method you wish
to be called by your
event listener.
@param: eventReturn (Boolean)(Optional)
- Whether you want the
event object returned
to your callback method.
*/
var addEvent = function(obj, type, callback, eventReturn)
{
if(obj == null || typeof obj === 'undefined')
return;
if(obj.addEventListener)
obj.addEventListener(type, callback, eventReturn ? true : false);
else if(obj.attachEvent)
obj.attachEvent("on" + type, callback);
else
obj["on" + type] = callback;
};
Run Code Online (Sandbox Code Playgroud)
调用新addEvent函数的示例:
var watch = function(evt)
{
/*
Older browser versions may return evt.srcElement
Newer browser versions should return evt.currentTarget
*/
var dimensions = {
height: (evt.srcElement || evt.currentTarget).innerHeight,
width: (evt.srcElement || evt.currentTarget).innerWidth
};
};
addEvent(window, 'resize', watch, true);
Run Code Online (Sandbox Code Playgroud)
str*_*str 15
2018+解决方案:
您应该使用ResizeObserver.它将是一个浏览器本地解决方案,其性能远远优于使用该resize事件.此外,它不仅支持事件,document还支持任意elements.
Run Code Online (Sandbox Code Playgroud)var ro = new ResizeObserver( entries => { for (let entry of entries) { const cr = entry.contentRect; console.log('Element:', entry.target); console.log(`Element size: ${cr.width}px x ${cr.height}px`); console.log(`Element padding: ${cr.top}px ; ${cr.left}px`); } }); // Observe one or multiple elements ro.observe(someElement);
目前,只有Chrome支持它,但其他浏览器可能会(很快).现在你必须使用polyfill.
Ste*_*ven 12
感谢您在http://mbccs.blogspot.com/2007/11/fixing-window-resize-event-in-ie.html上引用我的博客文章.
虽然您可以直接连接到标准窗口调整大小事件,但您会发现在IE中,每个X触发一次事件,每个Y轴移动触发一次,导致大量事件被触发,可能具有性能如果渲染是一项密集型任务,则会影响您的网站.
我的方法涉及在后续事件中取消的短暂超时,以便在用户完成窗口大小调整之前,事件不会冒泡到您的代码.
小智 7
window.onresize = function() {
// your code
};
Run Code Online (Sandbox Code Playgroud)
以下博客文章可能对您有用:修复IE中的窗口调整大小事件
它提供了以下代码:
Run Code Online (Sandbox Code Playgroud)Sys.Application.add_load(function(sender, args) { $addHandler(window, 'resize', window_resize); }); var resizeTimeoutId; function window_resize(e) { window.clearTimeout(resizeTimeoutId); resizeTimeoutId = window.setTimeout('doResizeCode();', 10); }
| 归档时间: |
|
| 查看次数: |
939446 次 |
| 最近记录: |