Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Помогите разобрать код jQuery (https://javascript.ru/forum/jquery/71389-pomogite-razobrat-kod-jquery.html)

abzalb 15.11.2017 05:28

Помогите разобрать код jQuery
 
Добрый день.

Есть один пример страницы на jQuery. Не могу понять и к тому же найти описание данного метода в учебниках по JS и jQuery.

Вот кусок html, который связан с кодом jQ.

<div class="panel box">
<h2>Test Subjects</h2>

<div class="test-subjects clearfix">
<div class="test-subject">bla-bla</div>
<div class="test-subject"><img src="images/limes.png" alt=""/>
</div>
<div class="test-subject">bla-bla.</div>
<div class="test-subject"><img src="images/belt.png" alt=""/>
</div>
</div>

</div>
у нас есть 4 элемента div с классом "test-subject".
в коде собираем набор этих элементов в переменной:
var $testSubjects = $('.test-subject');

далее есть обработчик нажатия на кнопку, который переменной effect присваивает одно из значении: 'show', 'hide', 'toggle'.
это строковые значения.

теперь сам не понятный кусок кода:
if ((effect === 'show' || effect === 'hide' || effect === 'toggle') && speed === 'none') {
$testSubjects[effect]();
}

мне не понятен вызов: $testSubjects[effect]();
по результату работы кода я понял, что данный вызов означает следующее:
для всех элементов из набора $testSubjects применить метод show(), если effect==='show', или метод hide(), если effect==='hide'.

не в одной документации не нашел описание данного метода вызова методов high и тд.

строку $testSubjects[effect](); заменил на ниже указанный код и получил этот же результат для show и hide. этот подход мне более понятен чем $testSubjects[effect]()

$testSubjects.each(function(){
if (effect === 'show') {
$(this).show();
} else {
if (effect === 'hide') {
$(this).hide();
}
}
});

Если кто знает и может дать ссылку на описание такой оптимизации кода вышлите пожалуйста.
Спасибо.

laimas 15.11.2017 05:58

А так было бы понятно?

var fun = {
    one: function() {
        alert(1)
    },
    two: function() {
        alert(2)
    },
    three: function() {
        alert(3)
    }
},
run = 'two';

if(run == 'one' || run == 'two' || run == 'three') fun[run]();

abzalb 15.11.2017 06:13

Добрый день,

конечно, так намного понятнее.
просто мне интересно как работает $testSubjects[effect]();
мы ведь явно не определяли объект $testSubjects с его свойствами show, hide. где и как это происходит.

Благодарю за Ваш ответ.

abzalb 15.11.2017 06:30

Добрый день,

конечно, так намного понятнее.
просто мне интересно как работает $testSubjects[effect]();
мы ведь явно не определяли объект $testSubjects с его свойствами show, hide. где и как это происходит.

Благодарю за Ваш ответ.

join 15.11.2017 10:17

Эти три метода уже определены в самой библиотеке jQuery.

abzalb 15.11.2017 15:08

Добрый вечер,

просто не видно явно, как они (show() & hide()) связались с $testSubjects[effect]();
хорошо, вместо effect мы подставляем show, т.е. $testSubjects[show](), но мы нигде не определяем объект $testSubjects в виде:
$testSubjects{
show: function(){show();}
}
единственное место, где определен $testSubjects:
var $testSubjects = $('.test-subject');

Спасибо.

join 16.11.2017 09:47

$testSubjects.show() === $testSubjects['show']()


ваша переменная $testSubjects - уже определена в библиотеке jq как шаблонный html object и для этого объекта уже существует готовый метод .show() запускаемый как функция. Вы подставили на место этого объекта -> $() свою переменную. var $testSubjects = $('.test-subject');

abzalb 17.11.2017 06:42

Добрый день,
благодарю за ответ.


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