移除jQuery后使用Croppie实现图片裁剪时遭遇错误求助
移除jQuery实现图片裁剪功能的解决方案
我完全懂你的痛点——那个标注"纯JavaScript"的示例居然偷偷用了jQuery,想砍掉jQuery简化维护却踩了坑对吧?别担心,我帮你把示例的核心裁剪逻辑完全转换成原生JS,保留所有功能的同时彻底摆脱jQuery依赖。
先拆解原示例的jQuery依赖点
原示例里用到的jQuery功能其实都是原生API可以替代的:
- 文档就绪事件 → 用
DOMContentLoaded监听 - DOM选择器 → 用
getElementById/querySelector - 事件绑定 → 用
addEventListener - 样式操作 → 直接操作元素的
style属性 - DOM插入 → 用
appendChild
完整原生实现代码
HTML
<div id="page"> <div id="demo-basic"> <!-- 裁剪容器,JS会动态添加图片和调整手柄 --> </div> </div>
CSS(补全你提供的部分,匹配原示例样式)
#page { background: #FFF; padding: 20px; max-width: 800px; margin: 0 auto; } #demo-basic { position: relative; width: 100%; height: 400px; border: 1px solid #ccc; overflow: hidden; } .crop-image { position: absolute; top: 0; left: 0; cursor: move; } .crop-handle { position: absolute; width: 12px; height: 12px; background: #fff; border: 1px solid #333; border-radius: 50%; cursor: nwse-resize; }
原生JavaScript代码
document.addEventListener('DOMContentLoaded', function() { const container = document.getElementById('demo-basic'); let img = null; let isDragging = false; let startX, startY, initialX, initialY; let isResizing = false; let resizeStartX, resizeStartY, initialWidth, initialHeight; // 加载目标图片(替换成你的图片URL即可) function loadImage() { img = new Image(); img.src = 'https://picsum.photos/800/600'; img.className = 'crop-image'; img.onload = function() { // 初始化图片的默认位置和大小 img.style.width = '600px'; img.style.height = 'auto'; img.style.top = '50px'; img.style.left = '100px'; container.appendChild(img); addResizeHandle(); }; } // 添加右下角的尺寸调整手柄 function addResizeHandle() { const handle = document.createElement('div'); handle.className = 'crop-handle'; handle.style.bottom = '5px'; handle.style.right = '5px'; container.appendChild(handle); // 绑定调整大小的事件监听 handle.addEventListener('mousedown', startResize); document.addEventListener('mousemove', resize); document.addEventListener('mouseup', stopResize); } // 图片拖动开始 function startDrag(e) { isDragging = true; startX = e.clientX; startY = e.clientY; initialX = parseInt(img.style.left) || 0; initialY = parseInt(img.style.top) || 0; img.style.cursor = 'grabbing'; } // 图片拖动逻辑 function drag(e) { if (!isDragging) return; const dx = e.clientX - startX; const dy = e.clientY - startY; img.style.left = `${initialX + dx}px`; img.style.top = `${initialY + dy}px`; } // 停止图片拖动 function stopDrag() { isDragging = false; img.style.cursor = 'move'; } // 开始调整图片尺寸 function startResize(e) { isResizing = true; resizeStartX = e.clientX; resizeStartY = e.clientY; initialWidth = parseInt(img.style.width) || img.width; initialHeight = parseInt(img.style.height) || img.height; document.body.style.cursor = 'nwse-resize'; e.preventDefault(); } // 尺寸调整逻辑(保持宽高比) function resize(e) { if (!isResizing) return; const dx = e.clientX - resizeStartX; const dy = e.clientY - resizeStartY; const newWidth = initialWidth + dx; // 按原图比例计算高度,避免拉伸变形 const newHeight = initialHeight + (dy * (initialHeight / initialWidth)); // 设置最小尺寸限制,防止图片太小 img.style.width = `${Math.max(100, newWidth)}px`; img.style.height = `${Math.max(75, newHeight)}px`; } // 停止尺寸调整 function stopResize() { isResizing = false; document.body.style.cursor = 'default'; } // 绑定图片拖动的事件监听 container.addEventListener('mousedown', function(e) { if (e.target === img) { startDrag(e); } }); document.addEventListener('mousemove', drag); document.addEventListener('mouseup', stopDrag); // 初始化加载图片 loadImage(); });
关键转换说明
- 文档就绪:用
document.addEventListener('DOMContentLoaded')替代jQuery的$(document).ready(),确保DOM加载完成后再执行代码 - DOM选择:用
getElementById直接获取容器元素,比jQuery选择器更高效 - 事件绑定:全部使用原生
addEventListener,支持多事件绑定且没有兼容性问题(现代浏览器都支持) - 样式操作:直接通过元素的
style属性读写样式,替代jQuery的css()方法 - DOM创建与插入:用
document.createElement创建调整手柄,appendChild插入到容器中
你可以直接把这段代码替换掉原来的jQuery版本,测试一下图片拖动和尺寸调整功能,和原示例完全一致,而且彻底摆脱了jQuery依赖,后续维护起来更省心。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

