2013-09-17 3 views
0

Допустим, у меня есть следующий HTML:Эталонные несколько элементов в одной переменной

<div class="city"> 
    <div class="building"></div> 
    <div class="street"></div> 
    <div class="house"></div> 
</div> 
<div class="city"> 
    <div class="building"></div> 
    <div class="street"></div> 
    <div class="house"></div> 
</div> 

Я хочу, чтобы все в переменной, так что я мог бы сделать:

var city = $('.city'), 
    building = city.find('.building'), 
    street = city.find('.street'), 
    house = city.find('.house'); 

Есть еще один способ сделать это как-то в переменной, чтобы облегчить ситуацию?

var city = $('.city'); 
city[building = $('.building')]; 
city[street = $('.street')]; 
city[house = $('.house')]; 

Так что я могу получить доступ позже как-то нравится:

city[0] 

или

city[building] 

?

+1

Как ваш второй пример проще первого? – dezman

+0

Вы правы в этом случае, но в реальном случае я пытаюсь сделать имена переменных понятными, поэтому он становится сложным. – Alvaro

ответ

1

Да, вы можете использовать объект:

var city = {}; 
city.element = $('.city'); 
city.building = city.element.find('.building'); 
city.street = city.element.find('.street'); 
city.house = city.element.find('.house'); 

Есть множество способов создания этого. Например .:

var el = $('.city'); 
var city = { 
    building: el.find('.building'), 
    street: el.find('.street'), 
    house: el.find('.house') 
}; 
city.element = el; // If you need it 

В обоих случаях, позднее использование:

city.building.css("color", "green");  // Turn text within each building green 
city.building.eq(0).css("color", "green"); // Turn the text within just the first building green 

Это дословный ответ на ваш вопрос, но я думаю, что я, вероятно, структурировать вещи немного по-другому. Вот как:

var cities = $(".city").map(function(city) { 
    var $city = $(city); 
    return { 
     element: $city, 
     building: $city.find('.building'), 
     street: $city.find('.street'), 
     house: $city.find('.house') 
    }; 
}).get(); 

(Обратите внимание на .get() в конце концов, это легко пропустить.)

Тогда что записи для городов, а также свойства на записях города являются специфическими для , что город. Со структурой над линией («буквальный ответ») вы можете получить building с четырьмя совпадениями, но element имеет больше, чем это (потому что некоторые элементы не содержат .building).

Так, чтобы использовать их:

cities[0].building.css("color", "green"); 
+0

Спасибо, не могли бы вы дать мне ссылку на какой-то учебник или информацию? Все, что я могу найти, это (я думаю) сложные объекты с функциями внутри. – Alvaro

+0

@ Алваро: Пожалуйста. Вероятно, вы хотите прочитать хорошую книгу о JavaScript. Мне понравился Flanagan * JavaScript: The Definitive Guide *, и я не могу быть один, как сейчас, в своем 6-м издании. :-) MDN предлагает [страница об объектах] (https: //developer.mozilla.орг/EN-US/Docs/Web/JavaScript/Руководство/Working_with_Objects). Я пишу о JavaScript [в своем блоге] (http://blog.niftysnippets.org/search/label/javascript), но я не думаю, что я конкретно задал эту тему. –

+0

Еще раз спасибо. Последнее, как я могу получить доступ к .building, принадлежащему к especific .city (скажем, какой-то город не вернет ничего, потому что у них нет .building)? город [1] .buiding, city.element [1] .building, похоже, не работает. – Alvaro

0

Вы можете расширить селектор внутри find():

var props = $('.city').find('.building, .street, .house') 

В вашем случае, он будет возвращать 6 элементов (3 для каждого из элементов с .city класса) , к которым можно получить доступ, например props[index]

Смежные вопросы