Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   $('my').load(); Как сделать, чтобы это заработало (https://javascript.ru/forum/misc/7106-%24-%27my%27-load-%3B-kak-sdelat-chtoby-ehto-zarabotalo.html)

mycoding 15.01.2010 21:29

$('my').load(); Как сделать, чтобы это заработало
 
Подскажите, Как сделать, чтобы это заработало.
Начинка не важна , главное сама структура записи класса
<html>

<body>
ljkj
<div id=my>HI</div>
</body>

</html>
<script>
function $(id)
{
this.load = function() {alert(1);}
}
$('my').load();
</script>

Kolyaj 15.01.2010 21:49

new $('my').load();

Octane 15.01.2010 22:07

Ну если без new хочется, то как-то так:
function $(arg) {
    return new $.wrapper(arg);
}

$.wrapper = function () {
    this…
};

$.wrapper.prototype = $.prototype = {
    constructor: $,
    method: function (…) {
        …
    }
};

mycoding 15.01.2010 22:19

А есть ли где-нинибь статья про это, чтобы прочитать, или учебник, я щас читаю Javascript подробное руководство 5-ое издание автор Дэвид Флэнаган уже на 157 странице, третью неделю читаю, столько всего узнал.....

Octane 15.01.2010 22:31

http://javascript.ru/tutorial/object

mycoding 15.01.2010 23:11

попробовал, этот пример, что-то не могу его доделать, если кто может, подскажите. просто хочется свой jquery написать ...

Octane 15.01.2010 23:20

ну еще у одного «jQuery головного мозга», как говорит Kolyaj :D

Что не получается то?

mycoding 16.01.2010 16:41

Должно же быть как то так, но оно не работает
function $(arg) {
	    return new $.load(arg);
	}
	 
	$.load = function () {
	   alert(1)// this…
	};
	 
	$.load.prototype = $.prototype = {
	    constructor: $,
	    method: function (…) {
	        //…
	    }
	};

Octane 16.01.2010 16:49

function $(node) {
    return new $.wrapper(node);
}

$.wrapper = function (node) {
    this.node = node;
};

$.wrapper.prototype = $.prototype = {
    constructor: $,
    load: function () {
        alert(1);
    },
    test: function () {
        alert(this.node.nodeName);
        return this;
    }
};


$(document.body).test().load();

mycoding 16.01.2010 16:57

Просто хотел показать, что получилось вот это, а теперь буду смотреть Ваш код Octane, огромное спасибо.
<html>

<body>
ljkj
<div id=my>HI</div>
</body>

</html>
<script>
function $(arg) {}

$.prototype.load = function() {alert(1);}
	 
new $('hi').load();

</script>

mycoding 16.01.2010 17:08

Octane, огромнейшее Вам спасибо...

mycoding 17.01.2010 11:10

Вот, что получилось.
А как вы считаете стоит ли так делать?
Просто есть $ а хочется в противоположность ему рубль то есть р
и все команды писать на русском.
Стоит ли так делать?
function р(id) {
	    return new р.wrapper(id);
	}
	 
	р.wrapper = function (id) {
	    this.id = id;
	};
	 
	р.wrapper.prototype = р.prototype = {
	    constructor: р,
	    загрузить: function (data) {
	        alert("this.id="+this.id+"\n");
	        alert("data="+data+"\n");
	    },
	    test: function () {
	        alert(this.id.nodeName);
	        return this;
	    }
	};

р("Привет").загрузить("Ураааа");

mycoding 17.01.2010 18:07

Можно сказать это первый релиз своего jquery, огромнейшее спасибо Octane.
Так если глянуть ничего сложного, хотя не совсем пока понимаю вот эту строчку
$.any.prototype = $.prototype = {constructor: $};

А так всё нормально. Ещё когда смотришь на jquery знак $ так пугает, думаешь это наверное что-то супер навороченное, а это просто название функции всего навсего.
<html>

<body>
ljkj
<div id=my style="border:5px solid #8899ff">HI</div>
</body>

</html>
<script>
function $$(id) 
{ 
return document.getElementById(id);
}
 
function $(id) 
{
   return new $.any(id);
}
	 
$.any = function (id) 
{
    this.id = id;
};
 
$.any.prototype = $.prototype = {constructor: $};

$.prototype.text = function(data)
{
 var id=this.id;
 $$(id).innerHTML=data;
return this;
}

$.prototype.css = function(property,data)
{
 var id=this.id;
$$(id).style[property]=data;
return this;
}

$.prototype.load = function(data)
{
 var id=this.id;
 var xml;

  if(window.ActiveXObject)
  {
   try
   {
	xml=new ActiveXObject("Microsoft.XMLHTTP");
   }
   catch (e)
   {
	xml=false;
   }
  }
  else
  {
   try
   {
	xml=new XMLHttpRequest();
   }
   catch (e)
   {
	xml=false;
   }
  }

  if(!xml) alert("Error creating the XMLHttpRequest object");

 
  xml.onreadystatechange = function()
  { 
     if(xml.readyState != 4 || xml.readyState==0)
     {   
	$$(id).innerHTML=" <img src='/img/pb.gif'> ";	
     }
     if(xml.readyState == 4)
     {
	if(xml.status == 200)
	{
  	   $(id).text(xml.responseText);
	}	
	else	
	{
	   $(id).text("Error: returned status code " + xml.status + " " + xml.statusText);
						}	
	} 
      }; 
 xml.open("GET", data, true); 
 xml.send(null);
return this;
}

$("my").text("Через 5 секунд суда загрузится другое слово")
setTimeout('$("my").text("Скоро кое что ещё поменятеся")',5000);
setTimeout('$("my").css("border","1px solid #888888")',10000);
</script>

x-yuri 19.01.2010 21:23

Цитата:

Сообщение от mycoding
Просто есть $ а хочется в противоположность ему рубль то есть р
и все команды писать на русском.

yet another 1C? Латиница используется не потому, что пендосы такие крутые, а потому, что она - lingua franca для программистов, имхо

Octane 19.01.2010 22:27

Цитата:

Сообщение от mycoding
Так если глянуть ничего сложного, хотя не совсем пока понимаю вот эту строчку
$.any.prototype = $.prototype = {constructor: $};

Ну обёртку-конструктор any ты ввел, чтобы избавится от new перед $:
function $(id) {
    return new any(id);
}

function any(id) {
    …
}

any.prototype.text = function (…) {…};

any нам не нужен больше нигде, кроме как в функции $, поэтому, чтобы он не валялся в глобальной области видимости, просто переносим его в свойства функции $:
function $(id) {
    return new $.any(id);
}

$.any = function (id) {
    …
};

$.any.prototype.text = function (…) {…};


а чтобы вообще забыть про этот any, инициализируем его прототип ссылкой на прототип $:
function $(id) {
    return new $.any(id);
}

$.any = function (id) {
    …
};

$.any.prototype = $.prototype;

$.prototype.text = function (…) {…};

теперь $.any.prototype и $.prototype указывают на один и тот же объект, но нам удобнее использовать ссылку $.prototype, про $.any.prototype забываем.

чтобы каждый раз при создании нового метода не писать $.prototype.methodName, можно сделать так:
$.prototype = {
    method1: function (…) {…},
    method2: function (…) {…},
    method3: function (…) {…}
};

но надо не забыть, что конструктор у нас $.any и методы должны находится в его прототипе:
$.prototype = {
    method1: function (…) {…},
    method2: function (…) {…},
    method3: function (…) {…}
};

$.any.prototype = $.prototype;

или короче
$.any.prototype = $.prototype = {
    method1: function (…) {…},
    method2: function (…) {…},
    method3: function (…) {…}
};

но при инициализации прототипа новым объектом, теряется ссылка на конструктор, поэтому и определяем её вручную ($.any нам не нужен, поэтому напишем просто $):
$.any.prototype = $.prototype = {
    constructor: $,
    method1: function (…) {…},
    method2: function (…) {…},
    method3: function (…) {…}
};

вот и получается та штука, что я показал в первый раз:
function $(id) {
    return new $.any(id);
}

$.any = function (id) {
    …
};

$.any.prototype = $.prototype = {
    constructor: $,
    method1: function (…) {…},
    method2: function (…) {…},
    method3: function (…) {…}
};


ссылка на конструктор хоть и не совсем правильная, но остается работоспособной, потому что return из конструктора вернет нужный объект:
var obj = new $(…); // так тоже будет работать

mycoding 19.01.2010 22:27

Аргументированно, меня тоже отбило желание эта статья на русском делать свой framework...

mycoding 19.01.2010 22:32

Если честно ничего не понял, но думаю если раз 10 прочитать то пойму...

mycoding 21.01.2010 10:44

Как сделать чтобы можно было вызвать это же метод $ например вот так
my('div1').text('Привет'); ? Можно конечно просто весь код внутри поментяь, но в jquery , как то по другому , но что-то не пойму

Octane 21.01.2010 11:13

Создать еще одну глобальную ссылку на функцию $. Читай теорию, разбирайся, а то кинулся функционал реализовать, а как основы работают не понимаешь, без этого ничего хорошего не получится.

Niar 21.01.2010 13:54

Читаю ту же книгу:) Седьмой день - 85 страница.
Очень хорошая книга.

