jquery - 如何确定 div 是否更改其高度或任何 css 属性?

IT技术 javascript jquery css
2021-01-15 08:30:19

我想知道如何在 div 更改其高度或任何 css 属性时触发事件。

我有一个 id = 的 div mainContent我希望 jquery 在改变其高度时自动触发一个事件。我做了这样的事情:

$("#mainContent").change('height', function() {
    $("#separator").css('height', $("#mainContent").height());
});

我知道这是错误的。

这是我的整个代码(我粘贴了所有代码,因为由于某种我不知道的原因我无法进入 jsfiddle):

<html>
<head>
<style type="text/css">
html, body {
 width: 100%;
 height: 100%;
 margin: 0;
 padding: 0;
}

#separator {
 border-right: 1px solid black;
}
</style>

<script type="text/javascript" src="jquery1.6.4min.js"> </script>
<script type="text/javascript">
$(document).ready(function() {
 $("#separator").css('height', $("body").height());
});

$(function() {
 $("#btnSample1").click(function() {
  $("#mainContent").css('height', '400px');
  $("#mainContent").css('width', '600px');
  $("#mainContent").css('background-color', '#F0F0F0');
 });

 $("#btnSample2").click(function() {
  $("#mainContent").css('height', '1600px');
  $("#mainContent").css('width', '700px');
  $("#mainContent").css('background-color', '#F0F0F0');     
 });

 $("#mainContent").change('height', function() {
  $("#separator").css('height', $("#mainContent").height());
 });
});
</script>
</head>
<body>
<table style="width: 100%;">
 <tr>
  <td valign="top" style="width: 19%;"> 
   <table id="mainMenu">
    <tr><td><input id="btnSample1" type="button" value="Sample 1"  /></td></tr>
    <tr><td><input id="btnSample2" type="button" value="Sample 2"  /></td></tr>
   </table>
  </td>

  <td valign="top" style="width: 1%;" >
   <div id="separator"></div> 
  </td>

  <td valign="top" style="width: 80%;">
   <div id="mainContent"></div>
  </td>
 </tr>
</table>
</body>
</html>

我正在尝试separator根据mainContent高度mainContent变化时的高度调整 div id=的高度

PS:在这种情况下,我知道我可以使用按钮事件来做到这一点,但我希望 div 在高度改变时触发事件。请帮忙。提前致谢。

4个回答

首先,有没有这样的CSS-改变事件开箱即用,但您可以创建一个由你自己,因为onchange:input唯一的元素。不适用于 css 更改。

有两种方法可以跟踪 css 更改。

  1. 每 x 次(示例中为 500 毫秒)检查 DOM 元素的 css 更改。
  2. 更改元素 css时触发一个事件
  3. 使用DOMAttrModified突变事件。但它已被弃用,所以我会跳过它。

第一种方式:

var $element = $("#elementId");
var lastHeight = $("#elementId").css('height');
function checkForChanges()
{
    if ($element.css('height') != lastHeight)
    {
        alert('xxx');
        lastHeight = $element.css('height'); 
    }

    setTimeout(checkForChanges, 500);
}

第二种方式:

$('#mainContent').bind('heightChange', function(){
        alert('xxx');
    });


$("#btnSample1").click(function() {
    $("#mainContent").css('height', '400px');
    $("#mainContent").trigger('heightChange'); //<====
    ...
});    

如果您控制 css 更改,则第二个选项是一种更加优雅和高效的方式。

文件:

  • 绑定Description: Attach a handler to an event for the elements.
  • 触发器Description: Execute all handlers and behaviors attached to the matched elements for the given event type.
if ($element.css('height') == 'bar') 中的 bar 是什么?
2021-03-17 08:30:19
@忍者男孩。很高兴我能提供帮助,请查看更新,因为它包含另一个选项。
2021-03-25 08:30:19
或者更简单 $('#mainContent').height(400).trigger('resize');
2021-03-27 08:30:19
任何需要定期检查的解决方案很可能是一个不太优雅的性能消耗黑客,而不是事件驱动的解决方案。
2021-04-02 08:30:19
heightChange 是默认的 jquery 函数吗?
2021-04-07 08:30:19

