<mySearch ⁄>
<mySnippets order="rand" ⁄>
<myContacts ⁄><email ⁄>
<windows live messenger ⁄>
<myCurriculum type="pdf" ⁄>
<myBlog show="last" ⁄>
<myNews show="rand" ⁄>
<myNews type="cat" ⁄>
<myQuote order="random" ⁄>As opiniões fundadas em preconceitos são sempre sustentadas com a agressão
<myPhoto order="random" ⁄>
<myAdSense ⁄>
<myVisitorsMap ⁄>
body{ font-family: Tahoma, Verdana, Arial;font-size: 8pt; color: #000;background: #fff; } #div_main{float: left} #div_loading{} h3{font-family: Consolas, Tahoma, Arial;font-size: 10pt;font-weight: bold;} select, textarea, input{ background-color: #FFFFD4;color: #000000;font-size: 8pt; font-family: Tahoma, Verdana, Arial, sans-serif; border: 1px solid #004080; }
/** * Class Events - possui vários métodos/ propriedades estáticos comuns */ Events = function(){ } /** * Adicionar Event * * Adaptada do seguinte URL * http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html * * @param Object * @param Object * @param Object */ Events.AddEvent = function(obj, type, fn){ if(!obj) return; this.RemoveEvent(obj, type, fn); if (obj.addEventListener) { obj.addEventListener(type, fn, false); } else { if (obj.attachEvent) { obj["e" + type + fn] = fn; obj[type + fn] = function(){ obj["e" + type + fn](window.event); } obj.attachEvent("on" + type, obj[type + fn]); } } } /** * Remover Event * * Adaptada do seguinte URL * http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html * * @param Object * @param Object * @param Object */ Events.RemoveEvent = function(obj, type, fn){ if (obj.removeEventListener) { try{obj.removeEventListener(type, fn, false);} catch(e){} } else{ if (obj.detachEvent) { obj.detachEvent("on" + type, fn); obj[type + fn] = null; obj["e" + type + fn] = null; } } }
/** * Class Misc - possui vários métodos/ propriedades estáticos comuns */ Misc = function(){ } // ficheiro que vai responder aos pedidos Misc.ServerFile = "ajax.php"; /** * Hack IE para ultrapassar problema cache pedidos get * * @param String */ Misc.AntiCacheRand = function(aurl){ var rnd = encodeURI(Math.random()); aurl += (aurl.indexOf("?") >= 0) ? "&foo=" + rnd : "?foo=" + rnd; return aurl; }; /** * Mensagem a mostrar ao utilizador enquanto * a informação estiver a ser carregada * * @param String */ Misc.MsgLoading = function(div_name){ var div = $(div_name); if (div.style.display != "block") { var msg_loading = "A carregar informação ..."; var img = new HTMLControl("loading_animation"); div.innerHTML = img.DoImage("loading.gif", msg_loading, 16, 16); div.style.display = "block"; } else { div.style.display = "none"; } }; /** * Criar request */ Misc.CreateHttpRequest = function(){ if (window.XMLHttpRequest) { // Mozilla, Safari,... http_request = new XMLHttpRequest(); if (http_request.overrideMimeType) { http_request.overrideMimeType('text/html'); } } else if (window.ActiveXObject) { // IE try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { } } } if (!http_request) { alert('Giving up :( Cannot create an XMLHTTP instance'); return false; } return http_request; }; //fim class Misc
/** * Class responsável pela criação de objectos html * * @param String id -> nome do objecto */ function HTMLControl(id){ this.id = id; /** * Método Privado * * Gerar atributos name e id * * @return String */ var _GenerateID = function(){return " name='" + id + "' id='" + id + "' ";}; /** * Método Privado * * Adicionar elemento option à dropdown * * @param String * @param String * */ var _DropdownListAddOption = function(value, description){ $(id).options.add(_DropdownListCreateOption(value, description)); } /** * Criar element option * * @param String * @param String */ var _DropdownListCreateOption = function(value, description){ var ddlOption = document.createElement("option"); ddlOption.value = value; ddlOption.text = description; return ddlOption; } /** * Método Privado * * Limpar itens da dropdown */ var _DropdownListClear = function(){$(id).options.length = 0;} /** * Construir imagem * * @param String src * @param String title * @param int width * @param int height * @return String */ this.DoImage = function(src, title, width, height){ title = " title='" + title + "' alt='" + title + "' "; return "<img src='" + src + "' width='" + width + "' height='" + height + "' " + _GenerateID() + title + " />"; }; /** * Construir dropdown list * * @param Object * */ this.DoDropdownList = function(arrOptions){ var arr = eval(arrOptions); _DropdownListClear(); var ddl = $(this.id); var i, value, description; var count = arr.options.length; for (i = 0; i < count; i++) { value = arr.options[i].value; description = arr.options[i].description; _DropdownListAddOption(value, description); } } }; //fim class HTMLControl /** * Obter um elemento * * nota: para usar este método a class HtmlControl * não precisa de estar instanciada * * @param String */ $ = function(element){return document.getElementById(element);};
/** * Class Ajax */ Ajax = function(){}; Ajax.DivLoadingName="div_loading"; /** * Actualizar dropdown */ Ajax.UpdateDropdownList = function(ddListName,ddSubListName){ Misc.MsgLoading(this.DivLoadingName); //iniciar loading var ddListValue = $(ddListName).value; var url = Misc.AntiCacheRand(Misc.ServerFile + "?accao=get_options&value=" + ddListValue); var http_request = Misc.CreateHttpRequest(); http_request.onreadystatechange = function(){ var state = http_request.readyState; //pedido completo e respondido com sucesso if (state == 4 && http_request.status == 200) { var result = http_request.responseText; var ddSubList = new HTMLControl(ddSubListName); ddSubList.DoDropdownList(eval(result)); //voltar a adicionar o event na dropdown "principal" Events.AddEvent(ddListName, "change", function (){Ajax.UpdateDropdownList(ddListName,ddSubListName);}); Misc.MsgLoading(Ajax.DivLoadingName); //finalizar loading } } http_request.open("GET", url, true); http_request.send(null); }
<?php // ficheiro responsável pela comunicação com a base de dados // e devolve as respostas aos pedidos $accao=$_GET["accao"]; if($accao=="get_options"){ $value=$_GET["value"]; if($value=="japao"){ $result = " ({ \"options\": [ {\"value\": \"\",\"description\": \"(escolha um item)\"}, {\"value\": \"aikido\",\"description\": \"Aikido\"}, {\"value\": \"kendo\",\"description\": \"Kendo\"}, {\"value\": \"sumo\",\"description\": \"Sumo\"}, {\"value\": \"shurikenjutsu\",\"description\": \"Shurikenjutsu\"} ] }); "; } else if($value=="china"){ $result = " ({ \"options\": [ {\"value\": \"\",\"description\": \"(escolha um item)\"}, {\"value\": \"tai_chi_chuan\",\"description\": \"Tai chi chuan\"}, {\"value\": \"shaolin_kung_fu\",\"description\": \"Shaolin kung fu\"}, {\"value\": \"shuai_jiao\",\"description\": \"Shuai Jiao\"}, {\"value\": \"wing_chun\",\"description\": \"Wing Chun\"} ] }); "; } else if($value=="korea"){ $result = " ({ \"options\": [ {\"value\": \"\",\"description\": \"(escolha um item)\"}, {\"value\": \"taekwondo\",\"description\": \"Taekwondo\"}, {\"value\": \"hapkido\",\"description\": \"Hapkido\"}, {\"value\": \"taekyon\",\"description\": \"Taekyon\"}, {\"value\": \"soobak\",\"description\": \"Soobak\"} ] }); "; } else{ $result = " ({ \"options\": [ {\"value\": \"\",\"description\": \"(escolha um pais)\"} ] }); "; } } echo $result; //imprimir/devolver resposta ?>
init = function (){ var arrOptions = { "options": [ {"value": "","description": "(escolha uma opção)"}, {"value": "japao","description": "Japão"}, {"value": "china","description": "China"}, {"value": "korea","description": "Korea"} ] }; var dropdownlist = "ddList"; var dropdown_sublist = "ddSubList"; var ddList = new HTMLControl(dropdownlist); ddList.DoDropdownList(arrOptions); Events.AddEvent($(dropdownlist), "change", function (){Ajax.UpdateDropdownList(this.id,dropdown_sublist);}); } Events.AddEvent(window, "load", init);
<html> <head> <script type="text/javascript" src="Misc.js"></script> <script type="text/javascript" src="HtmlControl.js"></script> <script type="text/javascript" src="Events.js"></script> <script type="text/javascript" src="Ajax.js"></script> <script type="text/javascript" src="Init.js"></script> <link rel="stylesheet" type="text/css" href="style.css" media="all" /> </head> <body> <h3>Escolha um país e saiba algumas das suas artes marciais</h3> <div id="div_main"> País: <select name="ddList" id="ddList"></select> Arte Marcial: <select name="ddSubList" id="ddSubList"> <option>(escolha um país)</option> </select> </div> <div id="div_loading"></div> </body> </html>

