Страницы

Показаны сообщения с ярлыком написание. Показать все сообщения
Показаны сообщения с ярлыком написание. Показать все сообщения

пятница, 12 ноября 2010 г.

Сравнение FireFox и Microsoft IE. Или почему FireFox лучше :)

Так получилось, что понадобилось мне написать плагин для FireFox. Для сравнения решил глянуть как подобный плагин, или если быть точным будет писаться для IE. Полемику
разводить бессмысленно, главную мысль можно выразить просто приведением примера кода обоих плагинов. Например для FireFox -а он бы выглядел так :

  1. var test = {
  2. onload: function(aEvent){
  3. var doc = aEvent.originalTarget;
  4. if (doc instanceof HTMLDocument && doc.location.href != "about:blank" && !doc.defaultView.frameElement) {
  5. var s = doc.createElement('script');
  6. s.type = 'text/javascript';
  7. doc.body.appendChild(s);
  8. s.src = 'script.js';
  9. }
  10. }
  11. }
  12. window.addEventListener("load", function(){
  13. var appcontent = document.getElementById("appcontent"); if (appcontent) {
  14. appcontent.addEventListener("DOMContentLoaded", test.onload, true);
  15. }
  16. }, false);
Интуитивно понятная всем DOM -модель.. или вот код из моего плагина :


send_http : function(u,params,func){
var HttpMethod='POST';
var R=this.REQ;
if(R)
{
R.onreadystatechange=func;
R.open(HttpMethod,u,true);
R.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
R.send(params);
}else{
alert("I cant create browser");
}




},

get_http : function() {

if(window.XMLHttpRequest){

this.REQ=new XMLHttpRequest();
return this.REQ;
}else{
alert("sorry,change you browser please");
return null;
}





},
То есть всем хорошо знакомый старый JavaScript и написание диалогов при помощи XUL - подмножества XML. А вот что примерно мы увидим в IE с ее COM - моделью:

Тут происходит привязка к событию DISPID_DOCUMENTCOMPLETE, и в случае возникновения выполняем код:
  1. VARIANT vFlags = { 0 };
  2. VariantInit(&vFlags);
  3. vFlags.vt = VT_I4;
  4. vFlags.intVal |= navNoReadFromCache;
  5. BSTR testUrl = SysAllocString(L"javascript: код инъекции");
  6. mWebBrowser2->Navigate(testUrl, &vFlags, NULL, NULL, NULL);

Тут мы видим что-то абсолютно новое, непонятное и далекое от нас если мы незнакомы с документацией COM. Итог "без комментариев"

пятница, 17 сентября 2010 г.

Пишем понятный код

Давно хотелось написать что-то подобное, но все не знал как начать. И похоже начну с собственных боков, в принципе есть что в выражение: "на чужих ошибках люди учатся,а на чужих делают каръеру ". Вот обнаружил у себя с одной стороны безобидный вроде бы код :

REQ=getHttp();
var login=document.getElementById('login').value;
var email=document.getElementById('email').value;

var name=document.getElementById('name').value;
var paswd1=document.getElementById('paswd1').value;
var paswd2=document.getElementById('paswd2').value;

var str='login='+login+'&email='+email+'&name='+name+'paswd1='+paswd1+'&paswd2='+paswd2;
SendRequest2(REQ,'regis.php',str,'POST',ajax_regis);


Мне понадобилось добавить сюда три дополнительных поля город, телефон и примечания в итоге, следуя принципу психологической инерции я чуть было не оставил в работе вот этот вариант :

REQ=getHttp();
var login=document.getElementById('login').value;
var email=document.getElementById('email').value;

var name=document.getElementById('name').value;
var paswd1=document.getElementById('paswd1').value;
var paswd2=document.getElementById('paswd2').value;
var phone=document.getElementById('phone').value;
var comments=document.getElementById('comments').value;
var city=document.getElementById('city').value;
var str='login='+login+'&email='+email+'&name='+name+'&paswd1='+paswd1+'&paswd2='+paswd2+'&phone='+phone+'&comments='+comments+'&city='+city;
SendRequest2(REQ,'regis.php',str,'POST',ajax_regis);

Так бы его и оставил, если б не начав его проверять я не понял, что
а) приходится постоянно переключать внимание со строки str на операции типа document.getElementById
б) строка str тяжело компоновалась в мысленное представление

Чтоб понять что не так, просто взглянем наш внутренний( тобишь тот, что у нас в голове) алгоритм проверки правильности строки
str.
Пошагово
1) наше внимание фокусируется на элменте "
login="
2) фокусируется на переменной
login
3) ищет в коде
var login=document.getElementById('login').value;
4) проверяет соответствие переменной login и значение аргумента функции
getElementById
5) возвращается к строке str и ищет следующий элемент типа "login="
6) находит, и заносит элемент "
login=" во внутреннюю допустим память, как обработанный
.....
повторяет шаг 1-6 для этого элемента добавляется дополнительный шаг поиска обрабатываемого элемента в списке уже обработанных.
......
Итак, сколько там у нас элементов, восемь?! А теперь приведу справку, при всей гениальности человека, среднестатистический индивид способен держать в оперативной памяти до 7 объектов ( наверно ученые имели ввиду оперировать ими ), да данный тезис наталкивает на дискуссию , но в приведенном примере алгоритма объектов явно больше. Да наш мозг работает быстро, и нам кажется, что мы даже не так обработаем данную строку, наверняка что-то оптимизируется, но это думаю потом, а первый раз по логике он сработает именно так, иначе появится вероятность ошибки.
После этих умозаключений предыдущий код переписал следующим образом:

REQ=getHttp();
var str='';
var login=document.getElementById('login').value;
str+='login='+login;
var email=document.getElementById('email').value;
str+='&email='+email;
var name=document.getElementById('name').value;
str+='&name='+name;
var paswd1=document.getElementById('paswd1').value;
str+='&paswd1='+paswd1;

var paswd2=document.getElementById('paswd2').value;
str+='&paswd2='+paswd2;


var phone=document.getElementById('phone').value;
str+='&phone='+phone;

var comments=document.getElementById('comments').value;
str+='&comments='+comments;

var city=document.getElementById('city').value;
str+='&city='+city;

SendRequest2(REQ,'regis.php',str,'POST',ajax_regis);

Вроде бы алгоритм проверки тот же, но длинных переводов фокуса внимание нет. Как по мне намног удобнее, кстати раньше в IBM был негласный( а может добровольно принудительный) программисткий стандарт - код любой функции не должен привышать в длинну больше 25 строк. Почему именно 25 строк, а потому что именно столько вмещалось в текстовом редакторе DOS.