elcsat Posted August 27, 2009 at 05:01 PM Report #284765 Posted August 27, 2009 at 05:01 PM boas, como se faz um sistema de upload em ajax, e que eu desenvolvi um e funciona no google chrome, no safari, no firefox, no ie, e nao funciona na opera cumps 👍
fnds Posted August 27, 2009 at 06:39 PM Report #284776 Posted August 27, 2009 at 06:39 PM Com essa informação toda não é fácil 👍 (Eu nunca tive problemas com AJAX em Opera)
elcsat Posted August 27, 2009 at 10:11 PM Author Report #284812 Posted August 27, 2009 at 10:11 PM function Upload(form,url,elemento_retorno,processa,processa_erro,_erros,funcao){ var elemento_retorno=elemento_retorno; $escreve('__ERROS__',''); var timeout=30; var loading=processa; var callback=function(data){alert(data)}; var $gE, addEvent, removeEvent, periodic, loadAnim, loaded, abortFrame; //small functions var error_prog = []; //errors by programer var new_form, loading_msg, loadpos=0; //the new form that will replace old form AND loading msg var z, old_action, concat, timeload, timecounter=0, iframe, name; var loads = [' ','. ','.. ','...']; //loading animation /*** small functions */ $gE = function(quem){ return document.getElementById(quem) } addEvent = function(obj, evType, fn){ if (obj.addEventListener){ obj.addEventListener(evType, fn, true); } if (obj.attachEvent) { obj.attachEvent("on"+evType, fn); } } removeEvent = function( obj, type, fn ) { if ( obj.detachEvent ) { obj.detachEvent( 'on'+type, fn ); } if ( obj.removeEventListener ) { obj.removeEventListener( type, fn, false ); } } loadAnim = function(){ //get animation of array loads if(loading.indexOf('<img')<0){ // 3 dots just if no image if(loadpos>loads.length - 1){ loadpos = 0; } return loads[loadpos++] + ' '; }else{ return '';} } periodic = function(){ timecounter++ ; if(timecounter/2 > timeout && timeout > 0){ //timeout expired (timeout = 0 is infinite) clearInterval(timeload); //fim do contador abortFrame(name); loaded('timeout'); } loading_msg.innerHTML = loading + ' ' + loadAnim(); } abortFrame = function(o_frame){ //stop iframe var o_frame = typeof(o_frame)=="string" ? $gE(o_frame):o_frame; if(!o_frame){ return false; } try{ o_frame.contentWindow.stop(); //FF e OP }catch(e){ try{ o_frame.contentWindow.document.execCommand('stop');//IE } catch(e){ o_frame.src = ''; /* tenta parar mermo */ } } } cloneEvents = function(source2,target,recursive){ for(var p in source2){ //all params try{if(source2[p].constructor==Function){ target[p] = source2[p] }}catch(e){} } if(recursive){ for(var el=0; el<source2.childNodes.length; el++){ var elem = source2.childNodes[el] var elem_target = target.childNodes[el] if(elem.nodeType==1){ cloneEvents(elem,elem_target); } } } } //testing callback if(typeof(callback)!='function'){ error_prog.push("The 'callback' parameter must be a function") } //testing if 'form' is a html object or a id string form = typeof(form)=="string" ? $gE(form):form; if(form.nodeName.toUpperCase()!='FORM'){ error_prog.push("The first parameter must be a form element ID or a form element reference") } //testing if form have some input file var input_file = false; var infile = form.getElementsByTagName('input') for(z in infile){ if(infile[z].type=='file'){ if(infile[z].value==''){ alert("The input is empty. I cant upload this.") return true; }else{ input_file = infile[z]; } } } if(input_file==false){ error_prog.push("The form must be a input type file") } //exit if programmer errors if(error_prog.length>0) { alert("Error in parameters of micoxUpload:\n\n" + error_prog.join('\n')); /* uncoment this if you want use try-catch-throw throw(error_prog.join('\n')) */ return true; } //random id for multiple calls rand = (m=Math).round( 20 * m.random() ); //adding callback function to global scope //window['micoxCallbackTemp' + rand] = callback //creating the iframe var name = "micox-temp" + rand; iframe = document.createElement("iframe"); iframe.setAttribute("id",name); iframe.setAttribute("name",name); iframe.setAttribute("width","0"); iframe.setAttribute("height","0"); iframe.setAttribute("border","0"); iframe.setAttribute("style","width: 0; height: 0; border: none;"); //add to document form.parentNode.appendChild(iframe); window.frames[name].name = name; //ie sucks //event after load loaded = function(){ //var iframe2 = $gE(name); clearInterval(timeload); //fim do contador //first, removing the event of iframe removeEvent(iframe,'load',loaded) //removind loading msg loading_msg.parentNode.removeChild(loading_msg); //removing old form //form.parentNode.removeChild(form); //calling callback with the return if(arguments[0]!='timeout'){ // if (navigator.userAgent.indexOf('Opera')>=0){ // alert(window.frames[name].document.body.innerHTML); // }else // alert(iframe.contentWindow.document.body.innerHTML); alert(window.frames[name].document.body.innerHTML); alert(window.frames[name].document.body.innerHTML); // alert(window.frames[name].document.contentWindow.document.body.innerHTML); }else{ callback('Timeout expired. ' + timeout + ' secs.'); } //removing old iframe abortFrame(iframe); iframe.src=''; //to stop 'loadind' in FF. bug. iframe.parentNode.removeChild(iframe); delete iframe; } //adding the event addEvent(iframe,'load',loaded) //properties of form to a normal upload form.setAttribute("target",name); form.setAttribute("method","post"); form.setAttribute("enctype","multipart/form-data"); form.setAttribute("encoding","multipart/form-data"); //aditional information if micoxUpload old_action = form.action; if(form.action.indexOf('?')>1){ concat = '&' } else { concat = '?' } form.setAttribute("action",url); //submit form.submit(); //make loading loading_msg = document.createElement('div'); loading_msg.innerHTML = loading; form.parentNode.insertBefore(loading_msg,form); //making new form and hidden old form input_file.value=''; form.reset(); new_form = form.cloneNode(true); cloneEvents(form,new_form,true); new_form.reset(); new_form.action = old_action; form.style.display = 'none'; form.parentNode.insertBefore(new_form,form); //if you want new input file before the 'loading div', use this above (invert the comment) //form.parentNode.insertBefore(new_form,loading_msg); timeload = setInterval(periodic,500); //no submit default return false; } segue ai o codigo obrigado pela resposta. 👍
fnds Posted August 28, 2009 at 02:07 AM Report #284854 Posted August 28, 2009 at 02:07 AM A consola do Opera dá algum erro?
elcsat Posted August 28, 2009 at 09:51 AM Author Report #284873 Posted August 28, 2009 at 09:51 AM nao, se eu meter dois alert na resposta do iframe alert(window.frames[name].document.body.innerHTML); alert(window.frames[name].document.body.innerHTML); como ta em baixo no codigo funciona no opera o primeiro nao da nada o segundo da o conteudo, mas a segunda imagem quando for clicar no upload o javascript ja nao faz nada acabei de ter uma ideia vou testar. cumps
Felipe Graziuso Posted October 13, 2009 at 02:41 PM Report #291522 Posted October 13, 2009 at 02:41 PM Bom dia realmente desenvolvo para web javascript e ajax funcionam 100% apenas no IE e Firefox por exemplo tive grandes problemas ao desenvolver com a biblioteca Dojo para mac
jreis Posted October 13, 2009 at 03:36 PM Report #291533 Posted October 13, 2009 at 03:36 PM Suponho que estejas a usar iFrames, certo? Existe alguma diferença na sua manipulação, experimenta o seguinte (penso esta ser uma abordagem na direcção certa): var _iframe = document.getElementById('id_do_iframe'); var iFrameDoc = (_iframe.contentDocument || _iframe.contentWindow.document); alert(iFrameDoc); Este código devolve o documento html (objecto do tipo DOMDocument, salvo erro) presente no iFrame, permitindo a sua manipulação pelos meios "normais". Funciona em IE7/8 (não testado em IE6, mas não vejo motivos para não funcionar), Opera 9.6x/10.x, Chrome 3.x e Firefox 2.x/3.0.x/3.5.x. "Pensa positivo: tudo pode piorar"
yoda Posted October 13, 2009 at 06:59 PM Report #291568 Posted October 13, 2009 at 06:59 PM Uso um script em jQuery e ajax para uploads que é um mimo : http://valums.com/ajax-upload/ before you post, what have you tried? - http://filipematias.info sense, purpose, direction
elcsat Posted October 14, 2009 at 11:57 AM Author Report #291646 Posted October 14, 2009 at 11:57 AM nao uso jquery, vou tentar essa soluçao...nunca mais olhei para o codigo...mas acho que sei de onde surge o problema..basta limpar a lista de eventos que deve resolver penso eu.
elcsat Posted October 17, 2009 at 06:57 PM Author Report #292113 Posted October 17, 2009 at 06:57 PM continuo sem conseguir fazer o upload no opera de arquivos a partir de javascript e ajax...ja tentei tanta coisa...que nao sei porque nao funciona no opera, ja tentei scripts, ja fiz scripts e no opera 9 nao consigo meter a funcionar...se alguem tiver alguma coisa agradecia que postasse aqui.. bgdo:D
yoda Posted October 18, 2009 at 09:51 PM Report #292253 Posted October 18, 2009 at 09:51 PM Mais uma vez, jQuery resolve 😁 before you post, what have you tried? - http://filipematias.info sense, purpose, direction
jreis Posted October 19, 2009 at 08:13 PM Report #292415 Posted October 19, 2009 at 08:13 PM Se bem me recordo, o evento onload (neste caso dos iframes) pode/irá disparar várias vezes no Opera. E (como seria de esperar...) as vezes poderemos não ter conteúdo nenhum no iframe quando isso acontece. Experimenta remover esta linha (que por sinal não tem ";" no fim, vê lá se isso não tá a dar problemas também..!): ... removeEvent(iframe,'load',loaded); ... e mais abaixo, metes qualquer coisa deste género: //... if(arguments[0]!='timeout') { //buscar DOMDocument do iframe sem usar browser sniffing var _iframe = document.getElementById(name); var iFrameDoc = (_iframe.contentDocument || _iframe.contentWindow.document); //verificar se realmente existe alguma coisa no iframe if (iFrameDoc.body.innerHTML == '') return false; else { alert(iFrameDoc.body.innerHTML); //remover event sobre onload do iframe removeEvent(iframe,'load',loaded); //resto das coisas que isso é suposto fazer //... } } //... O que isto faz basicamente é verificar se o iframe realmente tem alguma coisa, visto que as vezes (pelos menos no Opera) o evento onload pode disparar várias vezes seguidas. Apenas depois de nos certificarmos que existe algum conteúdo é que a função segue a sua vidinha. Só nessa altura também é que removemos o event handler para onload sobre o iframe. Não experimentei, portanto não sei se vai funcionar, depende um pouco do comportamento que essa coisa tem quando a função "loaded" devolve false. Se estivers a usar Opera 9.5 ou superior, verifica o que aparece nas Developer Tools (Tools > Advanced > Developer Tools), é melhor que a Error Console (na verdade aquilo é quase um Firebug, muito bom). "Pensa positivo: tudo pode piorar"
elcsat Posted October 19, 2009 at 09:56 PM Author Report #292443 Posted October 19, 2009 at 09:56 PM obrigado amanha testo e depois digo o resultado... 😁👍😄😛😄
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now