Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Функция-селектор наподобие jQuery (https://javascript.ru/forum/misc/30093-funkciya-selektor-napodobie-jquery.html)

shoo 23.07.2012 23:18

Функция-селектор наподобие jQuery
 
Я не очень хорошо разбираюсь в JavaScript и не могу пока разобраться в сложном для меня коде jQuery. Интересует такой вопрос, как сделать функцию-селектор по аналогии с jQuery и Prototype. Пример, хочу своим способом сделать show/hide элемента.

<div id="errorBar" onclick="selectElement(this).hide()">


Создаю функцию:
function selectElement(element) {
    this.hide = function () {
        element.style.display = 'none';
    }
}


Но консоль выдаёт ошибку:
[23:09:05.005] TypeError: selectElement(this) is undefined

Что я делаю не так и как сделать правильно? Пожалуйста, помогите.

9xakep 24.07.2012 02:00

просто напиши:
<div onclick="this.style.display = 'none'">123</div>

9xakep 24.07.2012 02:04

и то, что вы написали, так нельзя, вы сделали ф-ию конструтор:
function Parent() {
this.hide = function () { 
alert('hide')
 }
}
var child = new Parent()
child.hide() 
try {  
// но, 
Parent.hide() 
// не сработает
} catch (e) { 
alert('не сработало')
}

devote 24.07.2012 04:26

<div id="errorBar" onclick="(new selectElement(this)).hide()">123</div>
<script>
function selectElement(element) {
    this.hide = function () {
        element.style.display = 'none';
    }
}
</script>

shoo 24.07.2012 10:14

Не совсем то. Мне нужна функция-обёртка, которую можно использовать с любым DOM-объектом, не создавая при этом каких-то лишних экземпляров.

devote 24.07.2012 10:28

<div id="errorBar" onclick="selectElement(this).hide()">123</div>
<script>
function selectElement( elem ) {
    return new selectElement.prototype.init( elem );
}
selectElement.prototype = {
    constructor: selectElement,
    length: 0,
    init: function( elem ) {
        this[0] = elem;
        this.length = 1;
        return this;
    },
    hide: function() {
        var elem, i = this.length;
        for( ;elem = this[ --i ]; ) {
             elem.style.display = 'none';
        }
        return this;
    }
}
selectElement.prototype.init.prototype = selectElement.prototype;
</script>

nerv_ 24.07.2012 10:32

Цитата:

Сообщение от shoo
Мне нужна

нужна? Напиши! Ты вообще представляешь, что такое качественный кросс-барузерный селектор? Думаю, нет. А devote такой написал. Если он будет в хорошем настроении, может дать ссылку )

devote 24.07.2012 11:09

Цитата:

Сообщение от shoo
не создавая при этом каких-то лишних экземпляров.

для этих целей вам 9xakep, привел пример в первом своем посте. Там никаких экземпляров не создается. В других случаях они все равно будут создаваться.

Цитата:

Сообщение от nerv_
может дать ссылку )

а что ее давать то? она и так есть в каждом моем посте в подписи.

Dim@ 24.07.2012 12:34

<div id='div'>lol</div>
<script type='text/javascript'>
Object.prototype.hide = function (){
 var prot = this + '';
 if (/\w?\ HTML\w?/img.test(prot) == true) this.style.display = 'none';
 else if (console) console.log("Ошибка");
};
setTimeout(function(){document.getElementById('div').hide();}, 3000)
</script>

devote 24.07.2012 12:37

Цитата:

