Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Цепочка вызовов jQuery (https://javascript.ru/forum/dom-window/51556-cepochka-vyzovov-jquery.html)

krutoy 11.11.2014 13:07

danik.js,
можно даже так, чтоб лишние имена в глобале не плодить:
<html>
    <head>
<style>
.foo{background: red}
</style>
    </head>
 
    <body>

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

       <script>

$=function(sel){
   var o = document.querySelectorAll(sel)
   o.__proto__=$
   return o
}

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

$("div").addClass("foo")

        </script>
    </body>
 
</html>

OlegALL 11.11.2014 13:53

спасибо, вариант krutoy - наиболее удачный

Erolast 11.11.2014 14:55

Цитата:

Я, собственно, просто продемонстрировал, что его ф-ция срет в глобал, дальше я не смотрел
Сам же вечно срешь.
Цитата:

наиболее удачный
И наиболее неправильный.

krutoy 11.11.2014 16:12

OlegALL,
Прошу прощения, чуть поспешил. В ФФ не работает, может еще где. Вот этот код протестировал в ФФ Хроме и старой опере. В IE не тестил.
<html>
    <head>
<style>
.foo{background: red}
</style>
    </head>
  
    <body>
 
<div>foo</div>
<div>bar</div>
<div>baz</div>
 
       <script>

 
$=function(sel){
   var extend=function(src, trg){
      for(var i in src) if(!isNaN(i)) trg[i]=src[i]
   }
   var o = Object.create($)
   extend(document.querySelectorAll(sel), o)
   console.log(o)
   return o
}

 
$.addClass = function(className){

     for(var i in this){
         if(this[i].setAttribute) this[i].setAttribute("class", className)
     }
      return this;
}
 
   $("div").addClass("foo")
        </script>
    </body>
  
</html>

Но гарантировать нгичего не могу, сам экспериментирую:)
Это все из-за идиотского поведения нативного API, этих гребаных коллекций, которые и объекты, сука, и не объекты.

krutoy 11.11.2014 16:17

Цитата:

Сообщение от Erolast
Сам же вечно срешь.

Ты можешь отличить, когда глобал засираетсмя неявно, и когда прогер сам объявляет переменные в глобале?
Цитата:

Сообщение от Erolast
И наиболее неправильный.

Первая версия была неправильной, да.
Интересно было бы на твою версию взглянуть. Или опять сольешься?

Erolast 11.11.2014 18:04

Цитата:

Ты можешь отличить, когда глобал засираетсмя неявно, и когда прогер сам объявляет переменные в глобале?
Могу. Ты как раз засираешь неявно.
Цитата:

Интересно было бы на твою версию взглянуть.
Легко. Но не для тебя.
Так на ES6:
class $ {
  constructor(selector) {
    if (!(this instanceof $))
      return new $(selector);

    Object.assign(this, document.querySelectorAll(selector));
  }

  addClass(className) {
    for (let element of Array.from(this)) {
      element.classList.add(className);
    }
    return this;
  }
}

Так на ES5:
function $(selector) {
  if (!(this instanceof $))
    return new $(selector);

  var queryResult = document.querySelectorAll(selector);
  for (var i = 0; i < queryResult.length; i++) {
    this[i] = queryResult[i];
  }
  this.length = queryResult.length;
}

$.prototype.addClass = function(className) {
  for (var i = 0; i < this.length; i++) {
    var element = this[i];
    if (~element.className.indexOf(className))
      continue;
    else
      element.className += (" " + className);
  }
  return this;
}

krutoy 11.11.2014 19:06

Цитата:

Сообщение от Erolast
Могу. Ты как раз засираешь неявно.

Где я это делал? ткни пальцем или обосрись.
Цитата:

Сообщение от Erolast
Так на ES6

Засунь его себе в жопу.
Цитата:

Сообщение от Erolast
Так на ES5:

Так это же то же самое почти что я написал в последней версии, синтаксис только другой. Но я верю, что ты этого не понял, потому что, то, что я пишу -- это из головы, я думаю, а потом делаю, иногда ошибаюсь, а все что ты постишь тут -- тупая, слегка переделанная паста чужого кода. В частности, объясни, мягинький, зачем ты написал вот эту чушь:
Цитата:

Сообщение от Erolast
if (!(this instanceof $)) return new $(selector);

если можно было просто создать объект и явно им манипулировать? В данном случае, это не нужно, но ты тупо перенес шаблон сюда, потому что ты не понимаешь, что там происходит, и, посему, подправить код не можешь.
Расскажи, чипушила, чем твоя $ отличается от этой
function $(selector) {
  var o=Object.create($.prototype),
  queryResult = document.querySelectorAll(selector);
  for (var i = 0; i < queryResult.length; i++) {
    o[i] = queryResult[i];
  }
  o.length = queryResult.length; return o
}

посмеши пацанов.
Ты делаешь финты ушами только для того чтобы создать объект? Lol.

Erolast 12.11.2014 04:35

Цитата:

Где я это делал?
Цитата:

function $(selector) {
  var o=Object.create($.prototype),
  *!*queryResult = document.querySelectorAll(selector);*/!*
  for (var i = 0; i < queryResult.length; i++) {
    o[i] = queryResult[i];
  }
  o.length = queryResult.length; return o
}

Например.

danik.js 12.11.2014 06:28

Erolast, на конец предыдущей строки посмотри.

OlegALL 12.11.2014 09:56

Сейчас другой вопрос.
<body>
	<div class="class0"> <a href="">link</a> </div>
	<div class="class0"></div>
	<div class="class0"></div>
</body>

proto={};
		
		$ = function(selector){
			var tags = document.querySelectorAll(selector);
			tags.__proto__ = proto;
			return tags;
		}

		proto.addClass = function(className){
			for (var i = 0; i < this.length; i++){
			    this[i].classList.add(className);
		    }
			return this;
		}

		proto.html = function(){
			return this[0].innerHTML;
		}


console.log( $('div').addClass('class1').html() ); так работает
console.log( $('div').addClass('class1').html().addClass('class 2').html() ); а так нет.
html() с одной стороны должен возвращать this[0].innerHTML, а с другой this. Как это объединить не знаю. На несовершенство кода пока обращать внимания не надо. как-то надо использовать toString() / valueOf()


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