【问题标题】:How to activate Jcrop selection after ajax loadajax加载后如何激活Jcrop选择
【发布时间】:2010-12-16 23:09:57
【问题描述】:

我在我的项目中使用 Jcrop。这个问题并不严重,但如果我能解决它会更好。

我可以通过 ajax 请求(不是 Jquery ajax)上传图像,并且图像可以在上传后加载到页面而无需刷新页面。到现在为止,一切都很好。图像加载到页面后,如果不刷新页面,Jrop 不会变为活动状态。这是 Jcrop 激活器脚本:

    jQuery(window).load(function(){
      jQuery('#cropbox').Jcrop({
        onChange: showPreview,
        onSelect: showPreview,
        aspectRatio: 3/4
      });
    });

我不确定它是否重要,这个脚本不在 $(document).ready(function(){} 中。

我尝试使用 $('#cropbox').load 和 $('#cropbox').click 函数而不是 jQuery(window).load(function(){} 函数来触发 Jcrop,但什么也没发生。

你有什么想法吗?是否可以在通过 ajax 请求将图像加载到页面后立即激活 Jcrop 而无需刷新浏览器?

这是Jcrop的用法:

// Remember to invoke within jQuery(window).load(...)
// If you don't, Jcrop may not initialize properly
$(window).load(function(){
                var imgWidth = $('#cropbox').width();
                var imgHeight = $('#cropbox').height();

                $('#cropbox').Jcrop({

                    onChange: showPreview,
                    onSelect: showPreview,
                    aspectRatio: 3/4,
                    setSelect: [ ((imgWidth/2)-60), 60, ((imgWidth/2)+60), 220 ],
                    addClass: 'custom',
                    bgColor: 'yellow',
                    bgOpacity: .8,
                    sideHandles: false

                });

            });

和图片上传按钮:

<button onclick="ajaxUpload(this.form,'http://www.yemeklog.com/ajax/ajaxupload.php?filename=filename&amp;maxSize=9999999999&amp;maxW=400&amp;fullPath=http://www.yemeklog.com/images/users/160/&amp;relPath=../images/users/160/&amp;colorR=120&amp;colorG=120&amp;colorB=120&amp;maxH=600','upload_area','&lt;img src=\'http://static.yemeklog.com/images/ajax-bar-loader.gif\' width=\'220\' height=\'19\' border=\'0\' /&gt;','&lt;img src=\'images/error.gif\' width=\'16\' height=\'16\' border=\'0\' /&gt; An error occured. Please contact.'); return false;">Upload Image</button>

还有 ajaxupload.js 文件:

function $m(theVar){
    return document.getElementById(theVar)
}
function remove(theVar){
    var theParent = theVar.parentNode;
    theParent.removeChild(theVar);
}
function addEvent(obj, evType, fn){
    if(obj.addEventListener)
        obj.addEventListener(evType, fn, true)
    if(obj.attachEvent)
        obj.attachEvent("on"+evType, fn)
}
function removeEvent(obj, type, fn){
    if(obj.detachEvent){
        obj.detachEvent('on'+type, fn);
    }else{
        obj.removeEventListener(type, fn, false);
    }
}
function isWebKit(){
    return RegExp(" AppleWebKit/").test(navigator.userAgent);
}
function ajaxUpload(form,url_action,id_element,html_show_loading,html_error_http){
    var detectWebKit = isWebKit();
    form = typeof(form)=="string"?$m(form):form;
    var erro="";
    if(form==null || typeof(form)=="undefined"){
        erro += "Hata kodu: 1.\n";
    }else if(form.nodeName.toLowerCase()!="form"){
        erro += "Hata kodu: 2.\n";
    }
    if($m(id_element)==null){
        erro += "Hata kodu: 3.\n";
    }
    if(erro.length>0){
        alert("Yükleme esnasında hata oluştu:\n" + erro);
        return;
    }
    var iframe = document.createElement("iframe");
    iframe.setAttribute("id","ajax-temp");
    iframe.setAttribute("name","ajax-temp");
    iframe.setAttribute("width","0");
    iframe.setAttribute("height","0");
    iframe.setAttribute("border","0");
    iframe.setAttribute("style","width: 0; height: 0; border: none;");
    form.parentNode.appendChild(iframe);
    window.frames['ajax-temp'].name="ajax-temp";
    var doUpload = function(){
        removeEvent($m('ajax-temp'),"load", doUpload);
        var cross = "javascript: ";
        cross += "window.parent.$m('"+id_element+"').innerHTML = document.body.innerHTML; void(0);";
        $m(id_element).innerHTML = html_error_http;
        $m('ajax-temp').src = cross;
        if(detectWebKit){
            remove($m('ajax-temp'));
        }else{
            setTimeout(function(){ remove($m('ajax-temp'))}, 250);
        }
        $('#ajax_image_container').slideDown('slow');
    }
    addEvent($m('ajax-temp'),"load", doUpload);
    form.setAttribute("target","ajax-temp");
    form.setAttribute("action",url_action);
    form.setAttribute("method","post");
    form.setAttribute("enctype","multipart/form-data");
    form.setAttribute("encoding","multipart/form-data");
    if(html_show_loading.length > 0){
        $m(id_element).innerHTML = html_show_loading;
    }
    form.submit();
}

【问题讨论】:

    标签: jquery ajax jcrop


    【解决方案1】:

    在获取ajax请求后,您可以在图像上调用jcrop。

    $.ajax({
      url: 'ajax/test.html',
      success: function(data) {
        var $myImage = $("<img></img>", {
            src: data.img,    
          }).appendTo('#cropbox');
        $myImage.Jcrop({
          onChange: showPreview,
          onSelect: showPreview,
          aspectRatio: 3/4
        });
      }
    });
    

    【讨论】:

    • 感谢您的帮助,但我没听懂您所说的。我应该用我的脚本替换它还是什么?我的 ajax 请求是不是 Jquery ajax 请求。我应该使用什么网址?
    • 对不起,我没有解释更多。不,你不需要使用我的脚本。我只是想展示一种可能的方法。我认为您应该做的是在页面上加载图像后在图像上调用 jcrop 。您在问题中的脚本不起作用,因为当页面在浏览器中加载时窗口加载事件已经过去。干杯!
    • 哦,我明白了。谢谢您的回复。我仍然无能为力:) 如果可以的话,我想我应该尝试将 ajax 脚本转换为 Jquery ajax。我希望我能...
    【解决方案2】:

    您可以为此发布您的 ajax 脚本吗?您应该可以在代码之后执行 jcrop 将图像放入#cropbox

    【讨论】:

    • 感谢您的关注。我刚刚用所有使用过的脚本编辑了帖子。我尝试在 ajaxupload.js 中初始化 Jcrop,但它也不起作用。
    • 你在哪里初始化的?我可能误解了你的代码,但我认为它应该放在 doUpload() 的最后一行或倒数第二行。
    • 我在 doUpload() 的末尾添加了它,但没有工作。 $('#ajax_image_container').slideDown('slow');这也在最后一行正常工作。我认为问题更深,我不再为它而战。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多