Подтвердить что ты не робот

Onresize для элементов div?

Visual Studio выделила мой атрибут onresize моего тега div и говорит, что он не является допустимым атрибутом для HTML5. Это правда? Что я должен использовать вместо этого? Кажется глупым, что это будет так.

4b9b3361

Ответ 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 в каком-то окне массиве, как описано здесь