• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

elcsat

javscript no opera

13 mensagens neste tópico

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

:thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Com essa informação toda não é fácil :thumbsup:

(Eu nunca tive problemas com AJAX em Opera)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites


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.

:thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora