首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js 获取img的变形事件

在JavaScript中,获取<img>元素的变形事件并不是一个直接的操作,因为HTML本身并没有提供一个专门的事件来监听图像的变形。但是,我们可以通过监听其他相关事件或使用特定的技术来检测图像是否发生了变形。

基础概念

图像变形通常指的是图像的尺寸、比例或方向发生了变化。这可能是由于CSS样式更改、窗口大小调整、设备方向变化或其他因素引起的。

相关优势

能够检测图像变形可以帮助我们在图像显示不正确时及时作出响应,例如重新加载图像、调整布局或通知用户。

类型与应用场景

  1. 尺寸变化:当图像的宽度和高度发生变化时。
  2. 比例变化:图像的宽高比发生变化。
  3. 方向变化:图像的方向(如横屏到竖屏)发生变化。

如何检测变形

我们可以通过监听resize事件和orientationchange事件来检测图像是否可能发生了变形。此外,我们还可以使用getBoundingClientRect()方法来获取图像的实际尺寸,并与原始尺寸进行比较。

示例代码

代码语言:txt
复制
// 获取img元素
const img = document.querySelector('img');

// 记录原始尺寸
const originalSize = {
  width: img.naturalWidth,
  height: img.naturalHeight
};

// 检测变形的函数
function checkForImageDistortion() {
  const currentSize = img.getBoundingClientRect();
  const isDistorted = currentSize.width !== originalSize.width || currentSize.height !== originalSize.height;
  
  if (isDistorted) {
    console.log('图像发生了变形!');
    // 在这里执行相应的操作,比如重新加载图像
  }
}

// 监听窗口大小调整事件
window.addEventListener('resize', checkForImageDistortion);

// 监听设备方向变化事件(适用于移动设备)
window.addEventListener('orientationchange', checkForImageDistortion);

遇到问题的原因及解决方法

如果发现图像变形事件没有被正确触发,可能的原因包括:

  1. 事件未绑定:确保已经正确绑定了事件监听器。
  2. 异步加载问题:如果图像是异步加载的,可能在绑定事件时图像还未加载完成。可以在图像的load事件中绑定变形检测函数。
  3. CSS影响:某些CSS样式(如object-fit)可能会影响图像的显示方式,导致看似变形但实际上并未改变尺寸。

解决方法:

  • 确保在DOM完全加载后再绑定事件。
  • 使用img.onload事件确保图像加载完成后再进行尺寸比较。
  • 检查并调整相关的CSS样式。

通过上述方法,我们可以有效地检测和处理图像的变形问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

js图片监听onload事件,依然有获取不到宽高的场景

背景 在实际开发中,移动端页面遇到的,采用正常写法,图片 src赋值写在 onload 事件监听 后面,依然会有拿不到 图片真实宽高的场景,获得的图片宽高都为0,真的是好坑啊。...var img_url = '.jpg' // 创建对象 var img = new Image() // 加载完成执行 img.onload = function(){ console.log...(img.width,img.height) } // 改变图片的src img.src = img_url 解决 参考了该文章 关键时刻,还是得靠定时器轮询啊!!!...var img = new Image() // 改变图片的src img.src = img_url // 定时执行获取宽高 var check = function(){ // 只要任何一方大于...0 // 表示已经服务器已经返回宽高 if (img.width>0 || img.height>0) { clearInterval(set); } } var

