Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   OOP in JavaScript (https://javascript.ru/forum/events/14466-oop-javascript.html)

Slawaq 18.01.2011 02:21

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", но кажется проблема легко решается только не знаю как((

Slawaq 18.01.2011 02:37

от кстати статический пример моей ошибки
<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>


извините конечно если это очень простой вопрос, но ООП на ЯС я недавно начал читать, а тут с таким натолкнулся, уже весь вечер потратил, всё просмотрел, ничего толкового не нашел((

x-yuri 18.01.2011 17:21

во-первых, почему не воспользовался существующими велосипедами, а начал свой изобретать, особенно при том, что "мои знания не позволили мне..."?

во-вторых, код мутный какой-то. Почему не так? (забил на утечки)
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'а

Slawaq 19.01.2011 00:28

вышло всё-таки и самому разобраться)
 
всё, я всё исправил, и убрал всё ненужное, и более универсализировал функцию $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 а насчёт утечек объясни по-подробней, а то это очень важно, и где оно может проявиться, а если можешь то ссылку кинь на такую инфу))

Slawaq 19.01.2011 21:18

ааа... посмотрел на этот polling и понял что надо программировать сервер не на ПХП..((
так вот у меня вопрос, что лучше использовать, если надо нормальной поллинг, хотя бы с пингом 200мс, особенно когда будет не один пользователь))
ну я почитал, пока только на ум приходит для этого Node.js
ну или чистый серверный JavaScript, или все-таки стоит на Python или Ruby???

monolithed 19.01.2011 21:44

Цитата:

Сообщение от Slawaq
программировать сервер не на ПХП

Facebook, Amazon, Flickr, Digg, Вконтакте и пр. не показатель?
Цитата:

Сообщение от Slawaq
или все-таки стоит на Python или Ruby

а может на С++?;) (сейчас проектирую свой движок на PHP+C++)
выбирайте, тот язык, который вы знаете

Slawaq 19.01.2011 22:36

Цитата:

Сообщение от monolithed (Сообщение 88757)
а может на С++?;) (сейчас проектирую свой движок на PHP+C++)
выбирайте, тот язык, который вы знаете

та я и сам хотел написать свой движок на Ява(потом думал тоже на Си++ но кросс-платформеность очень была важна), но нету много времени чтобы разбирать роботу клиент-серверных приложения на ява, от и решил использовать уже что-то готовое.
насчёт этого
Цитата:

Сообщение от monolithed (Сообщение 88757)
Вконтакте

"В Контакте — на базе node.js разработан XMPP-сервер." так что это уже зависит от целей, я же не говорю что мне надо будет всё делать на Ноде.яс, а поллинг, просто я хочу узнать мнение тех кто уже может роботал с тем и с тем чтобы можно было сравнить плюси и минусы, и чтобы потом я смог правильно сделать выбор)
но насчёт разработки своего сервера тоже не откажусь, только не тот форум чтобы тут что-то по Яве писать или спрашивать)
но все-таки помогите выбрать лучшее решение, если мне надо чтобы было ужо готово через месяц, при том что я почти не знаю ни Ноде,яс, ни Питон, ни Руби, ни Ява, но знаю ООП на Яве=)), и работал с Явой (но не учил нормально), а готово это означает приложение которое могло бы, получать данные по сокетам, отправлять данные на сокеты, и обрабатывать некоторые данные

Kolyaj 19.01.2011 23:18

Цитата:

Сообщение от Slawaq
посмотрел на этот polling и понял что надо программировать сервер не на ПХП..((

Если сильно хочется, можно и на PHP http://dklab.ru/lib/dklab_realplexor/

Slawaq 19.01.2011 23:38

Цитата:

Сообщение от Kolyaj (Сообщение 88766)
Если сильно хочется, можно и на PHP http://dklab.ru/lib/dklab_realplexor/

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


Часовой пояс GMT +3, время: 00:11.