<pedrocorreia.net ⁄>
corner
<mySearch ⁄> <mySearch ⁄>

corner
 
corner
<mySnippets order="rand" ⁄> <mySnippets order="rand" ⁄>

corner
 
corner
<myContacts ⁄> <myContacts ⁄>

<email ⁄>


pc@pedrocorreia.net

<windows live messenger ⁄>


pedrojacorreia@hotmail.com

<myCurriculum type="pdf" ⁄>


Download
corner
 
corner
<myBlog show="last" ⁄> <myBlog show="last" ⁄>

corner
 
corner
<myNews show="rand" ⁄> <myNews show="rand" ⁄>

corner
 
corner
<myNews type="cat" ⁄> <myNews type="cat" ⁄>

corner
 
corner
<myQuote order="random" ⁄> <myQuote order="random" ⁄>

corner
 
corner
<myPhoto order="random" ⁄> <myPhoto order="random" ⁄>

<pedrocorreia.net ⁄>
corner
 
corner
<myAdSense ⁄> <myAdSense ⁄>

corner
 
corner
<myVisitorsMap ⁄> <myVisitorsMap ⁄>

corner
 
 

<Argumentos Opcionais e Exceptions em Javascript ⁄ >




clicks: 13062 13062 2008-04-05 2008-04-05 goto mySnippets mySnippets javascript  Download  Bookmark This Bookmark This



Em Javascript também é possivel recorrer a argumentos opcionais, porém não será exactamente igual a por ex. no PHP. No PHP podemos usar parametros opcionais de duas maneiras, ou na assinatura da função atribuir logo o valor, ou então podemos recorrer ao func_get_args. Aqui iremos ter uma abordagem semelhante ao func_get_args.


O javascript tem um objecto chamado arguments no qual ficam armazenados todos os valores passados para a função e é nesse objecto que vamos obter os valores opcionais. Porém existirá uma pequena nuance na assinatura da função.



Por ex. no PHP podemos declarar assim a função: my_function(arg1,$arg2="",$arg3="",$arg4="") e o $arg2, $arg3, $arg4 serão opcionais visto que ficam logo com um valor atribuido, em Javascript tal não é possivel pois vai originar um erro de sintaxe. Podemos fazer isto em Javascript my_function(arg1,$arg2,$arg3,$arg4) e não atribuir valores a todos os argumentos, porém se depois quisermos aceder a esses valores irá dar erro, undefined, teremos sempre que fazer uma verificação para ver se o valor realmente existe ou não.



Como o objecto arguments armazena todos os valores, nem era precisa ter qualquer parametro na assinatura da função, mas tal iria gerar confusão para quem a fosse usar, pois não iria saber qual a ordem dos argumentos, para ultrapassar isso, vamos usar o /** comment */, isto é, os argumentos supostamente opcionais vamos colocá-los como comentário, por ex:


my_function(arg1/*, $arg2*/ /*,$arg3*/ /*,$arg4*/)




Estes argumentos opcionais poderão por ex. dar jeito se tentarmos implementar um getter/ setter, se passarmos um valor para a função é porque queremos atribuir um valor, caso contrário, a função devolve o valor esperado.





A 2ª parte do snippet vai ser baseado nas Exceptions, quem programa em OOP de certeza que já usou. Vamos criar o nosso próprio sistema de excepções.



Basicamente o que este snippet vai fazer é preencher os valores de determinados objectos html.



MyJSException.js, class responsável pelas Exceptions, esta class vai fazer um overload ao toString():
  1. /**
  2. * @author pedrocorreia.net
  3. */
  4.  
  5. /**
  6. * Class responsável pelas Exceptions
  7. *
  8. * @param String - Mensagem de erro a mostrar
  9. * @param Optional String - Nome da Exception
  10. * @param Optional String - ID
  11. */
  12. MyJSException = function (msg /*, name*/ /*, id */){
  13. var _msg=msg;
  14. var _name="";
  15. var _id="";
  16.  
  17. if(arguments[1]){ _name=arguments[1]; }
  18. if(arguments[2]){ _id=arguments[2]; }
  19.  
  20. /**
  21. * Devolver a Descrição da Exception
  22. * @return String
  23. */
  24. this.Message = function(){return _msg;}
  25.  
  26. /**
  27. * Devolver o Nome da Exception
  28. * @return String
  29. */
  30. this.Name = function () {return _name; }
  31.  
  32. /**
  33. * Overload. Gerar mensagem de erro, com descrição completa da Exception
  34. *
  35. * @return String
  36. */
  37. this.toString = function(){
  38. var str="";
  39. str="Exception Details:\n";
  40. if(_name) str+="\nName=\""+_name+"\"";
  41. if(_msg) str+="\nMessage=\""+_msg+"\"";
  42. if(_id) str+="\nID=\""+_id+"\"";
  43.  
  44. return str;
  45. }
  46. }