4K20
  • JS的事件冒泡和捕获

    事件机制 ---- 事件触发三个阶段: window往事件触发处传播,遇到注册的捕获事件会触发 传播到事件触发处时触发注册的事件 从事件触发处往window传播,遇到注册的冒泡事件会触发 事件触发一般会按照...W3C event model |------------------------------------------- 但是有一个特例:如果给body中的子节点同时注册冒泡和捕获事件...,事件触发会按照注册的顺序执行。...和outer上面,而且这两个事件处理函数的useCapture选项为true,说明他们被注册在捕获阶段的。...此时进入冒泡阶段,inner上的时间处理器得到执行 事件命中元素后开始向上冒泡,一路查找是否注册了冒泡阶段的祖先元素上的时间处理器。由于没有找到因此什么也没发生。

    2.6K20

    Node.js的事件循环

    介绍 事件循环是了解 Node.js 最重要的方面之一。 为什么这么重要?...因为它阐明了 Node.js 如何做到异步且具有非阻塞的 I/O,所以它基本上阐明了 Node.js 的“杀手级应用”,正是这一点使它成功了。...通常,在大多数浏览器中,每个浏览器选项卡都有一个事件循环,以使每个进程都隔离开,并避免使用无限的循环或繁重的处理来阻止整个浏览器的网页。 该环境管理多个并发的事件循环,例如处理 API 调用。...此时,调用堆栈如下所示: 这是程序中所有函数的执行顺序: 为什么会这样呢? 消息队列 当调用 setTimeout() 时,浏览器或 Node.js 会启动定时器。...在消息队列中,用户触发的事件(如单击或键盘事件、或获取响应)也会在此排队,然后代码才有机会对其作出反应。类似 onLoad 这样的 DOM 事件也如此。

    2.7K20

    js绑定事件代理的坑

    js通过事件代理的方式绑定跳转事件,我这里的逻辑是把click事件绑定在最外层container上面,如果e.target包含我已经写好的class,则执行跳转逻辑。...但是这种方式好像只能是在点击的元素的上面,也就是最内层的元素上面有相应的class才能跳转,在外层加同样的class不生效,说明是我对于事件代理的理解不够深刻,其实事件代理的作用就是为了把目标元素的事件绑定在外层做代理...class时执行点击事件,又想要外层元素含有class时执行点击事件,修改优化如下: document.querySelector('#container').addEventListener('click...', function (e) { console.log(e.currentTarget) //获得当前绑定监听事件的元素, container console.log...,而不是外面一层; currentTarget绑定相应想要点击的class的时候必须是做代理的即做事件监听的元素。

    5K20

    js事件委托的理解 转

    事件委托也叫事件代理,事件委托就是利用事件冒泡,指定一个事件处理程序,就可以管理某一类型的所有事件,何为事件冒泡呢,就是从事件最深的节点开始,然后逐步向上传播事件,最大的优点是提高性能 一般的做法 <ul...break; } } } } 所写的事件对应新增加的元素是不起作用的...值得注意的是,mouseover和mouseout虽然也有事件冒泡,但是处理它们的时候需要特别的注意,因为需要经常计算它们的位置,处理起来不太容易。...不适合的就有很多了,focus,blur之类的,本身就没用冒泡的特性,自然就不能用事件委托了。...我的理解是:事件委托都是在外围的div添加事件,当点击内部的一个元素时,即使这个元素没有onclick事件,依然会从内到外执行onclick事件,js中外部div 添加事件的函数内 var ev = ev

    1K20

    input获取焦点 原生js_原生js的input事件

    1.onfocus 当input 获取到焦点时触发 2.onblur 当input失去焦点时触发,注意:这个事件触发的前提是已经获取了焦点再失去焦点的时候才会触发该事件,用于判断标签为空。...4.onkeydown 按下按键时的事件触发, 5.onkeyup 当按键抬起的时候触发的事件,在该事件触发之前一定触发了onkeydown事件–相当于一个按键,两个事件,没怎么用过 6.onclick...主要是用于 input type=button,input作为一个按钮使用时的鼠标点击事件 7.onselect 当input里的内容文本被选中后执行,只要选择了就会触发,不是全部选中 8.oninput...当input的value值发生变化时就会触发,(与onchange的区别是不用等到失去焦点就可以触发了) 使用方法: 以上事件可以直接放到input的属性里,例如: 1 , 可以通过js给input...dom元素添加相应的事件, 2 document.getElementByTagName(‘input’).onfocus = function(); 3 事件监听。

    25.8K60

    JS获取事件对象,获取事件的源对象(Firefox,IE)

    做笔记,以防自己忘记~~ JS获取事件event,不同浏览器有不同的做法。 例如IE下,在js函数中,通过window.event就可以获取,不必在函数中添加什么参数。...也可以用Prototype或者JQuery等,它们有他们对事件的包装。还是使用JS库比较好,不然就有下边的麻烦。...注意获取的标记都以大写表示,如"TD","TR","A"等。所以把看过的一些抄下来,不记得的时候再来看看。...在 ie中处理事件直接使用window.event对象即可,但在firefox中,是没有 window.event对象的,函数需要使用事件的时候,需要在事件发生时把事件作为参数传递给函数,不象在ie...中,事件对象是全局的,随处都可以访 问.下面这个getEvent()函数可以兼容firefox和ie,只需要在访问事件对象的函数的开始调用getEvent()即可,不用再把事件作为 参数传递.以下代码已经实验通过

    10.1K50

    js中的事件(event)

    什么是事件: 我们可以简单的把事件理解为浏览器的感知系统。...,相当于文档的中鼠标的坐标; target事件源;事件源的概念:事件最终发生在页面的那个元素上; 事件源和事件的传播是息息相关的 事件的传播包括:冒泡和捕获;事件传播是浏览器在处理事件行为的机制,冒泡阶段或者捕获阶段...;当你在一个form表单里点击提交按钮时网页会产生一个行为病刷新网页,当你网页上滚动鼠标滚轮的时候,页面的滚动条会滚动等等;这些都叫事件的默认行为,如果想把这些默认行为取消了,相应的js代码如下: a.onclick...事件委托: 事件委托是利用事件的传播机制,通过判断事件源来实现的,是一种高性能的事件处理方式。对事件委托的好处和概念详见《高程3》的第402页; 我们通过一个简单的示例来看看事件的好处。...p>ppppp span 张松 一般的思路是把所有的元素都获取到,然后循环绑定,这样做的缺点就是不仅性能不好

    6.9K30

    input事件的获取

    大家好,又见面了,我是你们的朋友全栈君。 loop线程已经运行起来了,如果不出意外,它是不会终止的;不妨以此为起点,再开始一段新的旅程,我要去探索input事件的获取。...一 EventHub构造函数 EventHub是所有输入事件的中央处理站,凡是与输入事件有关的事它都管。上帝创造万事万物都是有原因的,看看构造它是出于什么目的。...这些device都是需要add的。 7 FINISHED_DEVICE_SCAN是个什么事件?这是event最后一次一定会发送的事件,会上报所有添加/删除设备事件中最后一次扫描到的事件。...一个input事件确实产生的时候,与内核进入evdev所有事件的简单时间戳相比,有些input外设可能有更好的时间概念。...写完这些input事件就获取到了,会保存在RawEvent mEventBuffer[EVENT_BUFFER_SIZE]中。

    3.2K20

    JS实现动态获取当前点击事件的id属性值

    整个页面是通过ajax请求最新的4部视频进行填充完成,视频列表又是通过template-web.js插件补上去的,所以导致所有ID值都是一样的,一开始给按钮添加一个事件,结果是所有播放按钮都是播放第一个视频...于是,想了好多办法,又把ID属性给弄成动态的ajax请求的属性值,实现了每个id不一样,接下来,因为点击播放要调用一个方法,进行解析视频播放,拼接成API+视频链接的格式在新打开的弹窗进行展示。...具体可以看下图: 要实现点击不同按钮,并且按钮ID是动态从ajax请求获取的,还要添加点击视频拼接视频链接,参考了文章,可以获取点击按钮的id值,然后使用button,将链接放在value中 Dom...对象的id属性可以获取元素的id值。...-- HTML结构 --> 获取id值">播放 // javascript

    25.9K20
    领券