Последовательность функций как в jquery
Скажите, пожалуйста, как можно реализовать последовательность функций по типу как это реализовано в джиквери. т.е.
el.func1().func2().func3(); Может быть есть где-то информация по данному поводу. Полдня искал, так и не нашел. Хотя может что-то не то искал. Буду крайне признателен за любую информацию. |
platedz,
Для начала нужен код этих самых функций, судя по записи - это методы http://javascript.ru/tutorial/object...avlenie-metoda |
они все возвращают this который в свою очередь указывает на вызывающий объект
поэтому после выполнения каждой функции мы получаем тот же объект только модернизирванный добавляй в конце return this вот здесь в самом низу пример есть http://sartas.ru/js-cepochka-funkcij-kak-v-jquery/ |
вызов функций или методов?
методов
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();
|
Спасибо. Буду разбираться и пробовать.
|
Последовательность сама по себе вышла, но если соответствовать методу 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();
|
platedz,
Вы просто присвойте потом tel =$("apslaed") |
мой совет, лучше делайте так
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();
|
cyber отличные примеры спс :)
|
Честно говоря не понимаю, как реализовать. Можно какой-нибудь пример с присвоением элемента и затем последовательного выполнения пары функций.
Т.е. Скажем мы берем элемент и последовательно выводим его к примеру в двух алертах, или что-то подобное.
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);} код абсолютно условный, потому что я даже приблизительно не знаю, как его написать. Помогите, пожалуйста. |
Т.е. должно получиться примерно это
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, а не внутри функции как в примере выше |
можно так
<!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 главы до него :)) |
Спасибо всем кто ответил. Сам бы не справился.
Я сделал так
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 Подскажите, как это сделать. |
не совсем понял что вы хотите
|
убрать точку отсюда tel.elems,
а точнее сделать так, чтобы вметос tel.elems писать скажем $ Т.е чтобы tel.elems == $ и записать все это как $("apslaed").first().second(); |
$ - это имя функции, сделайте функцию с таким именем =)
|
А как я это сделаю.
Я могу сделать так $.elems("apslaed").first().second(); или так tel.$("apslaed").first().second(); а нужно так $("apslaed").first().second(); |
Цитата:
Цитата:
Цитата:
|
Спасибо за пояснение.
А можно как то записать теперь функцию, чтобы она выполняла метод elems объекта tel? Или может снести куда-нибудь метод, или переопределить его как-то, я честно говоря даже не знаю. |
можно так ,но я не уверен что это правильно решение (в прототипах еще не шарю), если я не прав поправьте меня
<!DOCTYPE HTML>
<html>
<head> </head>
<body>
<script>
var object_ = {
first: function () {
alert('one');
return this;
}
}
function $() {
return {}.prototype = object_;
}
$().first();
</script>
</body>
</html>
|
Спасибо попробую. Возникла другая проблема. Если элемент не существует, то метод undefined. И на существующие элементы метод перестает работать. Подскажите, пожалуйста, как это обойти?
|
код в студию=)
|
Пока код все тот же.
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(); не выполнится, а надо чтобы работал. |
elems : function(e) {
try {
dd = document.getElementById(e);
} catch(e) {}
return this;
},
|
Спасибо, я тоже так думал. Но все равно не работает.
|
Кстати, вот так у меня не получилось
function $() {return {}.prototype = tel.elems; }
Зато вышло так,
function $(e) {return {}.prototype = tel.elems(e); }
Но я сделал так,
function $(e) {return tel.elems(e); }
тк.. с прототипами у меня дела совсем плохо обстоят. Хотя буду рад любому пояснению касательно того, что это такое и зачем они нужны и как с ними работать. |
http://learn.javascript.ru/inheritance-intro
Цитата:
лучше уже так
function $(e) {return tel; }
|
Спасибо за информацию. Уже начинаю немного понимать, в плане прототипов, особенно в сравнении с php. Хотя еще только на далеко базовом уровне.
Ваш пример не работает, и что не менее Важно теряется elems, т.е. даже если и вернуть корректно tel и заменить его на другое название то все равно придется вызывать elems, например $.elems(id) а нужно $(id) А самое главное, если id не существует, то код не работает, и это нужно как-то обойти. |
Цитата:
Цитата:
вот так правильно 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>
|
Спасибо за ответ.
try{}cathe(){} не дает результата. Насколько я понимаю, вызывается метод к элементу которого еще не существует. В общем если эту проблему решить, то все будет просто замечательно. |
Кстати, насколько я понимаю, вот так вот можно создать полную копию объекта.
copy = {}.prototype = tel;
при этом {}.prototype здесь служит как бы посредником. А как еще можно записать подобное выражение? И самый главный вопрос, как заставить работать код, если элемента на странице не существует. |
опять туплю =)
а зачем вообще что то делать? если такого id нет то в переменная dd = null;
var dd = document.getElementById('id');
alert('run');
var dd = document.getElementById;
alert('run');
и код ниже выполнится, ошибки не будет |
В данном случае я вывожу кнопку войти, в личном кабинете, либо кнопку кабинет, если человек вошел. Кроме прочего элемента может еще не быть на странице, но он может быть создан в ходе каких-то действий.
Видимо ошибка выдается т.к. к объекту котогоро нет, применяется метод, на что и ругается браузер. |
ну смотрите вы не записали нечего переменную и применили метод вы всеравно получите ошибку, перед тем как его применять делайте проверку и все
|
Спасибо. Вроде все верно. Буду разбирать код по частям и разбираться.
Возник еще один вопрос. В данном примере я могу применить метод к dd, но не могу вернуть сам dd - элемент на который я применяю метод. Можно ли как-то сделать так, чтобы применить к dd стандартные методы и свойства javascript, т.е. сделать так, чтобы подобная запись работала alert(tel.elems(e).innerHTML) |
я не знаю, просто в jquery , все на много сложней чем вам кажется=)
|
Спору нет.
Но я к сожалению довольно слаб в ооп. На данный момент я могу либо вернуть элемент return dd = document.getElementById('id'); либо вернуть this. dd = document.getElementById('id'); return this; При этом я честно говоря, так до конца и не понял, что же происходит, когда я возвращаю this. т.е. this содержит весь код объекта. Т.е. если я верно понимаю я возвращаю код объекта, т.е. сам объект и что происходит потом ? |
можно так
<!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>
|
Цитата:
|
Спасибо.
А где содержится InnerHTML? Можно ли как-то получить весь список глобальных свойств и затем перебрав их в цикле присвоить их к данному объекту. |
| Часовой пояс GMT +3, время: 15:29. |