OOP in JavaScript
мои знания не позволили мне решить такую проблему, как написания объекта для взаимодействия с сервером через заголовки, а проблема у меня как раз возникла при написании функции onload, ну короче сами смотрите
var AJAX={ getData:function(){ this.open=function(type,value){ var openXHR=new AJAX.createCONN(type,value); $catch(openXHR.getIdSpace(),this.gets)} this.data=''; this.onload=function(){}; this.gets=function(n){this.data+=n;this.onload()} }, createCONN:function(head,value){ this.xmlhttp=new XMLHttpRequest(); var xmlhttp=this.xmlhttp; var id=$space.length+1; this.xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4){ $space[id]=decodeURI(xmlhttp.getResponseHeader('riseup').replace(/.*\:(.*)/,'$1')); } } this.xmlhttp.open("HEAD","route.php",true); this.xmlhttp.setRequestHeader('riseup',encodeURI(head)+':'+encodeURI(value)); this.xmlhttp.send(null); this.getIdSpace=function(){return id}; } } var $space=[]; function $catch(id,func){ setTimeout(function(){ if(!$space[id]){ setTimeout(arguments.callee,0) }else{return func.call($space[id]) }},0)} //--------------------------------------------------------------------- var testXHR=new AJAX.getData(); test.onload=function(){alert(testXHR.data)} test.open('test','myDat'); после проверки ничего не происходит, а консоль хрома пишет: "Uncaught TypeError: Object MyDat has no method 'onload'", смотря на эту ошибку я недоумеваю, потому что не могу понять где у меня появляться "Object MyDat", но кажется проблема легко решается только не знаю как(( |
от кстати статический пример моей ошибки
<html> <head> </head> <body> <script type="text/javascript"> function mm(){ this.r=0; this.m1=function(n){alert('YES, WE HAVE YOUR CLICK ')} this.che=function(){try{this.m1();}catch(error){alert(error);}} this.cheking=function(){ $catch(this.che) } } var e=new mm() e.cheking(); function $catch(func){ setTimeout(function(){ if(!e.r){ setTimeout(arguments.callee,0) }else{return func.call(e.r)// если убрать аргумент тогда оно вообще такое пишет:"Uncaught TypeError: Object [object DOMWindow] has no method 'm1'" }},0)} </script> <input onclick="e.r=1" /> </body> </html> извините конечно если это очень простой вопрос, но ООП на ЯС я недавно начал читать, а тут с таким натолкнулся, уже весь вечер потратил, всё просмотрел, ничего толкового не нашел(( |
во-первых, почему не воспользовался существующими велосипедами, а начал свой изобретать, особенно при том, что "мои знания не позволили мне..."?
во-вторых, код мутный какой-то. Почему не так? (забил на утечки) function CustomAjax( name, value, onLoad ){ var req = this._req(); req.open('HEAD', 'route.php', true); req.onreadystatechange = function(){ if( req.readyState == 4 && req.status == 200 ){ var v = decodeURI( req.getResponseHeader('riseup') .replace(/.*\:(.*)/, '$1') ); onLoad( v ); } }; req.send( null ); } CustomAjax.prototype._req = function(){ if( window.XMLHttpRequest ) return new window.XMLHttpRequest(); else try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch( e ){ return new ActiveXObject('Microsoft.XMLHTTP'); } }; new CustomAjax().get('test', 'myDat', function( v ){ alert( v ); }) в-третьих надо учиться отлаживать код. Сделай console.log(this) и загляни в консоль firebug'а |
вышло всё-таки и самому разобраться)
всё, я всё исправил, и убрал всё ненужное, и более универсализировал функцию $catch, чтобы ею можно было бы проверять изменения разных переменных, и для теста написал часики, серверные))
<html><body> <script type='text/javascript'>var AJAX={ connect:function(){ this.data=''; this.onget=function(){}; this.open=function(type,value){ AJAX.createCONN(type,value,this); $catch(this.onget,'data',this)} }, createCONN:function(head,value,obj){ xmlhttp=new XMLHttpRequest(); xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4){ obj.data=xmlhttp.getResponseHeader('Date')/*decodeURI(xmlhttp.getResponseHeader('riseup').replace(/.*\:(.*)/,'$1')); это должно быть в нормальном виде, но для примера уберём))*/ } } xmlhttp.open("HEAD","index.php",true); xmlhttp.setRequestHeader('riseup',encodeURI(head)+':'+encodeURI(value)); xmlhttp.send(null); } } function $catch(func,name,obj){ obj=obj || window p1=obj[name]; setTimeout(function(){ if(p1==obj[name]){ setTimeout(arguments.callee,0) }else{return func.call(obj) }},0)} </script> <div style='border:1px gray solid;color:gray;width:200px;text-align:center;font-family:Tahoma;font-size:11px;' id='serverClock'></div> <script type="text/javascript"> var stop=true; var onlineClock=new AJAX.connect(); onlineClock.onget=function(){document.getElementById('serverClock').innerHTML=this.data} function go(){setTimeout(function(){if(!stop){onlineClock.open();setTimeout(arguments.callee,1000)}},0)} </script> <input type='button' value='on server clock' onclick='if(stop){this.value=this.value.replace("on","off");stop--;go()}else{this.value=this.value.replace("off","on");stop++;}'> </body></html> от такой polling на head-ах, но это как дополнение, в основном оно будет пользоваться для одноразовой загрузки пакета каких-то данных P.S. насчёт Ослика я сам вижу что не кросс-браузерно, но там куда я это поставлю это не играет роли, так как там уже есть некоторые модули которые не работают в ИЕ, и да это, я и сам знаю что это не очень прелестно))) P.P.S а насчёт утечек объясни по-подробней, а то это очень важно, и где оно может проявиться, а если можешь то ссылку кинь на такую инфу)) |
ааа... посмотрел на этот polling и понял что надо программировать сервер не на ПХП..((
так вот у меня вопрос, что лучше использовать, если надо нормальной поллинг, хотя бы с пингом 200мс, особенно когда будет не один пользователь)) ну я почитал, пока только на ум приходит для этого Node.js ну или чистый серверный JavaScript, или все-таки стоит на Python или Ruby??? |
Цитата:
Цитата:
выбирайте, тот язык, который вы знаете |
Цитата:
насчёт этого Цитата:
но насчёт разработки своего сервера тоже не откажусь, только не тот форум чтобы тут что-то по Яве писать или спрашивать) но все-таки помогите выбрать лучшее решение, если мне надо чтобы было ужо готово через месяц, при том что я почти не знаю ни Ноде,яс, ни Питон, ни Руби, ни Ява, но знаю ООП на Яве=)), и работал с Явой (но не учил нормально), а готово это означает приложение которое могло бы, получать данные по сокетам, отправлять данные на сокеты, и обрабатывать некоторые данные |
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 02:56. |