mycoding 23.01.2010 13:07

Что то я не пойму как реализовать таймер, так в принципе пользоваться умею и setTimeout и setInterval и clearIterval
Но вот, думаю какой код делать
Такой ?
$.timer(50,function(){i++}).start();

Если такой, то как start определить, она же должна будет вызывать функцию setInterval, тогда её нужно будет иметь доступ к аргументам в timer, т.е. к 50 и function(){i++}, и к тому , чтобы её потом можно было остановить, нужно присвоить значение
т.е.
timer1=setIneterval(function(){i++},50);

И откуда этот timer1 , и делать ли его глобальным?


Или вот такой код?
$('timer1').timer(50,function(){i++});

Но в этом случае придётся вообще весь получившийся framework (хотя он маленький пока) переделывать. Поэтому отпадает.

и как вообще определять start() ? Должен ли он значения какие нибудь принмать, и должен ли возвращать как и другие себя следующим образом
return this;


Посмотрел как в js-core сделано, пока не догоняю )))
Хотя на вид вроде просто.

Главный вопрос, как потом из start() получить данные переданные в timer(50,function(){i++})????

Octane 23.01.2010 13:23

$.timer такой же конструктор, как и $, функция и параметры запоминаются в свойствах нового объекта, а метод start находится в прототипе $.timer, поэтому имеет доступ к свойствам объекта по ссылке this.

