Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Последовательность функций как в jquery (https://javascript.ru/forum/events/30898-posledovatelnost-funkcijj-kak-v-jquery.html)

platedz 19.08.2012 21:35

Последовательность функций как в jquery
 
Скажите, пожалуйста, как можно реализовать последовательность функций по типу как это реализовано в джиквери. т.е.

el.func1().func2().func3();

Может быть есть где-то информация по данному поводу. Полдня искал, так и не нашел. Хотя может что-то не то искал.

Буду крайне признателен за любую информацию.

Deff 19.08.2012 21:37

platedz,
Для начала нужен код этих самых функций, судя по записи - это методы

http://javascript.ru/tutorial/object...avlenie-metoda

vadim5june 19.08.2012 21:40

они все возвращают this который в свою очередь указывает на вызывающий объект
поэтому после выполнения каждой функции мы получаем тот же объект только модернизирванный
добавляй в конце return this
вот здесь в самом низу пример есть
http://sartas.ru/js-cepochka-funkcij-kak-v-jquery/

cyber 19.08.2012 21:54

вызов функций или методов?
методов
var object_ = {

 first: function () {

 alert('первый');
 return this;
},

 second: function () {

 alert('второй');
 return this;
}

}
object_.first().second();


функций
function _object() {

var self = arguments.callee;

self.first = function () {
alert('первый');

return self;
}

self.second = function () {

alert('второй');
return self;
}

return self;
}
_object().first().second();

platedz 19.08.2012 22:09

Спасибо. Буду разбираться и пробовать.

platedz 19.08.2012 23:04

Последовательность сама по себе вышла, но если соответствовать методу jquery, то мы должны первым объявить элемент, а потом уже назначать ему методы.
Я написал так
tel = function(window){

return {

elemmm : function(e){ return document.getElementById(e); },

 first: function (w) {

 alert(w);
 return this;
},

 second: function (w) {

 alert(w);
 return this;
}

}

}(window);

tel.first(tel.elemmm("apslaed"));


Но это не правильно, тк. должно быть примерно так или навроде того
tel.elemmm("apslaed").first();

Deff 19.08.2012 23:06

platedz,
Вы просто присвойте потом tel =$("apslaed")

cyber 19.08.2012 23:11

мой совет, лучше делайте так

function test () {
var self = this;

this.first = function () {

alert('one');
return self;
}

this.second = function () {

alert('two');
return self;
}
}

var obj = new test();

obj.first().second();

bot87 19.08.2012 23:20

cyber отличные примеры спс :)

platedz 19.08.2012 23:46

Честно говоря не понимаю, как реализовать. Можно какой-нибудь пример с присвоением элемента и затем последовательного выполнения пары функций.
Т.е. Скажем мы берем элемент и последовательно выводим его к примеру в двух алертах, или что-то подобное.
document.getElementById("id").alert1().alert2();


соответственно alert1 должен вывести alert1(document.getElementById("id").innerHTML) из функции
function alert1(e){alert(e.innerHTML);}

соответственно alert2 должен вывести alert(document.getElementById("id").id)
function alert2(e){alert(e.id);}

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

platedz 19.08.2012 23:54

Т.е. должно получиться примерно это
tel = function(window){
sdf = document.getElementById("apslaed");
return {

 first: function () {

 alert(sdf.innerHTML);
 return this;
},

 second: function () {

 alert(sdf.id);
 return this;
}

}

}(window);

tel.first().second();

но sdf нужно определить впереди, перед first и second, как это делается в jqeury, а не внутри функции как в примере выше

cyber 20.08.2012 00:06

можно так
<!DOCTYPE HTML>
<html>
  <head> </head>
  <body>

    <div id='fignya'>что то типо текста</div>  
    <script>

    

var elem = document.getElementById('fignya');
      
      function ElelemMethod () {
      
       var self = this; 
        
       self.alert1 = function () {
        
       alert(this.innerHTML)
       return self;
      }
      
      self.alert2 = function () {
        
       alert(this.id)
       return self;
      }   
      
        
      return self;  
      } 
      
     ElelemMethod.call(elem).alert1().alert2(); 
    </script>

  </body>
</html>

можно использовать bind или прототипное наследование (в нем не шарю, еще 2 главы до него :))

