Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.11.2014, 09:33
Аспирант
Отправить личное сообщение для OlegALL Посмотреть профиль Найти все сообщения от OlegALL
 
Регистрация: 23.01.2010
Сообщений: 90

Цепочка вызовов jQuery
Привет

Задача - сделать так: $('div').addClass('class1').html().addClass('class 2').html(); (без new), не создавая экземпляра класса, оставив при этом прототипное наследование.



function $(selector){
			this.tags = document.querySelectorAll(selector);
		}
		
		$.prototype.addClass = function(className){
			for (var i = 0; i < this.tags.length; i++){
				this.tags[i].classList.add(className);
			}
			return this;			
		}
		
		$.prototype.html = function(){
			this.tags[0].innerHTML;
			console.log(this.tags[0].innerHTML);
			return this;
		}		
		
		new $('div').addClass('class1').html().addClass('class2').html();

Последний раз редактировалось OlegALL, 11.11.2014 в 09:40.
Ответить с цитированием
  #2 (permalink)  
Старый 11.11.2014, 10:38
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

https://ru.wikipedia.org/wiki/Fluent_interface
Ответить с цитированием
  #3 (permalink)  
Старый 11.11.2014, 10:39
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,214

Сообщение от OlegALL
Задача - сделать так:
$('div').addClass('class1').html().addClass('class  2').html();
Ответ - "так" не сделать...

OlegALL, ты, что вообще хочешь получить?
Присвоить ДИВу два класса и вернуть его ХТМЛ?
Ответить с цитированием
  #4 (permalink)  
Старый 11.11.2014, 10:54
Аспирант
Отправить личное сообщение для OlegALL Посмотреть профиль Найти все сообщения от OlegALL
 
Регистрация: 23.01.2010
Сообщений: 90

Сообщение от ksa Посмотреть сообщение
Ответ - "так" не сделать...

OlegALL, ты, что вообще хочешь получить?
Присвоить ДИВу два класса и вернуть его ХТМЛ?
Да
Ответить с цитированием
  #5 (permalink)  
Старый 11.11.2014, 11:11
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,214

Сообщение от OlegALL
Да
Так и пиши...

var val=$('div').addClass('class1 class2').html();
Ответить с цитированием
  #6 (permalink)  
Старый 11.11.2014, 11:29
Аспирант
Отправить личное сообщение для OlegALL Посмотреть профиль Найти все сообщения от OlegALL
 
Регистрация: 23.01.2010
Сообщений: 90

Спасибо Erolast за ссылку. Получилось так:

var $ = function (selector){
			this.tags = document.querySelectorAll(selector);
			if(this.$) {
				return new $(selector);
			}
		}
		
		$.prototype.addClass = function(className){
			for (var i = 0; i < this.tags.length; i++){
				this.tags[i].classList.add(className);
			}
			return this;
		}
		
		$.prototype.html = function(){
			this.tags[0].innerHTML;
			console.log(this.tags[0].innerHTML);
			return this;
		}

		
		$('div').addClass('class1').html().addClass('class2').html();


Только вопрос: почему зацикливается вызов $, если писать
так:
return new $(selector);

а не так:
if(this.$) {
    return new $(selector);
}
Ответить с цитированием
  #7 (permalink)  
Старый 11.11.2014, 11:59
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от OlegALL
var $ = function (selector){            this.tags = document.querySelectorAll(selector);             if(this.$) {                return new $(selector);            }        }
Толком не вникал, но беглый взгляд -- и уже детская ошибка.
<html>
    <head>
    </head>
 
    <body>

<div>foo</div>
<div>bar</div>
<div>baz</div>

       <script>

var $ = function (selector){
            this.tags = document.querySelectorAll(selector);
            if(this.$) {
                return new $(selector);
            }
        }
$("div")
alert(tags)
        </script>
    </body>
 
</html>
Ответить с цитированием
  #8 (permalink)  
Старый 11.11.2014, 12:30
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от krutoy
if(this.$) {
Кто тебя надоумил такое написать?

Логика такая: если this - инстанс конструктора $, то все пучком, делаем поиск по селектору.
Если же нет - создаем инстанс сами через new и возвращаем результат.

Таким образом, когда будешь писать $('div'), то будет два вызова - один как вызов функции, второй - как вызов конструктора (через new, создание инстанса то есть). Оно у тебя и щас так работает, но условие не совсем подходящее.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #9 (permalink)  
Старый 11.11.2014, 12:41
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от danik.js
Кто тебя надоумил такое написать?
Это не я написал, это код топикстартера. Я, собственно, просто продемонстрировал, что его ф-ция срет в глобал, дальше я не смотрел
Ответить с цитированием
  #10 (permalink)  
Старый 11.11.2014, 12:45
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

danik.js,
Слушай, по-моему это чушь какая-то. Какие нах*й инстансы и классы? цель банальна -- вернуть (псевдо) объект, так? Так почему бы не написать тупо
proto={}
$=function(sel){
   var o = document.querySelectorAll(sel)
   o.__proto__=proto
   return o
}

proto.addClass = function(className){
   for (var i = 0; i < this.length; i++){
           this[i].setAttribute("class", className)
   }
           return this;
}

и так далее. Зачем этот цирк?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический подсчет в таблице muraig jQuery 5 11.10.2014 16:54
хочу инвайт на хабр macdack Оффтопик 45 28.07.2013 23:18
Вопрос поддержки старых методов jQuery antonM jQuery 1 04.10.2012 00:08
Цепочка вызовов с таймаутом. Jurasmi Общие вопросы Javascript 18 25.01.2011 17:18
JQuery + FireFox NOOB jQuery 4 02.11.2009 18:16