Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 11.11.2014, 13:07
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

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>
Ответить с цитированием
  #12 (permalink)  
Старый 11.11.2014, 13:53
Аспирант
Отправить личное сообщение для OlegALL Посмотреть профиль Найти все сообщения от OlegALL
 
Регистрация: 23.01.2010
Сообщений: 90

спасибо, вариант krutoy - наиболее удачный
Ответить с цитированием
  #13 (permalink)  
Старый 11.11.2014, 14:55
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
Я, собственно, просто продемонстрировал, что его ф-ция срет в глобал, дальше я не смотрел
Сам же вечно срешь.
Цитата:
наиболее удачный
И наиболее неправильный.
Ответить с цитированием
  #14 (permalink)  
Старый 11.11.2014, 16:12
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

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:15.
Ответить с цитированием
  #15 (permalink)  
Старый 11.11.2014, 16:17
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от Erolast
Сам же вечно срешь.
Ты можешь отличить, когда глобал засираетсмя неявно, и когда прогер сам объявляет переменные в глобале?
Сообщение от Erolast
И наиболее неправильный.
Первая версия была неправильной, да.
Интересно было бы на твою версию взглянуть. Или опять сольешься?
Ответить с цитированием
  #16 (permalink)  
Старый 11.11.2014, 18:04
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
Ты можешь отличить, когда глобал засираетсмя неявно, и когда прогер сам объявляет переменные в глобале?
Могу. Ты как раз засираешь неявно.
Цитата:
Интересно было бы на твою версию взглянуть.
Легко. Но не для тебя.
Так на 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;
}

Последний раз редактировалось Erolast, 11.11.2014 в 18:40.
Ответить с цитированием
  #17 (permalink)  
Старый 11.11.2014, 19:06
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от 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.

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

Цитата:
Где я это делал?
Цитата:
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
}
Например.
Ответить с цитированием
  #19 (permalink)  
Старый 12.11.2014, 06:28
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Erolast, на конец предыдущей строки посмотри.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #20 (permalink)  
Старый 12.11.2014, 09:56
Аспирант
Отправить личное сообщение для OlegALL Посмотреть профиль Найти все сообщения от OlegALL
 
Регистрация: 23.01.2010
Сообщений: 90

Сейчас другой вопрос.
<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()

Последний раз редактировалось OlegALL, 12.11.2014 в 10:02.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический подсчет в таблице 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