platedz 20.08.2012 00:30

Спасибо всем кто ответил. Сам бы не справился.

Я сделал так

tel = function(window){

return {
elems : function(e) { dd = document.getElementById(e);  return this;},
 first: function () {

 alert(dd.innerHTML+" - "+this);
 
 return this;
},

 second: function () {

 alert(dd.id+" - "+this);
 return this;
}

}

}(window);

tel.elems("apslaed").first().second();

Теперь хотелось бы вот эту часть tel.elems привести к одному знаменателю например к $ как в jqueru

Подскажите, как это сделать.

cyber 20.08.2012 00:34

не совсем понял что вы хотите

platedz 20.08.2012 00:36

убрать точку отсюда tel.elems,
а точнее сделать так, чтобы вметос tel.elems писать скажем $
Т.е чтобы tel.elems == $
и записать все это как

$("apslaed").first().second();

cyber 20.08.2012 00:42

$ - это имя функции, сделайте функцию с таким именем =)

platedz 20.08.2012 00:52

А как я это сделаю.
Я могу сделать так

$.elems("apslaed").first().second();
или так
tel.$("apslaed").first().second();
а нужно так
$("apslaed").first().second();

cyber 20.08.2012 00:55

Цитата:

$.elems("apslaed").first().second();

$ - обьект
Цитата:

tel.$("apslaed").first().second();

$-метод
Цитата:

$("apslaed").first().second();

$-функция

platedz 20.08.2012 01:01

Спасибо за пояснение.
А можно как то записать теперь функцию, чтобы она выполняла метод elems объекта tel?
Или может снести куда-нибудь метод, или переопределить его как-то, я честно говоря даже не знаю.

cyber 20.08.2012 01:33

можно так ,но я не уверен что это правильно решение (в прототипах еще не шарю), если я не прав поправьте меня
<!DOCTYPE HTML>
<html>
  <head> </head>
  <body>

    <script>

        var object_ = {
      
        first: function () {
        
        alert('one');
          
        return this;
        }
      
      }
      
      function $() {
        
       
       
          
         return {}.prototype = object_; 
     }
     
    
      
    
      
     
      
      
        $().first();
       
   
      
    </script>
    

  </body>
</html>

platedz 20.08.2012 02:33

Спасибо попробую. Возникла другая проблема. Если элемент не существует, то метод undefined. И на существующие элементы метод перестает работать. Подскажите, пожалуйста, как это обойти?

cyber 20.08.2012 02:41

код в студию=)

platedz 20.08.2012 02:51

Пока код все тот же.

tel = function(window){

return {
elems : function(e) { dd = document.getElementById(e);  return this;},
 first: function () {

 alert(dd.innerHTML+" - "+this);
 
 return this;
},

 second: function () {

 alert(dd.id+" - "+this);
 return this;
}

}

}(window);

tel.elems("a").first().second();
tel.elems("b").first().second();


Если id="a" на странице не существует, то el.elems("b").first().second(); не выполнится, а надо чтобы работал.

cyber 20.08.2012 02:54

elems : function(e) { 
try {
dd = document.getElementById(e); 
} catch(e) {}
 return this;
},

platedz 20.08.2012 02:58

Спасибо, я тоже так думал. Но все равно не работает.

platedz 20.08.2012 03:12

Кстати, вот так у меня не получилось
function $() {return {}.prototype = tel.elems; }



Зато вышло так,
function $(e) {return {}.prototype = tel.elems(e); }



Но я сделал так,
function $(e) {return  tel.elems(e); }

тк.. с прототипами у меня дела совсем плохо обстоят. Хотя буду рад любому пояснению касательно того, что это такое и зачем они нужны и как с ними работать.

cyber 20.08.2012 03:15

http://learn.javascript.ru/inheritance-intro
Цитата:

function $(e) {return tel.elems(e); }
это работает потому что вы вызваете метод elems и он возвращает this.
лучше уже так
function $(e) {return  tel; }

platedz 20.08.2012 04:14

Спасибо за информацию. Уже начинаю немного понимать, в плане прототипов, особенно в сравнении с php. Хотя еще только на далеко базовом уровне.
Ваш пример не работает, и что не менее Важно теряется elems, т.е. даже если и вернуть корректно tel и заменить его на другое название то все равно придется вызывать elems, например $.elems(id) а нужно $(id)

