Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.11.2017, 05:28
Новичок на форуме
Отправить личное сообщение для abzalb Посмотреть профиль Найти все сообщения от abzalb
 
Регистрация: 15.11.2017
Сообщений: 5

Помогите разобрать код 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();
}
}
});

Если кто знает и может дать ссылку на описание такой оптимизации кода вышлите пожалуйста.
Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 15.11.2017, 05:58
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

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

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]();
Ответить с цитированием
  #3 (permalink)  
Старый 15.11.2017, 06:13
Новичок на форуме
Отправить личное сообщение для abzalb Посмотреть профиль Найти все сообщения от abzalb
 
Регистрация: 15.11.2017
Сообщений: 5

Добрый день,

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

Благодарю за Ваш ответ.
Ответить с цитированием
  #4 (permalink)  
Старый 15.11.2017, 06:30
Новичок на форуме
Отправить личное сообщение для abzalb Посмотреть профиль Найти все сообщения от abzalb
 
Регистрация: 15.11.2017
Сообщений: 5

Добрый день,

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

Благодарю за Ваш ответ.
Ответить с цитированием
  #5 (permalink)  
Старый 15.11.2017, 10:17
Аватар для join
Профессор
Отправить личное сообщение для join Посмотреть профиль Найти все сообщения от join
 
Регистрация: 05.03.2012
Сообщений: 477

Эти три метода уже определены в самой библиотеке jQuery.
Ответить с цитированием
  #6 (permalink)  
Старый 15.11.2017, 15:08
Новичок на форуме
Отправить личное сообщение для abzalb Посмотреть профиль Найти все сообщения от abzalb
 
Регистрация: 15.11.2017
Сообщений: 5

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

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

Спасибо.
Ответить с цитированием
  #7 (permalink)  
Старый 16.11.2017, 09:47
Аватар для join
Профессор
Отправить личное сообщение для join Посмотреть профиль Найти все сообщения от join
 
Регистрация: 05.03.2012
Сообщений: 477

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


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

Последний раз редактировалось join, 16.11.2017 в 09:52.
Ответить с цитированием
  #8 (permalink)  
Старый 17.11.2017, 06:42
Новичок на форуме
Отправить личное сообщение для abzalb Посмотреть профиль Найти все сообщения от abzalb
 
Регистрация: 15.11.2017
Сообщений: 5

Добрый день,
благодарю за ответ.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с Jquery psfdek jQuery 6 27.02.2015 08:30
Преобразовать код JQUERY в JS nattt Общие вопросы Javascript 2 30.04.2014 08:01
Помогите изменить код SergoMorello AJAX и COMET 4 18.04.2013 20:32
Не работает jquery код на сайте Gvozdb jQuery 1 20.03.2013 11:57
Помогите модифицировать код JS refer5 Общие вопросы Javascript 2 22.01.2013 21:42