jCrop (jQuery) 有时无法加载图像/裁剪区域

2024-01-26

我有一个非常简单的问题,但我对导致问题的原因一无所知。在我的一个应用程序中,我使用 jCrop 作为一个小插件来裁剪图像以适合横幅/标题等。将采取以下步骤:

1) Select an image (using CKFinder for this, CKFinder returns the image path to an input field)
2) Click a button to load the image
3) Crop the image
4) Save the image

在大约 75% 的情况下,一切都按计划进行,但在另外 25% 的情况下,jCrop 无法加载裁剪区域并将其留空。这是我正在使用的 jQuery 代码:

jQuery('#selectimg').live('click', function(e) { 
  e.preventDefault();
  var newsrc = jQuery('#img2').val();
  jQuery('#cropbox').attr('src', newsrc);
  var jcrop_api = jQuery.Jcrop('#cropbox', {
    boxWidth: 700, 
    boxHeight: 700,
    onSelect: updateCoords,
    onChange: updateCoords
  });
  //Some other JS code come's here for buttons (they work all the time)
});

我注意到,当我离开 #cropbox 在可裁剪区域中进行转换的部分时,图像加载得很好,所以错误在于var = jcrop_api部分,但我慢慢开始认为这个问题没有解决方案......

这是我到目前为止所尝试过的:

制作一个div<div id="cropper-box"></div>并使用jQuery('#cropper-box').append('<img src="" id="cropbox" />');然后设置该值。我尝试了同样的操作,但在一步中而不是之后设置图像 src。

我尝试在页面上放置一个占位符<img src="placeholder.png" id="cropbox" />并在单击按钮后更改源。这是可行的,但cropperarea保持图像的大小(300x180px或其他)并且不会像它应该的那样变大。

// Edit:

尝试更多后,我发现图像源已被正确替换(!使用 Firefox 显示所选文本的源),我仔细检查了 URL,但这是一个正确的 URL 和工作图像。

在裁剪器应该所在的位置,有一个大约 10x10 像素的白点,其中弹出裁剪器图标(加号)。但如前所述:图像未显示。

// 编辑2:

因此,我获取了同一图像的第一次和第二次尝试的来源。正如第一次尝试之前所说,图像无法正确加载,而第二次尝试可以正确加载(仅当第二次尝试是同一个图像时(!!))。

所选页面源显示 1 个差异,首先尝试:

<img style="position: absolute; width: 0px; height: 0px;" src="http://95.142.175.17/uploads/files/Desert.jpg">

第二次尝试:

<img style="position: absolute; width: 700px; height: 525px;" src="http://95.142.175.17/uploads/files/Desert.jpg">

我猜这是被 jCrop 替换的图像,但这完全是一个谜,为什么它第一次将 0 高度/宽度放入其中,第二次将适当的尺寸放入其中。


好的,如果其他人遇到这个问题:

如果加载图像和对其应用 jCrop 的操作排队得太快,那么 jCrop 就会变得混乱。我仍然觉得很奇怪,第二次尝试效果完美,但我认为这与页面 DOM 或其他东西识别的缓存图像尺寸有关。

我想出的解决方案是创建一个函数,将 #cropbox 转换为 jCrop 区域,然后设置 2 秒的间隔,只是为了给 jCrop 一些时间来识别图像及其尺寸,然后转换元素。

这是我使用的 html 部分(带有预加载器):

<div id="cropper-loading" style="display: none;"><img src="images/analytics/ajax-loader.gif" /></div>
<img id="cropbox" src="images/placeholder.png" style="display: none;" />

正如您所看到的,裁剪框图像和裁剪器加载 div 都被隐藏,因为它们不是立即需要的。如果你愿意的话,你可以显示占位符。然后使用这个 HTML 表单:

<input name="image2" id="img2" type="text" readonly="readonly" onclick="openKCFinder(this)" value="click here to select an image" style="width: 285px;" />  <button class="button button-blue" type="submit" name="load" id="selectimg">Load Image in cropper</button>

就我而言,我一直在使用 KCFinder 来加载图像(它是 CKEditor 的一部分,确实值得关注!),KCFinder 处理上传、重命名等,选择它后将所选图像路径(相对/绝对可配置)返回到输入字段。

然后,当单击 #selectimg 时,将调用此代码:

jQuery('#selectimg').click(function(e) { 
    e.preventDefault();
    jQuery('#cropper-loading').css('display', 'block');

    var newsrc = jQuery('#img2').val();

    jQuery('#cropbox').attr('src', newsrc);
    jQuery('#img').val(newsrc);

    function createJcropArea() {
        jQuery('#cropper-loading').css('display', 'none');                                      
        jQuery('#cropbox').css('display', 'block');
        var jcrop_api = jQuery.Jcrop('#cropbox', {
            boxWidth: 700, 
            boxHeight: 700,
            onSelect: updateCoords,
            onChange: updateCoords
        });
        clearInterval(interval);
    }
    var interval = setInterval(createJcropArea, 2000);
});

首先,我阻止像平常一样跟踪链接(或按钮操作),然后显示加载 div(这就是我隐藏占位符图像的原因,否则它看起来会很混乱)。

然后图像位置从输入字段加载并复制到另一个字段(#img)中,该字段用于随后处理图像(PHP 使用#img 的值来加载该图像)。同时 #cropbox src 也被设置为新图像。

这是解决我的问题的部分:

我没有直接激活 jCrop,而是创建了一个函数:

1) hides the loading icon
2) displays the image
3) converts #cropbox into a jCrop area
4) clean the interval (otherwise it would loop un-ending)

在这个函数之后你可以看到,为了保存,我在 jCrop 区域转换之前延迟了 2 秒。

希望它对未来的任何人都有帮助!

干杯并感谢@vector 和其他人的思考;-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jCrop (jQuery) 有时无法加载图像/裁剪区域 的相关文章

  • 如何在没有数据库的情况下创建AJAX分页?

    是否可以在没有 MySQL 帮助的情况下获取 AJAX 分页页面 难道我不能只添加一个包含我需要显示的文本和标记的 PHP 文件 然后通过单击页码将该内容提供给用户吗 那么可以用纯 jQuery 和 PHP 来实现吗 您会使用什么代码方法来
  • 可拖动的非模态弹出窗口 Jquery Mobile

    我希望在 Jquery mobile 中有一个弹出窗口 它不会阻止用户与页面交互 并且 data dismissible false 即当页面的另一部分与页面的另一部分交互并保持可见时 弹出窗口不会消失 我已经尝试过这个 popupNew
  • 如何在 Angular2 中为表单分配和验证数组

    我的模型 this profile 在 javascript 中有一个属性叫做emails 这是一个数组 email isDefault status 然后我将其定义如下 this profileForm this formBuilder
  • 如何在正则表达式中区分数字和ip地址?

    例如 如果我们查看 5 56 和 183 55 0 144 基本上 当你做这样的事情时 d d 它匹配 5 56 189 55 和 0 144 有没有办法通过正则表达式仅匹配数字而不匹配 ip 地址的部分 我尝试使用前瞻 但我不知道它应该是
  • 如何使用 Eclipse 作为 Javascript IDE?

    我从官方下载页面下载了 eclipse Javascript IDE 但是 当我启动应用程序时 它显示 必须提供 Java 运行时环境或 Java 开发工具包才能运行 eclipse 我已经有一个运行良好的 eclipse 的 java I
  • Java:从 ScriptEngine javascript 返回一个对象

    我正在尝试使用 Java 来评估 javascript脚本引擎 https docs oracle com javase 7 docs api javax script ScriptEngine html班级 这是我正在尝试做的事情的一个简
  • Puppeteer 无法在 VPS (DigitalOcean) 上工作

    我在水滴中数字海洋 https www digitalocean com 我收到这个错误 node 5549 UnhandledPromiseRejectionWarning TimeoutError Navigation Timeout
  • JavaScript - 类根据条件扩展

    事情是这样的 我有一个名为 A 的主课 我希望这个班级能够扩展 B 级 class A extends B 但事实上 我希望 B 类在特定条件下扩展 C D 或 E class B extends B1 or class B extends
  • 如何比较两个对象数组并更改两个数组中找到的对象的值?

    假设我有两个对象数组 let array1 id 1 name snow id 4 name jo id 8 name bran id 12 name gondo id 13 name peter
  • 在 jQuery 中生成下拉菜单的年份

    我想到了一个小问题 我正在尝试想出一种方法来解决它 基本上 我想要做的是将年份减去 18 年 即 2011 年返回 1993 年 并生成一个下拉选项 供用户选择在此之前的任何年份 基本上他们必须证明自己已超过法定年龄 18 岁 var mi
  • 在流星收集加载时显示加载程序

    我有一个模板 task list 看起来像这样 each tasks gt task each Template task list tasks返回一个集合 在用户界面中 加载似乎需要一些时间 当集合正在加载时 我想显示一个加载指示器 关于
  • 如何在 Web 应用程序中使用 Javascript 安全地访问 Windows Azure 移动服务?

    我需要一本 web javascript 安全入门书 根据如何使用 Windows Azure 移动服务的 HTML JavaScript 客户端 http www windowsazure com en us develop mobile
  • 有没有办法显示嵌套在 Grid 组件内的 Material-UI 抽屉?

    我正在使用 Material UI 创建一个 Web 应用程序 主页分为 3 个网格 每个网格有一个height of 500px 我想在中间网格内显示一个带有一些操作选项的抽屉 那可能吗 到目前为止 我只能在整个屏幕上显示它 这是我的主要
  • 谷歌浏览器不显示一个网站的alert()弹出窗口

    我正在开发一个 javascript 循环 该循环会随着循环的进行而提醒每个键值 为了加快速度 我选中了 阻止此页面创建其他对话框 框 通常这只会抑制一个例程的弹出窗口 但它们还没有回来 在 Google Chrome 中 alert 消息
  • 关于 Node.js Promise then 和 return?

    我对承诺感到困惑 I use 那么就答应没有返回像这样 new Promise resolve reject gt resolve 1 then v1 gt console log v1 new Promise resolve reject
  • angularjs 将 ngModel 从包装器指令传递到包装器指令

    我是 Angular 的新手 但仍然痛苦地纠结于自定义指令 我想重用这段 HTML
  • 使用 JQuery getJSON 方法

    我正在尝试使用 JQuery getJSON 函数解析 JSON 数据 REST 查询是 http query yahooapis com v1 public yql q select 20woeid 20from 20geo places
  • jquery ajax“发布”调用

    我是 jQuery 和 Ajax 的新手 并且在 发布 方面遇到问题 我正在使用 jQuery Ajax post 调用将数据保存到数据库 当我尝试保存数据时 它将 null 传递给我的 C 方法 jQuery 看起来像这样 functio
  • 限制在三角形内

    我正在寻找一段通用代码 javascript 它可以与 jquery UI 一起使用来限制三角形内 div 的移动 拖动 与此类似 http stackoverflow com questions 8515900 how to constr
  • 具有值的 TextInput 不会更改值

    在我的react native应用程序中 我有一个API 我从中检索数据 并且我在输入值中设置数据 用户应该能够编辑这些输入并更新 但是当我尝试输入输入时它不会输入任何内容并且值保持原样 这是 TextInput 代码