А самое главное, если id не существует, то код не работает, и это нужно как-то обойти.

cyber 20.08.2012 04:36

Цитата:

А самое главное, если id не существует, то код не работает, и это нужно как-то обойти.
Цитата:

Сообщение от cyber (Сообщение 198919)
elems : function(e) { 
try {
dd = document.getElementById(e); 
} catch(e) {}
 return this;
},

а насчет функции $ я ступил немного , сонный уже..
вот так правильно
function $(e) {return tel.elems(e); }

<!DOCTYPE HTML>
<html>
  <head> </head>
  <body>

    <script>

      var object_ = {
        message: function (id){
        alert(id)
         return this;
        }
      
      
      }
      
      function $ (id) {
      
      return object_.message(id);
      }

$('привет');
    </script>

  </body>
</html>

platedz 20.08.2012 04:48

Спасибо за ответ.
try{}cathe(){} не дает результата.
Насколько я понимаю, вызывается метод к элементу которого еще не существует.
В общем если эту проблему решить, то все будет просто замечательно.

platedz 20.08.2012 04:57

Кстати, насколько я понимаю, вот так вот можно создать полную копию объекта.
copy = {}.prototype = tel;

при этом {}.prototype здесь служит как бы посредником.
А как еще можно записать подобное выражение?
И самый главный вопрос, как заставить работать код, если элемента на странице не существует.

cyber 20.08.2012 05:00

опять туплю =)
а зачем вообще что то делать?
если такого id нет то в переменная dd = null;
var dd =  document.getElementById('id');
alert('run');

var dd = document.getElementById;
alert('run');

и код ниже выполнится, ошибки не будет

platedz 20.08.2012 14:07

В данном случае я вывожу кнопку войти, в личном кабинете, либо кнопку кабинет, если человек вошел. Кроме прочего элемента может еще не быть на странице, но он может быть создан в ходе каких-то действий.

Видимо ошибка выдается т.к. к объекту котогоро нет, применяется метод, на что и ругается браузер.

cyber 20.08.2012 14:49

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

platedz 20.08.2012 18:07

Спасибо. Вроде все верно. Буду разбирать код по частям и разбираться.
Возник еще один вопрос.
В данном примере я могу применить метод к dd, но не могу вернуть сам dd - элемент на который я применяю метод. Можно ли как-то сделать так, чтобы применить к dd стандартные методы и свойства javascript,
т.е. сделать так, чтобы подобная запись работала

alert(tel.elems(e).innerHTML)

cyber 20.08.2012 18:09

я не знаю, просто в jquery , все на много сложней чем вам кажется=)

platedz 20.08.2012 18:33

Спору нет.
Но я к сожалению довольно слаб в ооп.
На данный момент я могу либо вернуть элемент
return dd = document.getElementById('id');

либо вернуть this.
dd = document.getElementById('id'); return this;

При этом я честно говоря, так до конца и не понял, что же происходит, когда я возвращаю this.
т.е. this содержит весь код объекта.
Т.е. если я верно понимаю я возвращаю код объекта, т.е. сам объект и что происходит потом ?

cyber 20.08.2012 18:52

можно так
<!DOCTYPE HTML>
<html>
  <head> </head>
  <body>

    <div id='elem'>askasdfskdofkdof</div>  
    <script>
      
      var object_ = {
      
        find: function (id) {
        
         this.elem = document.getElementById(id);
          this.innerHTML = this.elem.innerHTML;
          
          return this;
        
        },
        
        
      
      
      }
      

      function $(select) {
      
      
      
      
      
       return object_.find(select);
      }


      alert($('elem').innerHTML)
    </script>

  </body>
</html>

vadim5june 20.08.2012 19:47

Цитата:

Сообщение от platedz
Т.е. если я верно понимаю я возвращаю код объекта, т.е. сам объект и что происходит потом ?

и значит снова можно обратится к тому же объекту-получается цепочка если бы ничего не возвращали(или что то другое) то цепочка прерывается

platedz 20.08.2012 20:37

Спасибо.
А где содержится InnerHTML? Можно ли как-то получить весь список глобальных свойств и затем перебрав их в цикле присвоить их к данному объекту.


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