Формируя набор методов для шаблона MVC


Я ищу какие-либо отзывы на этот код. Если это слишком много, Пожалуйста, выберите случайный способ/группы и дать мне обратную связь.

Этот код проходит www.jshint.com. Я пытаюсь сформировать эту коллекцию в библиотеку. Регулярные выражения есть куда идти. Любые дополнительные конструктивные отзывы приветствуются. Только вернулся объекты доступны за пределами файла. Они будут в API позже.

var some_name = (function (global) {

/********************

Structure:

- pragmas 
- constants/etc.
- one
- check
- ajax
- interface
- initialize
- api

********************/

/********************
group: pragmas 
notes: 
********************/

"use strict";

/********************
group: constants/etc.
notes: 
********************/

var constant = 
  {
  enter_key: 13,
  second : 1000,
  minute: 60,
  hour: 3600,
  day: 43200,
  terminate: 0
  };

var aml_message = 
  {
  "pass":0, 
  "fail":1, 
  "undefined_user":2
  };

/********************
group: one
notes: 
********************/

var one = 
  {
  fill_id: function(html_id, html_text)
    {
    return (document.getElementById(html_id).innerHTML=html_text);
    },
  set_onclick: function(html_id,method_call)
    {
    return (document.getElementById(html_id).onclick=method_call);
    },
  set_onkeypress: function(html_id,method_call)
    {
    return (document.getElementById(html_id).onkeypress=method_call);
    },
  reload: function()
    {
    window.location.href=window.location.host.match(/localhost|127.0.0.1/) ? 'http://127.0.0.1' : 'http://www.archemarks.com';
    }
 };

/********************
group: check
notes:
********************/

/* separeate the view from the model here

var check = {
  patterns : {
    name: /^[a-zA-Z-\s]{1,20}$/,
    email: /^[a-zA-Z0-9._(-)]+@[a-zA-Z0-9.(-)]+\.[a-zA-Z]{1,4}$/,
    pass: /.{6,40}/,
    url:  /^[(-)\w&:\/\.=\?,#+]{1,}$/,
    aml:  /<(.+)_([a-z]){1}>$/
    },
  generic: function(reg_ex,text)
    {
    return (reg_ex.exec(text.value)) ? 0 : 1;
    },
  empty: function(text_array) 
    {
    for(var a=0;a<text_array.length;a++)
      {
      if(text_array[a].value==='')
        {
        return 0;
        }
      }
    return 1;
    },
  same: function(text1,text2)
    {
    return ((text1.value)!==(text2.value)) ? 1 : 0;
    },
  aml: function(regex, text)
    {
    var aml_response=regex.exec(text);
    if(aml_response)
      {
      if(aml_response[2]==='p') 
        {
        return aml_message.pass;
        } 
      else if (aml_response[2]==='f')
        {
        return aml_message.fail; 
        }
      }
    else
      {
      return aml_message.undefined_user; 
      }
    }
  };
*/

/*prototype only, not for production - will sub real values in later*/

var patterns = 
  {
  name: /^[a-zA-Z-\s]{1,20}$/,
  email: /^[a-zA-Z0-9._(-)]+@[a-zA-Z0-9.(-)]+\.[a-zA-Z]{1,4}$/,
  pass: /.{6,40}/,
  url:  /^[(-)\w&:\/\.=\?,#+]{1,}$/,
  aml:  /<(.+)_([a-z]){1}>$/
  };

function check_generic(reg_ex_in,text,html_id,response)
  {
  if(!reg_ex_in.exec(text.value))
    {
    one.fill_id(html_id,response);
    return 0;
    }
  return 1;
  }

function check_empty(text,html_id,response) 
  {
  for(var a=0;a<text.length;a++)
    {
    if(text[a].value==='')
      {
      one.fill_id(html_id,response);
      return 0;
      }
    }
  return 1;
  }

function check_same(text1,text2,html_id,response)
  {
  if((text1.value)!==(text2.value))
    {
    one.fill_id(html_id,response);return 0;
    }
  one.fill_id(html_id,'');
  return 1;
  }
function check_aml(text)
  {
  var aml_response=patterns.aml.exec(text);
  if(aml_response)
    {
    if(aml_response[2]==='p') 
      {
      return aml_message.pass;
      }
    else if (aml_response[2]==='f')
      {
      return aml_message.fail;
      }
    }
  else
    {
    return aml_message.undefined_user; 
    }
  }

/********************
group: ajax
notes: includes call back and related.  Create a DOM group
********************/

function Ajax_object()
  {
  var object;
  try
    {
    object=new XMLHttpRequest();
    }
  catch(error_1)
    {
    alert('ajax_object : not instantiated:contact-support@archemarks.com : Error : ' + error_1);
    }
  return object;
  }

function ajax_fix(path,param,ajax_func,html_div)
  {
  var object=new Ajax_object();
  object.open("POST",path,true);
  object.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  object.setRequestHeader("Content-length",param.length);
  object.setRequestHeader("Connection","close");
  object.onreadystatechange=function()
    {
    if(this.readyState===4)
      {
      if(this.status===200)
        {
        if(this.responseText!==null || this.responseText!=='')
          {
          ajax_func(this.responseText,html_div);
          }
        else 
          {
          alert('Micorosft Ajax Object Failed: responseText is null or empty');
          }
        }
      else if(this.status===12030)
        {
        return 0; 
        }
      else 
        {
        alert('Micorosft Ajax Object Failed: ' +  this.status);
        }
      }
    };
    object.send(param);
    return 1;
  }

function ajax(path,param,ajax_func,html_div)   
  {
  while(!ajax_fix(path,param,ajax_func,html_div))
    {
    ajax(path,param,ajax_func,html_div);
    }
  }

function ajax_tryit(server_response_text,html_div)
  {
  var aml_status=check_aml(server_response_text.slice(0,6));
  if(aml_status===aml_message.pass)
    {
    one.reload();
    }
  else if(aml_status===aml_message.fail)
    {
    alert('ajax_tryit(): ' + server_response_text);
    }
  else
    {
    alert('php error: ' + server_response_text);
    }
  }  

function ajax_null()
  {
  }

function ajax_signin(server_response_text,html_div)
  {
  var aml_status=check_aml(server_response_text.slice(0,6));
  if(aml_status===aml_message.pass)
    {
    one.reload();
    }
  else if(aml_status===aml_message.fail)
    {
    one.fill_id(html_div,'');
    one.fill_id(html_div,server_response_text);
    }
  else
    {
    alert('php error: ' + server_response_text);
    }
  }

function ajax_signup(server_response_text,html_div)
  {
  var aml_status=check_aml(server_response_text.slice(0,6));
  if(aml_status===aml_message.pass)
    {
    document.upload_form.submit();
    }
  else if(aml_status===aml_message.fail)
    {
    document.getElementById(html_div).innerHTML=server_response_text;
    }
  else
    {
    alert('php error: ' + server_response_text); 
    }
  }

function ajax_signout(server_response_text,html_div)
  {
  var aml_status=check_aml(server_response_text.slice(0,6));
  if(aml_status===aml_message.pass)
    {
    one.reload();
    }
  else if(aml_status===aml_message.fail)
    {
    alert('ajax_signout(): ' + server_response_text);    
    }
  else
    {
    alert('php error: ' + server_response_text);
    }
  }

function ajax_bookmark(server_response_text,html_div)
  {
  var aml_status=check_aml(server_response_text.slice(0,6));
  if(aml_status===aml_message.pass)
    {
    ajax_null();
    }
  else if (aml_status===aml_message.fail)
    {
    alert('ajax_bookmark(): ' + server_response_text);    
    }
  else
    {
    alert('php error: ' + server_response_text); 
    }
  }

function ajax_tweet(server_response_text,html_div)
  {
  var first_split,second_split,tweet_count,return_string='';
  var aml_status=check_aml(server_response_text.slice(0,6));
  if(aml_status===aml_message.pass)
    {
    server_response_text=server_response_text.substr(6);
    first_split=server_response_text.split(/\|\|/);
    for(tweet_count=0;tweet_count<first_split.length;tweet_count++)
      {
      second_split=first_split[tweet_count].split(/\|/);
      return_string=return_string+'<div class="Bb2b"><img class="a" src="pictures/' + second_split[0] + '.jpg" alt=""/><a class="a" href="javascript:void(0)\">' + second_split[1]  + ' posted ' + view_date(second_split[2],second_split[3]) + '</a><br/><p class="c">' + second_split[4] + '</p></div>';
      }
    one.fill_id(html_div,return_string);
    }
  else if (aml_status===aml_message.fail)    
    {
    alert('ajax_tweet(): ' + server_response_text);
    }
  else 
    {
    alert('php error: ' + server_response_text);
    }
  }

function ajax_serialize(form_name)
  {
  var return_string='',  
      form_elements=document.forms[form_name].elements,
      iterator;  
  for(iterator=0;iterator<form_elements.length;iterator++)
    {
    if(form_elements[iterator].name)
      {
      if(form_elements[iterator].type==='checkbox'&&form_elements[iterator].checked===false)
        {
        return_string+=form_elements[iterator].name+"=0&";
        }
      else
        {
        return_string+=form_elements[iterator].name+"="+form_elements[iterator].value+"&";
        }
      }
    }
    return_string=return_string.slice(0,-1);
    return return_string;
  } 

/********************
group: interface 
notes: 
********************/

var messages = 
  {
  empty: 'Please complete all fields',
  empty_bm: 'Please enter both a title and url',
  name: 'Only letters or dashes for the name field',
  email: 'Please enter a valid email',
  same: 'Please make emails equal',
  taken: 'Sorry that email is taken',
  pass: 'Please enter a valid password, 6-40 characters',
  validate: 'Please contact <a class="d" href="mailto:support@archemarks.com">support</a> to reset your password',
  url:  'Pleae enter a valid url'
  }; 

function bookmark_error(image_element)
  {
  image_element.src='http://www.archemarks.com/images/favicon.ico';
  }

function bookmark_dom_update()
  {
  var form_elements=document.bookmark.elements;
  var link_element=document.createElement('a');
    link_element.innerHTML=form_elements[1].value;
    link_element.href=form_elements[2].value;
    link_element.name="a1";
    link_element.className="b";
    link_element.target="_blank";
  var image_element=document.createElement('img');               
    image_element.className="c";
    image_element.name="bo_im";    
    image_element.onerror = function() 
      { 
      bookmark_error(image_element); 
      };
    image_element.src=form_elements[2].value+'/favicon.ico';
  var list_hold=document.getElementById('Bb1c');
  var element_iterator=list_hold.firstChild;
    while(!!(element_iterator=element_iterator.nextSibling))
      {
      if(typeof element_iterator.tagName==='undefined')
        {
        list_hold.insertBefore(image_element,element_iterator);
        list_hold.insertBefore(link_element,element_iterator);
        break;
        }
      else if(element_iterator.tagName.toLowerCase()==='a' && (link_element.innerHTML<element_iterator.innerHTML))
        {
        element_iterator=element_iterator.previousSibling;
        list_hold.insertBefore(image_element,element_iterator);
        list_hold.insertBefore(link_element,element_iterator);
        break;
        }
      }
    return 1;
  }

function interface_tryit()
  {
  ajax('some_name_1.php','ajax_type=tryit',ajax_tryit,'');
  }

function interface_signin()
  {
  var form_name='signin',
      form_elements=document.forms[form_name].elements,
      response_div='signin_response',
      client_pass=1;
  if(some_name.client_validation===1)
    {
    client_pass=(check_empty(form_elements,response_div,messages.empty)&&check_generic(patterns.email,form_elements[0],response_div,messages.email)&&check_generic(patterns.pass,form_elements[1],response_div,messages.validate));
    }
    if(client_pass===1){ajax('some_name_1.php',ajax_serialize(form_name)+'&ajax_type=signin',ajax_signin,response_div);}
  }

function interface_signup()
  {
  var form_name='signup',
      form_elements=document.forms[form_name].elements, 
      response_div='signup_response',
      client_pass=1;
  if(some_name.client_validation===1)
    {
    client_pass=(check_empty(form_elements,response_div,messages.empty)&&check_generic(patterns.name,form_elements[0],response_div,messages.name)&&check_generic(patterns.email,form_elements[1],response_div,messages.email)&&check_same(form_elements[1],form_elements[2],response_div,messages.same)&&check_generic(patterns.pass,form_elements[3],response_div,messages.pass));
    }
    if(client_pass===1){ajax('some_name_1.php',ajax_serialize(form_name)+'&ajax_type=signup',ajax_signup,response_div);}
  }

function interface_signout()
  {
  ajax('some_name_1.php','ajax_type=signout',ajax_signout,'NULL');
  }

function interface_bookmark_add()
  {
  var form_name='bookmark',
      form_elements=document.forms[form_name].elements,
      response_div='bookmark_response';
  if(check_empty(form_elements,response_div,messages.empty_bm)&&check_generic(patterns.url,form_elements[2],response_div,messages.url)&&bookmark_dom_update()&&ajax('some_name_1.php',ajax_serialize(form_name)+'&ajax_type=bookmark_add',ajax_bookmark,response_div))
    {
    one.fill_id('f3aa','');
    one.fill_id('bookmark_add_box','');
    }
  }

function interface_tweet()
  {
  var form_name='tweet',
      form_elements=document.forms[form_name].elements,
      response_div='tweet_response';
  if(check_empty(form_elements,response_div,'Please share with the community')&&ajax('some_name_1.php',ajax_serialize('tweet')+'&ajax_type=tweet',ajax_tweet,'Bb2b_hold'))
    {
    document.getElementById('tweet_box').value='';
    }
  }

function interface_bookmark_delete(event_pull)
  {
  var delete_elment=this,
      send_param=delete_elment.name + "=" + delete_elment.innerHTML;
  event_pull.preventDefault();
  delete_elment.parentNode.removeChild(delete_elment.previousSibling);
  delete_elment.parentNode.removeChild(delete_elment); 
  ajax('some_name_1.php',send_param+'&ajax_type=bookmark_delete',ajax_bookmark);
  }

function interface_bookmark_flip()
  {
  var button_element=document.getElementById('bookmark_flip_button'),
      bookmark_list=document.getElementsByName('a1'),
      bookmark_element,
      iterator=0;
  if(interface_bookmark_flip.p1==='Done')
    {
    interface_bookmark_flip.p1='Delete';
    interface_bookmark_flip.p2='b';
    while(!!(bookmark_element=bookmark_list[iterator++]))
      {
      bookmark_element.removeEventListener("click", interface_bookmark_delete);
      bookmark_element.className=interface_bookmark_flip.p2;
      }
    }
  else
    { 
    interface_bookmark_flip.p1='Done';
    interface_bookmark_flip.p2='b1';
    while(!!(bookmark_element=bookmark_list[iterator++]))
      {
      bookmark_element.addEventListener("click", interface_bookmark_delete);
      bookmark_element.className=interface_bookmark_flip.p2;
      }
    }
    button_element.innerHTML=interface_bookmark_flip.p1;
  }

/********************
group: initialize
notes:
********************/

function link_update(link_display)
  {
  var local_element;
  local_element=document.getElementById(some_name.persistent_element);
  local_element.style.display='none';
  local_element=document.getElementById(link_display);
  local_element.style.display='block';
  some_name.persistent_element=link_display;
  }

function bind_enter_key(event, callback)
  {
  if(event.keyCode===constant.enter_key)
    {
    callback();
    return false;
    }
  }

function initialize_page()
  {
  var signin_found;
  signin_found=document.getElementById('signin_button');
  if(signin_found)
    {
    window.some_name =
      {
      client_validation:0,
      persistent_element:'hide_1'
      };
    signin_found.onclick=interface_signin;
    one.set_onclick('signup_button',interface_signup);
    one.set_onclick('tryit_button',interface_tryit);

    one.set_onkeypress('signup_pass', function(event){return bind_enter_key(event, interface_signup);});
    one.set_onkeypress('signin_pass', function(event){return bind_enter_key(event, interface_signin);});
    one.set_onkeypress('upload_file', function(event){return false;});

    one.set_onclick('l0',function() {return link_update('hide_0');});
    one.set_onclick('l1',function() {return link_update('hide_1');});
    one.set_onclick('l2',function() {return link_update('hide_2');});
    one.set_onclick('l3',function() {return link_update('hide_3');});
    one.set_onclick('l4',function() {return link_update('hide_4');});
    one.set_onclick('l5',function() {return link_update('hide_5');});
    }
  else
    {
    one.set_onclick('signout_button',interface_signout);
    one.set_onclick('bookmark_add_button',interface_bookmark_add);
    one.set_onclick('bookmark_flip_button',interface_bookmark_flip);
    one.set_onclick('tweet_button',interface_tweet);
    one.set_onkeypress('tweet_box', function(event){return bind_enter_key(event, interface_tweet);});
    one.set_onkeypress('bookmark_add_box', function(event){return bind_enter_key(event, interface_bookmark_add);});
    }
  }

addEventListener('load', initialize_page);

/********************
group: api related
notes: menu and view
********************/

function view_date(current_time,post_time)
  {
  var elapsed_time=(current_time-post_time),d,return_string, rounded_time;
  if(elapsed_time===0) 
    {
    return_string=' just a second ago';
    }
  else if((elapsed_time>0) && (elapsed_time<constant.minute)) 
    {
    if(elapsed_time===1)
      {
      return_string='1 second ago';
      }
    else
      {
      return_string=elapsed_time+' seconds ago';
      }
    }
  else if((elapsed_time>=constant.minute) && (elapsed_time<constant.hour))
    {
    rounded_time=Math.floor(elapsed_time/60);
    if(rounded_time===1)
      {
      return_string='1 minute ago';
      }
    else
      {
      return_string=rounded_time+' minutes ago';
      }
    }
  else if((elapsed_time>=constant.hour) && (elapsed_time<constant.day))
    {
    rounded_time=Math.floor(elapsed_time/constant.hour);
    if(rounded_time===1)
      {
      return_string='1 hour ago';
      }
    else
      {
      return_string=rounded_time+' hours ago';
      }
    }
  else if((elapsed_time>=constant.day)) 
    {
    rounded_time=new Date(post_time*constant.second);
    return_string='on '+rounded_time.toLocaleDateString();
    }
  return return_string;
  }

var menu = {   

  menu_timer:0,
  menu_element:0,

  top_mouse_over: function (id) 
    {
    menu.bottom_mouse_over();
    menu.menu_element=document.getElementById(id);
    menu.menu_element.style.visibility='visible';
    },

  hide_menu: function()
    {
    if(menu.menu_element)
      {
      menu.menu_element.style.visibility='hidden';
      }
    },

  bottom_mouse_over: function() 
    {
    if(menu.menu_timer)
      {
      window.clearTimeout(menu.menu_timer);
      }
    },

  mouse_out: function() 
    {
    menu.menu_timer=window.setTimeout(menu.hide_menu, constant.menu);
    }
};


/********************
group: api
notes:
********************/

function api_test()
  {
  alert("api is up");
  }

return {
  view_date: view_date, 
  menu: menu,
  bookmark_error: bookmark_error
  };

})(window);


205
1
задан 20 ноября 2011 в 05:11 Источник Поделиться
Комментарии
1 ответ

Пара замечаний с моей стороны:


  1. ВАР одинс методов выполнить поиск дом без кэширования. Установить поле в один объект для кэширования доступа к элементам. Это позволит увеличить производительность.

  2. Функции check_generic, check_empty и т. д. возвращает 0 или 1 в результате проверки. Логические значения иметь больше смысла для абонентов обычно; вместо этого можно использовать логические значения.

  3. Вы используете зарезервированные объект сайта в Ajax_object функции (имя функции немного отличается от именования следовать в других местах). Рассмотрим сочетания соглашения о наименовании, переименовании объектов на что-то другое.

  4. Кроме того, Ajax_object функция не поддерживает браузеры без родной поддержки XMLHttpRequest объекта. Рассмотреть вопрос о принятии узором пробовать конкретные экземпляры Майкрософт объектов HTTP-запроса XML. Ajax_object возвращает неопределено , если запрос не создается. Это обычно плохо для внешних абонентов. Рассмотрим бросать исключение дальше так абоненты могут справиться с ней.

  5. иначе если(this.статус===12030) - не могли бы Вы уточнить, какие особые случае вы пытаетесь покрыть здесь?

  6. Я хотел объединить все функции AJAX и связанных в пространстве имен объектов, сгруппировать их логически или реализовать модульность какая-то продлить ее пределами.

  7. Такие функции, как ajax_signin явно больше характерные для фактического применения, а ajax_tryit являются более универсальными. Рекомендуется разбить их на отдельные объекты и пространства имен.

  8. Все "особые" функции выполните те же рекомендации: ответ сервера -> срез -> check_aml -> проверить состояние и под -> делать. Рекомендуется использовать шаблон "декоратор", чтобы объединить эти призывы.

  9. Я не мог понять, что ajax_null для. Не могли бы Вы уточнить?

Вот именно сейчас.

1
ответ дан 21 ноября 2011 в 09:11 Источник Поделиться