Сообщение от Dim@
Object.prototype.hide = function (){

очень плохое решение, не рекомендуется совать в стандартные прототипы объектов всякий мусор..

Dim@ 24.07.2012 12:40

devote,
хм, для кого мусор для кого нет, некоторые библиотеки не принебрегают расширением прототипов, ну а я так написал:write:

Dim@ 24.07.2012 12:41

devote,
кстати почему все всех пинают за расширение прототипов?

shoo 24.07.2012 12:44

Dim@,
Троллишь? Хотя, это самое простое и понятное решение, за исключением момента с (/\w?\ HTML\w?/img.test(prot) == true).

devote,
Не могли бы выставить комментарии? Не могу понять, каким образом работает код.

Dim@ 24.07.2012 12:49

shoo,
Цитата:

Сообщение от shoo
Не могли бы выставить комментарии? Не могу понять, каким образом работает код.

:blink: 'элементарный код не понимаете?
function selectElement(element) { //функция принимающая элемент
    this.hide = function () {//у него создается функция hide
        element.style.display = 'none';//которая изменяет style.display
    }
}

Dim@ 24.07.2012 12:51

<div id="errorBar" onclick="(new selectElement(this)).hide()">123</div>

(new selectElement(this)) - создание нового selectElement принимающего данный элемент
.hide() - скрытие

shoo 24.07.2012 13:10

Цитата:

Сообщение от devote (Сообщение 191154)
<div id="errorBar" onclick="selectElement(this).hide()">123</div>
<script>
function selectElement( elem ) {
    return new selectElement.prototype.init( elem );
}
selectElement.prototype = {
    constructor: selectElement,
    length: 0,
    init: function( elem ) {
        this[0] = elem;
        this.length = 1;
        return this;
    },
    hide: function() {
        var elem, i = this.length;
        for( ;elem = this[ --i ]; ) {
             elem.style.display = 'none';
        }
        return this;
    }
}
selectElement.prototype.init.prototype = selectElement.prototype;
</script>

Dim@, Нет, я вот про это.

devote 24.07.2012 13:14

Цитата:

Сообщение от Dim@
некоторые библиотеки не принебрегают расширением прототипов

про некоторые ты наверно имел ввиду prototype.js ?? Только она этим и занимается, других не встречал.

Цитата:

Сообщение от Dim@
кстати почему все всех пинают за расширение прототипов?

очень просто, я делаю у себя в скрипте перебор элементов и натыкаюсь на лишний метод, что не есть гуд.. Или возьми джуквери, у него есть метод, под названием isEmptyObject вот и подумай теперь, скажет она что он пустой или все же нет.
работает она по простому принципу:
function isEmptyObject( obj ) {
	for ( var name in obj ) {
		return false;
	}
	return true;
}
alert( isEmptyObject({}) ); // true

Object.prototype.test = function() {};
alert( isEmptyObject({}) ); // false
Вот за это и не любят, то что это просто может сломать другой код.

Dim@ 24.07.2012 13:19

devote,
хм,;)
Цитата:

Сообщение от devote
про некоторые ты наверно имел ввиду prototype.js ?? Только она этим и занимается, других не встречал.

вроде ещё motools занимается

devote 24.07.2012 13:21

Цитата:

Сообщение от Dim@
вроде ещё motools занимается

другие библиотеки, могут добавлять прототипы лишь в тех случаях когда их нет в таком то браузере, но они есть в стандартах. Тогда можно добавить/расширить возможности браузера методами которые описаны в стандартах, но не более того.

devote 24.07.2012 13:27

shoo,
с учетом того что вы не понимаете как работают конструкторы, боюсь мои коменты вам вряд ли чем помогут, вам нужно почитать книжку для начала, понять что с чем едят. Там все подробно описано что и как, и даже примеры того что я сделал есть.

PeaceCoder 24.07.2012 13:57

А просто дать ссылку на мануал по обьектам и конструкторам слабо? Если человек не глупый - сам разберется.

http://javascript.ru/tutorial/object

devote 24.07.2012 14:05

PeaceCoder,
я не читал эти книжки, уж простите, от того и ссылками затрудняюсь. Но по слухам знаю что книжки хорошие, Илья молодец, у него в крови разжевывать все до мелочей. Что не скажу о себе, с меня учитель хреновый. Я могу показать, объяснить, но вряд ли с первого раза кто поймет.

shoo 24.07.2012 14:57

devote,
Почему не понимаю как работают конструкторы? Просто ООП JS непривычно для меня. Неужели так трудно проставить несколько комментариев к коду.

shoo 24.07.2012 16:43

function selectElement(element) {
            var selectModify = function() {
                this.hide = function() {
                    element.style.display = 'none';
                }
            }

            return new selectModify();
        }


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