【问题标题】:Is it possible to set a JS listener on attribute of an element?是否可以在元素的属性上设置 JS 侦听器?
【发布时间】:2014-01-21 15:45:01
【问题描述】:

我想在元素的宽度增长到一定大小时运行 JavaScript 函数。正确地说,听众似乎只是为了“事件”。但是有没有办法在 CSS 属性上设置一个“监听器”,比如宽度?如果有,怎么做?

【问题讨论】:

标签: javascript css attributes


【解决方案1】:

如果您特别希望侦听 DOM 元素上的属性更改,则可以在现代浏览器中使用 MutationObserver (https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver) 并回退到 Mutation 事件 (https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mutation_events)。

如果不是属性更改而是另一个导致 DOM 元素改变大小的事件,您可以挂钩该事件,例如,如果是导致更改的窗口大小调整,您可以将该事件与以下代码(请注意,IE 8 和更早版本需要后备):

window.addEventListener("resize", function(e){});

如果宽度的变化是由 JavaScript 库引起的,那么可能会有一个 API 用于它,或者您可以覆盖一个函数来创建它。

作为最后的手段,您可以使用 setInterval 或 requestAnimaitonFrame 轮询 DOM 元素,具体取决于您需要检查元素的频率。

【讨论】:

    【解决方案2】:

    如果你需要在 2020 年收听一个元素大小,你可以使用 ResizeObserver

    https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver

    你可以试试下面的sn-p来打印一个元素的维度变化

    const resizeObserver = new ResizeObserver(entries => {
        for (let entry of entries) 
            console.log(entry);
    });
    
    resizeObserver.observe(htmlElement);
    

    【讨论】:

      【解决方案3】:

      如果你使用 jQuery,你可以使用 resize 事件来识别宽度。

      http://api.jquery.com/resize/

      编辑:添加了工作示例

      http://jsfiddle.net/addy2601/5LX6A/

      $( '#div' ).resize(function() {
      //Your code here
      });
      

      【讨论】:

      • 那是浏览器窗口,而不是特定元素(这是他想要的)。
      • 注意只有窗口有resize事件
      • 来自链接文档:“当浏览器窗口大小改变时,resize 事件被发送到窗口元素”。
      • @RocketHazmat & adeneo - 我已经用 JSFiddle 示例更新了答案。 Johnk - 如果它不起作用,请尝试让我知道。
      • 您的 jsFiddle 示例使用 jQuery UI 创建了一个 resizable div。 resize 事件在调整 div 大小时由 jQuery 手动触发。如果通过任何其他方法调整 div 的大小,这将不起作用。我怀疑这是 OP 想要的。
      猜你喜欢
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 2016-01-17
      相关资源
      最近更新 更多