Visual Studio выделила мой атрибут onresize
моего тега div
и говорит, что он не является допустимым атрибутом для HTML5. Это правда? Что я должен использовать вместо этого? Кажется глупым, что это будет так.
Onresize для элементов div?
Ответ 1
Добавьте на свою страницу следующие CSS и JavaScript и используйте методы addResizeListener
и removeResizeListener
для прослушивания изменений размера элемента (сообщение в блоге для более подробной информации: http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/):
Изменить размер CSS CSS
.resize-triggers {
visibility: hidden;
}
.resize-triggers, .resize-triggers > div, .contract-trigger:before {
content: " ";
display: block;
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
overflow: hidden;
}
.resize-triggers > div {
background: #eee;
overflow: auto;
}
.contract-trigger:before {
width: 200%;
height: 200%;
}
Изменить методы события
Ниже приведен JavaScript, для которого вам необходимо включить прослушивание событий изменения размера. Первые две функции являются предпосылками, которые используются в основных методах addResizeListener и removeResizeListener.
(function(){
var attachEvent = document.attachEvent;
if (!attachEvent) {
var requestFrame = (function(){
var raf = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame ||
function(fn){ return window.setTimeout(fn, 20); };
return function(fn){ return raf(fn); };
})();
var cancelFrame = (function(){
var cancel = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame ||
window.clearTimeout;
return function(id){ return cancel(id); };
})();
function resetTriggers(element){
var triggers = element.__resizeTriggers__,
expand = triggers.firstElementChild,
contract = triggers.lastElementChild,
expandChild = expand.firstElementChild;
contract.scrollLeft = contract.scrollWidth;
contract.scrollTop = contract.scrollHeight;
expandChild.style.width = expand.offsetWidth + 1 + 'px';
expandChild.style.height = expand.offsetHeight + 1 + 'px';
expand.scrollLeft = expand.scrollWidth;
expand.scrollTop = expand.scrollHeight;
};
function checkTriggers(element){
return element.offsetWidth != element.__resizeLast__.width ||
element.offsetHeight != element.__resizeLast__.height;
}
function scrollListener(e){
var element = this;
resetTriggers(this);
if (this.__resizeRAF__) cancelFrame(this.__resizeRAF__);
this.__resizeRAF__ = requestFrame(function(){
if (checkTriggers(element)) {
element.__resizeLast__.width = element.offsetWidth;
element.__resizeLast__.height = element.offsetHeight;
element.__resizeListeners__.forEach(function(fn){
fn.call(element, e);
});
}
});
};
}
window.addResizeListener = function(element, fn){
if (attachEvent) element.attachEvent('resize', fn);
else {
if (!element.__resizeTriggers__) {
if (getComputedStyle(element).position == 'static') element.style.position = 'relative';
element.__resizeLast__ = {};
element.__resizeListeners__ = [];
(element.__resizeTriggers__ = document.createElement('div')).className = 'resize-triggers';
element.__resizeTriggers__.innerHTML = '<div class="expand-trigger"><div></div></div>' +
'<div class="contract-trigger"></div>';
element.appendChild(element.__resizeTriggers__);
resetTriggers(element);
element.addEventListener('scroll', scrollListener, true);
}
element.__resizeListeners__.push(fn);
}
};
window.removeResizeListener = function(element, fn){
if (attachEvent) element.detachEvent('resize', fn);
else {
element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);
if (!element.__resizeListeners__.length) {
element.removeEventListener('scroll', scrollListener);
element.__resizeTriggers__ = !element.removeChild(element.__resizeTriggers__);
}
}
}
})();
Демо-Licious!
Здесь используется метод использования псевдокода.
var myElement = document.getElementById('my_element'),
myResizeFn = function(){
/* do something on resize */
};
addResizeListener(myElement, myResizeFn);
removeResizeListener(myElement, myResizeFn);
Ответ 2
Microsoft Internet Explorer поддерживает onresize
для всех элементов HTML.
Во всех других браузерах onresize
доступен только для объекта window
.
https://developer.mozilla.org/en-US/docs/Web/API/Window.onresize
Если вы хотите иметь onresize в div
во всех браузерах, проверьте это:
http://marcj.github.io/css-element-queries/
В этой библиотеке есть класс ResizeSensor
, который может использоваться для обнаружения resize
.
Ответ 3
В спецификации существует только Window.onResize
. Помните, что каждый элемент IFrame
создает новый объект Window
, который поддерживает onResize
. Поэтому IMO - самый надежный способ обнаружения изменений размера элемента - добавить скрытые фреймы к элементу.
Если вас интересует аккуратное и портативное решение, пожалуйста, этот плагин. Для прослушивания события изменения ширины или высоты вашего div требуется 1 строка кода.
<!-- (1) include plugin script in a page -->
<script src="/src/jquery-element-onresize.js"></script>
// (2) use the detectResizing plugin to monitor changes to the element size:
$monitoredElement.detectResizing({ onResize: monitoredElement_onResize });
// (3) write a function to react on changes:
function monitoredElement_onResize() {
// logic here...
}
Ответ 4
Это может быть сделано без каких-либо плагинов, просто, собирая все div в каком-то окне массиве, как описано здесь