Jump to content

Recommended Posts

Posted

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.

👍

Posted

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

  • 1 month later...
Posted

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"

Posted

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.

Posted

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

Posted

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"

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.