随机推荐

  • Minecraft 如何进行光照? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我唯一熟悉的模型是漫射照明 但这看起来比那要复杂得多 每个方块的亮度级别从 15 到 0 每个级别都比其上方的级别低 20 如果一个正
  • 如何将摘要输出转换为数据框?

    我总结了由 ID 组成的数据框 称为 DATA 的一列 以便获得给定列中每个 ID 的总数 我想将其转换为另一个数据框 称为 TOTALNUM 所以我有两列 第一列是 ID 本身 第二列是每个 ID 的总数 这可能吗 样本数据 ids lt
  • 在 iOS 上将立体声音频拆分为单声道流

    如果已回答此问题 我们深表歉意 我看到了很多问题 但没有好的答案 我正在尝试将立体声音乐从 iPod 库导出到两个单声道 caf 文件 我怎样才能在 iOS 上做到这一点 我目前正在使用 Objective C Thanks 更新 我已经成
  • 如何在 Flutter 中使屏幕可滚动?

    在我的 Flutter 项目中 在一页中我有一些行 包括垂直对齐的卡片 现在 我希望这个屏幕可以滚动 我尝试将该列替换为Listview但没有成功 我也尝试用它包裹它单子滚动视图但没有用 它显示如下图所示 这是代码 HomeFragment
  • 将 Moq 模拟对象传递给构造函数

    我已经使用 RhinoMocks 有一段时间了 但刚刚开始研究起订量 我有一个非常基本的问题 令我惊讶的是 这并没有立即可用 假设我有以下类定义 public class Foo private IBar bar public Foo IB
  • 如何在.NET 中从经过身份验证的 Twitter oauth_token 注册/登录解析用户?

    我用过OAuth1验证器 https github com xamarin Xamarin Auth blob master src Xamarin Auth OAuth1Authenticator cs L83类来自Xamarin Aut
  • 如何在身份服务器4中获取客户端的远程IP地址

    上下文变量 ResourceOwnerPasswordValidationContext 中是否有一个属性 可让我访问发送初始身份验证请求的客户端的 IP 地址 在该上下文中没有类似的信息可供您获取 你唯一的选择就是注射IHttpConte
  • 活动未发现异常?

    我正在得到一个ActivityNotFoundException在下面的代码中 主程序 java Intent intent new Intent intent setAction com test app TEST startActivi
  • 调试调试和发布版本之间差异的最佳实践和工具?

    我见过一些帖子讨论了调试和发布版本之间可能导致差异的原因 但我认为没有人从开发的角度解决了解决问题的最有效方法是什么 当发布版本中出现错误但调试版本中没有出现错误时 我做的第一件事是通过 valgrind 运行我的程序 希望得到更好的分析
  • 从 PHP 数组中删除 NULL、FALSE 和 ''(但不包括 0)

    我想删除NULL FALSE and 价值观 I used array filter但它删除了0的也 有什么功能可以实现我想要的功能吗 array NULL FALSE 0 1 gt array 0 1 array filter http
  • 如何使用源队列并将其返回给调用者而不具体化它?

    我正在尝试使用新的 Akka 流 想知道如何使用源队列并将其返回给调用者 而不在我的代码中实现它 想象一下 我们有一个库可以进行多次异步调用并通过以下方式返回结果Source 函数看起来像这样 def findArticlesByTitle
  • Java运行命令行包含空格

    我正在尝试从我的 Java 应用程序运行 bat 文件 我已经尝试了所有能找到的方法 但似乎都不起作用 问题是 bat 文件的路径包含空格 我在用着this http viralpatel net blogs how to execute
  • 什么是神奇数字?为什么有些人认为它们不好?

    什么是神奇数字 为什么许多程序员建议避免使用它们 幻数是在代码中直接使用数字 例如 如果您有 在 Java 中 public class Foo public void setPassword String password don t d
  • 自运行服务中的 Toast

    我有一个运行远程服务然后退出的 Android 活动 服务本身轮询设备节点并检查更改 我想用 toast 来提醒用户 但我没能让它工作 Toast 没有显示 过了一会儿 Android 喊道我的应用程序没有响应 顺便说一句 我不想 再次启动
  • 将 Otto 与保留的 Fragment 一起使用时出现 IllegalArgumentException

    我在用奥托1 3 3 http square github io otto 当我恢复我的申请时 有时我会得到一个IllegalArgumentException具有以下堆栈跟踪 Caused by java lang IllegalArgu
  • PowerShell 路径中的转义美元符号不起作用

    为什么这不起作用 drvrInstFilePath sharePath imageName ISO OEM 1 RPKTools RPKDriverInst bat echo drvrInstFilePath drvrInstContent
  • 在 Python 中处理 UTF-8 数字

    假设我正在读取一个包含 3 个逗号分隔数字的文件 该文件是用未知编码保存的 到目前为止我正在处理 ANSI 和 UTF 8 如果文件采用 UTF 8 格式且有 1 行值为 115 113 12 则 with open file as f a
  • 如何在 VIM 中递归使用 Global?

    g 2 g 3 中是否有问题 或者全局中的递归是否丢失 我无法理解错误的原因 E147 无法执行 全局递归 如何在 VIM 中进行递归全局搜索 尼尔对操作员的初步建议 g 1 2 2 1 缺点是组合会扩展为 n 个数字 对于三个数字 组合数
  • 收到“连接超时”和“操作系统错误”错误

    Launching lib main dart on Gorgeo 4GL in debug mode lib main dart 1 Built build app outputs flutter apk app debug apk V
  • jCrop (jQuery) 有时无法加载图像/裁剪区域

    我有一个非常简单的问题 但我对导致问题的原因一无所知 在我的一个应用程序中 我使用 jCrop 作为一个小插件来裁剪图像以适合横幅 标题等 将采取以下步骤 1 Select an image using CKFinder for this