请不要使用此处其他答案中描述的技术。他们要么不使用 css3 动画大小更改、浮动布局更改或非来自 jQuery 的更改。您可以使用调整大小检测器,这是一种基于事件的方法,不会浪费您的 CPU 时间。

https://github.com/marcj/css-element-queries

它包含可用于该目的的 ResizeSensor 类。

new ResizeSensor(jQuery('#mainContent'), function(){ 
    console.log('main content dimension changed');
});

免责声明:我写了这个库

这是一个很好的解决方案,但是,它包含一个相当大的文件。您必须在此处选择 CPU 与页面权重。对我来说,通过 DOM 元素运行循环函数来观察仍然是一个更好的选择。
2021-03-22 08:30:19
对我不起作用。我错过了什么吗?我包含了两个 js 文件。添加对构造函数的调用,例如,将 mainContent 更改为我的 div 的 id,我确定它的高度已更改,但从未调用过回调函数。控制台上没有例外。(我的 div 的高度是通过角度插值改变的。不知道是否重要。)
2021-03-23 08:30:19
@Gfra54,“大文件”真是个笑话。ResizeSensor.js 只有 144 行代码。;)
2021-03-24 08:30:19
gdoron 的回答只提出了 2 个选项,一个是手动点击,另一个是使用计时器,这两个选项都很糟糕。我发现这个插件是一个更好的解决方案,因为它非常好且无缝,因为我们不需要手动捕获成功事件的所有动态,这会导致高度增加。
2021-03-28 08:30:19
效果很好!我见过的最佳解决方案 - 不完美,因为在短时间内发生多个调整大小触发器时(例如使用调整文本区域大小时),它似乎错过了一些事件,但仍然是一个有效的解决方案。
2021-04-12 08:30:19

为了将来,我会发布这个。如果您不需要支持 < IE11,那么您应该使用 MutationObserver。

这是caniuse js MutationObserver的链接

使用简单,结果强大。

    var observer = new MutationObserver(function (mutations) {
        //your action here
    });

    //set up your configuration
    //this will watch to see if you insert or remove any children
    var config = { subtree: true, childList: true };

    //start observing
    observer.observe(elementTarget, config);

当您不再需要观察时,只需断开连接即可。

    observer.disconnect();

查看MDN 文档以获取更多信息

看来使用resize:vertical;不会产生变化。看看它在这里使用 javascript resize jsfiddle.net/jfo57rdd
2021-03-16 08:30:19
要在样式属性中包含更改,您将包含attributes: trueconfig对象中。您甚至可以attributeFilter: ['style']组合使用来拉动样式更改。
2021-03-17 08:30:19
看起来真的很酷。所以您是说宽度和高度是样式属性的一部分,因此更改它们将生成对给定回调的调用,该回调可以反过来检查大小是否更改并可能触发另一个事件,例如“调整大小”,对吗?
2021-03-29 08:30:19
是的,你绝对可以做到。尽管您可能想创建自己的自定义事件名称,observedResize并触发它。
2021-03-30 08:30:19
@Brandon.Staley 当 div 中有图像时,这不起作用。首先,图像未加载且 div 大小设置为 0,加载后 div 大小增加,但未触发观察方法
2021-04-11 08:30:19

另一个简单的例子。

对于此示例,我们可以使用 100x100 DIV-box:

<div id="box" style="width: 100px; height: 100px; border: solid 1px red;">
 // Red box contents here...
</div>

和小jQuery技巧:

<script type="text/javascript">
  jQuery("#box").bind("resize", function() {
    alert("Box was resized from 100x100 to 200x200");
  });
  jQuery("#box").width(200).height(200).trigger("resize");
</script>

脚步:

  1. 我们创建了用于调整操作大小的 DIV 块元素
  2. 添加简单的 JavaScript 代码:
    • jQuery 绑定
    • 带有触发器动作“调整大小”的 jQuery 调整器 - 在我的示例中触发器是最重要的
  3. 调整大小后,您可以查看浏览器警报信息

就这样。;-)

还有……对不起,我的英语不好……我没有足够的时间上英语学校。:-/
2021-04-01 08:30:19
您自己触发调整大小事件?我想问题是在用户生成事件时处理事件(增加/减少浏览器窗口大小) - 而不是你。
2021-04-09 08:30:19