DOM.js, será o responsável por interagir com o DOM, se por ex. fornecermos um campo que não exista será gerada uma excepção do tipo MyJSException:
  1. /**
  2. * @author pedrocorreia.net
  3. */
  4.  
  5. /**
  6. * Class que vai interagir com o DOM
  7. */
  8. DOM = function(){}
  9.  
  10. /**
  11. * Obter ou atribuir valores a um objecto html
  12. *
  13. * @param String - ID do objecto Html
  14. * @param Optional String - Valor a atribuir ao objecto Html
  15. */
  16. $ = function(id /*,value*/){
  17.  
  18. //só implementei o suporte para o getElementByID :)
  19. if(!document.getElementById)
  20. throw new MyJSException("getElementById não suportado neste browser","getElementByIdNotSupported", id);
  21.  
  22. if(!id) throw new MyJSException("Nao foi especificado o ID do objecto","ExMissingID", id);
  23.  
  24. var _ref=document.getElementById(id);
  25. if(!_ref) throw new MyJSException("Objecto em falta ou ID inválido","ExInvalidIDReferenceOrFieldMissing", id);
  26.  
  27. //existe um 2º argumento, vamos atribuir o valor
  28. //nota: só alguns objectos html estão suportados!
  29. if(arguments[1]){
  30. var value=arguments[1];
  31. var tag=_ref.tagName.toLowerCase();
  32.  
  33. //campos input e textarea (checkbox e radiobutton não está implementado)
  34. if(tag=="input" || tag=="textarea") {
  35. var is_checkbox=(_ref.getAttribute("type")=="checkbox");
  36. var is_radio=(_ref.getAttribute("type")=="radio");
  37.  
  38. if(!is_checkbox && !is_radio){_ref.value=value;}
  39. else {throw new MyJSException("RadioButton e Checkbox não implementados","ExRadioCheckBoxNotImpl")}
  40. }
  41.  
  42. //span e div
  43. else if(tag=="span" || tag=="div") _ref.innerHTML=value;
  44.  
  45. //dropdown
  46. else if(tag=="select") {
  47. var count=_ref.length;
  48. //percorrer dropdown e selecionar item respectivo
  49. for(var i=0;i<count;i++){
  50. //procuramos pelo value e pelo text
  51. if (_ref.options[i].value==value || _ref.options[i].text==value){
  52. _ref.options[i].selected=true; break;
  53. }
  54. }
  55. }
  56. }
  57.  
  58. //c.c, retornamos a referência para o objecto
  59. else{return _ref;}
  60. }





Ficheiro html de teste:
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. <title>Javascript - Optional Arguments e Exceptions</title>
  5. <script type="text/javascript" src="DOM.js" ></script>
  6. <script type="text/javascript" src="MyJSException.js" ></script>
  7. <script type="text/javascript" src="JSTesting.js" ></script>
  8. </head>
  9. <body>
  10. <div id="my_div"></div><br>
  11.  
  12. <span id="my_span"></span><br>
  13.  
  14. <input type="text" id="my_textbox" size="20" ><br>
  15.  
  16. <textarea id="my_textarea" rows="3" cols="10"></textarea><br>
  17.  
  18. <select id="my_dropdown">
  19. <optgroup label='Escolha uma Opção'>
  20. <option value="1" selected="selected">Opção 1</option>
  21. <option value="2">Opção 2</option>
  22. <option value="3">Opção 3</option>
  23. </optgroup>
  24. </select><br>
  25.  
  26. <select id="my_dropdown2">
  27. <optgroup label='Escolha outra Opção'>
  28. <option value="4" selected="selected">Opção 4</option>
  29. <option value="5">Opção 5</option>
  30. <option value="6">Opção 6</option>
  31. </optgroup>
  32. </select><br>
  33.  
  34. <br><br>
  35. <input type="button" onclick="JSTesting();" value="Preencher Valores">
  36. </body>
  37. </html>








JSTesting.js, o script em funcionamento:
  1. /**
  2. * @author pedrocorreia.net
  3. */
  4.  
  5.  
  6. JSTesting = function(){
  7.  
  8. try{
  9. $("my_div","Preencher Div");
  10. }
  11. catch (e){
  12. alert(e.toString());
  13. }
  14.  
  15. try{
  16. $("my_span","Preencher Span");
  17. }
  18. catch (e){
  19. alert(e.toString());
  20. }
  21.  
  22. try{
  23. $("my_textbox","Preencher Textbox");
  24. }
  25. catch (e){
  26. alert(e.toString());
  27. }
  28.  
  29. try{
  30. $("my_textarea","Preencher Textarea");
  31. }
  32. catch (e){
  33. alert(e.toString());
  34. }
  35.  
  36. try{
  37. $("my_dropdown",2);
  38. }
  39. catch (e){
  40. alert(e.toString());
  41. }
  42. try{
  43. $("my_dropdown2","Opção 5");
  44. }
  45. catch (e){
  46. alert(e.toString());
  47. }
  48. }




O formulário de inicio terá este aspecto:


Depois de pressionado o botão respectivo ficará desta maneira:



Se por ex. fornecermos um id inválido, será gerada uma excepção
try{
  $("my_div_error","Preencher Div");
}
catch (e){
  alert(e.toString());
}


Este objecto ("my_div_error") não se encontra definido no html, logo será gerada esta Exception:




Qualquer erro/ dúvida é só dizer!









clicks: 13062 13062 2008-04-05 2008-04-05 goto mySnippets mySnippets javascript  Download  Bookmark This Bookmark This