Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   передача параметра this (https://javascript.ru/forum/jquery/20563-peredacha-parametra.html)

KpyacH 09.08.2011 17:07

передача параметра this
 
Подскажите, пожалуйста, как правильно сделать.
Есть функция:
function printId(){
alert(this.id); // или alert($(this).id) если так вернее
}

Есть событие:
(function($) {
$(function() {
$('div').mouseover(
//здесь вызов функции printId для этого дива, на который навели мышку
);
});
})(jQuery);

Вопрос наверно больше в том, как передать в эту функцию полученный объект div, чтоб она с ним работала через this.

Возможно здесь решение через bind(), но я не знаю, как.

kobezzza 09.08.2011 17:22

$('div').mouseover(function () {
    printId.call(this);
});


А в printId
function printId () { alert(this.id); }


А вообще - это страшный быдлокод:D

Цитата:

Возможно здесь решение через bind(), но я не знаю, как.
Вообще, я настоятельно рекомендую вам на год забыть слово "JS фреймворк". 2 раза прочитать Флэнагана, разок Ресига, потом Пауэла, написать свой фреймворк, а затем можно снова возвращаться к jQuery (ну или к чему-нибудь другому)) и я вам обещаю: больше вы не зададите таких вопросов)

KpyacH 09.08.2011 17:58

Спасибо за ответ и за откровенную критику (пока не знаю, чем плох код).

Пока ждал ответа опытным путем нашел еще 2 решения:

(function($) {
    $(function() {
        $('div').mouseover(printId);
    });
})(jQuery);

(function($) {
    $(function() {
        $('div').bind('mouseover', printId);
    });
})(jQuery);

Спасибо за список литературы - она лишней никогда не бывает.

kobezzza 09.08.2011 18:13

Цитата:

пока не знаю, чем плох код
Ну могу рассказать построчно:)

(function ($) {
    $(function () {
        $('div').mouseover(
        //здесь вызов функции printId для этого дива, на который навели мышку
        );
    });
})(jQuery);


Строка 1: с какой целью здесь создаётся анонимная функция? Если для без конфликтной работы jQuery, то юзайте noConflict или sub;
Строка 3: $('div') - никогда больше так не делайте) Всегда явно обозначайте свой элемент, а в случае, если их много - делегируйте событие;

Также чувствуется явное не понимание методов jQuery.

ЗЫ: ваше решение более изящное чем моё, но я просто думал, что помимо вызова функции в обработчике, будет ещё действия (кстати this можно было передать, как простой параметр функции;)).

KpyacH 09.08.2011 18:32

Цитата:

Сообщение от kobezzza (Сообщение 119250)
Строка 1: с какой целью здесь создаётся анонимная функция? Если для без конфликтной работы jQuery, то юзайте noConflict или sub;

Честно говоря я не знаю. Просто я взял уже существующий файл .js и позаменял там функции на свои. Я пришел к выводу, что в следующей конструкции (в таком виде оно используется у меня) функции работают, а как и почему - осталось неизведанным.
jQuery.noConflict();
(function($) {
	$(function() {
		//тут вызов функций и тп.
	});
})(jQuery);

Цитата:

Сообщение от kobezzza (Сообщение 119250)
Строка 3: $('div') - никогда больше так не делайте) Всегда явно обозначайте свой элемент, а в случае, если их много - делегируйте событие;

Это упрощение, чтоб не отвлекать внимание на выбор элемнтов. На практике стоит:
$('div[id^="link_pic_menu-"]').children('.links').children('a').mouseover(...);

(Оно и так работает, но если подскажите, как упростить, буду премного благодарен)
Цитата:

Сообщение от kobezzza (Сообщение 119250)
Также чувствуется явное не понимание методов jQuery.

Да, тут я сильно плаваю.

devote 09.08.2011 18:35

$('div[id^="link_pic_menu-"] .links a').mouseover(...);

kobezzza 09.08.2011 18:40

1) Я на 99% уверен, что вы можете написать просто:
$(function() {
    //тут вызов функций и тп.
});


А событие лучше вешать так (хотя тоже кривоватый вариант, т.к. лучше создать один контейнер для делегирования)

$('div[id^="link_pic_menu-"]').delegate(".links > a", "mouseover", function () { /* тут наш код */ });

KpyacH 09.08.2011 18:42

Цитата:

Сообщение от devote (Сообщение 119255)
$('div[id^="link_pic_menu-"] .links a').mouseover(...);

Спасибо. Я сначала так и сделал, но скрипт не заработал. Видимо, дело было в другом, а я грешил на выбор элементов.

KpyacH 09.08.2011 19:03

Цитата:

Сообщение от kobezzza (Сообщение 119256)
1) Я на 99% уверен, что вы можете написать просто:
$(function() {
    //тут вызов функций и тп.
});

Я тут, как мартышка и очки... То ли не работает, как вы говорите, то ли я неправильно совет использую. У меня всего-то ничего 3 элемента:
1) объявление переменной (судя по всему это можно в любом месте делать)
2) описание собственной функции
3) вызов ее для определенных блоков ($('div[id^="link_pic_menu-"]')...)
Цитата:

Сообщение от kobezzza (Сообщение 119256)
А событие лучше вешать так (хотя тоже кривоватый вариант, т.к. лучше создать один контейнер для делегирования)

$('div[id^="link_pic_menu-"]').delegate(".links > a", "mouseover", function () { /* тут наш код */ });

Не подскажите, где доступно написано про делегирование?

ваый 09.08.2011 20:02

$('div[id^="link_pic_menu-"]')
- это не лучший вариант. Лучше:
$('div.link_pic_menu')
Читаем про delegate: http://api.jquery.com/delegate/, http://habrahabr.ru/blogs/jquery/86604/


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