mycoding 23.01.2010 14:05

Ух вроде просто )) , буду пробовать, если честно я наверное не совсем к
ООП в js привык ).

mycoding 13.04.2010 10:21

Попробовал немного другой способ, и он вроде даже лучше и проще для понимания, можете оценить
<script>
function $$(id)
{
switch (typeof id)
{
 case "object":
  return id;
  break;
 case "string":
  if(id.search("#")!=-1)
  {   
   var referenceId=id.replace("#","");      
   var element=document.getElementById(referenceId);
   if(element){return element;}
   else {alert("Данного элемента не существует.\ndocument.getElementById(referenceId) вернула\n"+element);}
  }
  else {alert("Элемент надо указывать так:#id");}
  break;
 case "function":
  alert("function");
  break;
 default:
  alert("Этот тип не поддерживается");
}

}

function $(id)
{
this.id=id;
this.cout=cout;
this.onready=onready;
return this;
}
function cout(text){$$(id).innerHTML=text;};

function onready(toMake)
{
switch (typeof toMake)
{
 case "function":
  window.onload = toMake;
  break;
 case "string":
  window.onload = function(){eval(toMake);}
  break;
 default: alert("Ошибка в функции onready:Этот тип не поддерживается\n");
}
}
$.alert = function(text){ alert(text);}

$(document).onready("$('#test').cout('Привет');");

$.alert("Привет");

</script>
<html>
<head>
<title> Классы </title>
</head>
<body>
<div id="test"></div>
<button onclick="$('#test').cout('Ух ты');">Нажать</button>
</body>
</html>

Octane 13.04.2010 11:48

Чем лучше?
Умножать матрицы не хочешь, в прототипах разбираться не хочешь… может забить тогда на все и не мучаться?)

WarDoctor 02.10.2016 23:43

Цитата:

Сообщение от mycoding (Сообщение 40711)
Подскажите, Как сделать, чтобы это заработало.
Начинка не важна , главное сама структура записи класса
<html>
<body>
ljkj
<div id=my>HI</div>
</body>

</html>
<script>
function $(id)
{
this.load = function() {alert(1);}
}
$('my').load();
</script>

Кодировать надо правильно...
Код:

$('#my').load();



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