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

Jos*_*ndo 16 javascript jquery jcrop

我有一个非常简单的问题,但我对导致问题的原因一无所知.在我的一个应用程序中,我使用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
Run Code Online (Sandbox Code Playgroud)

在大约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)
});
Run Code Online (Sandbox Code Playgroud)

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

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

制作div <div id="cropper-box"></div>并使用jQuery('#cropper-box').append('<img src="" id="cropbox" />');然后设置值.我尝试了同样的事情,但是将图像src设置为1步而不是之后.

我试图在页面上放置一个占位符,<img src="placeholder.png" id="cropbox" />并在单击按钮时更改源.这是有效的,但是cropperarea保持图像的大小(300x180px或其他东西)并且不会变得更大.

//编辑:

尝试更多的东西向我展示了图像源正在被正确替换(!使用Firefox来显示所选文本的来源),我仔细检查了URL,但这是一个正确的URL和一个工作图像.

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

//编辑2:

所以我已经为第一次和第二次尝试获取同一图像的来源.正如在第一次尝试之前所述,图像将无法正确加载,第二次尝试它(仅当第二次尝试是相同的图像(!!)时).

所选页面源显示1个区别,即首先尝试:

<img style="position: absolute; width: 0px; height: 0px;" src="http://95.142.175.17/uploads/files/Desert.jpg">
Run Code Online (Sandbox Code Playgroud)

第二次尝试:

<img style="position: absolute; width: 700px; height: 525px;" src="http://95.142.175.17/uploads/files/Desert.jpg">
Run Code Online (Sandbox Code Playgroud)

我猜这是被jCrop取代的图像,但它是一个完整的谜语,为什么它在第一次放置0高度/宽度,第二次放置适当的尺寸.

Jos*_*ndo 10

好的伙计们,以防其他人遇到这个问题:

如果加载图像并对其应用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;" />
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,cropbox图像和cropper-loading 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>
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我一直在使用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);
});
Run Code Online (Sandbox Code Playgroud)

首先,我防止链接也像往常一样(或按钮动作),然后显示加载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)
Run Code Online (Sandbox Code Playgroud)

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

希望它能在未来帮助任何人!

干杯和感谢@vector和其他人的想法;-)

  • 谢谢@pendo.有同样的问题,你的回答让我走上了正确的道路.我让我的工作略有不同,但总体思路相同.您还可以在使用.load()jquery函数完成图像加载后填充init函数.$("image_cropper").attr("src",YOURSOURCE).load(function(){do_crop_init_here}); 您正在强制加载图像,并在完成后附加要触发的功能.希望这可能对人们有所帮助. (6认同)
  • 谢谢,有一天可能派上用场了.使用jCrop的信息有时可能有点稀疏:-) (2认同)