Последнее время мне всё чаще задают вопрос как выбрать тот или иной элемент в DOM’е, и данный пост будет сплошь посвящен селекторам в jQuery, возможно большинство из них Вы видели в различных источниках, но собрать их воедино все же стоит…
Материалы данной статьи включены в учебник «jQuery для начинающих». Учебник распространяется бесплатно, и сопровождается интерактивными примерами.
Во всех примерах используется сокращенный вариант вызова jQuery методов, используя функцию $ (знак доллара)
Селекторы в jQuery базируются на CSS селекторах, а так же поддерживают XPath. Дабы не закапываться в документацию буду приводить примеры, много примеров. Но начнем с самых азов…
Для начала нам понадобиться макет HTML странички (вполне типичный макет):
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | < div id = "header" > < h1 >< a href = "/" title = "homepage" >Title</ a ></ h1 > < h2 >Sub-title < span >small description</ span ></ h2 > </ div > < div id = "wrapper" > < div id = "content" > < div class = "post" > < h3 >Post Title</ h3 > < p >Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed viverra tempus sapien. Cras condimentum, tellus id lacinia fermentum, tortor lectus tincidunt sapien, vel varius augue tortor vel tortor.</ p > < span >Image Title</ span > < img src = "/image1.jpg" alt = "Image Alt Text" /> < p >Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed viverra tempus sapien. Cras condimentum, tellus id lacinia fermentum, tortor lectus tincidunt sapien, vel varius augue tortor vel tortor.</ p > < span class = "inner-banner" >Banner Text</ span > < p >Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed viverra tempus sapien. Cras condimentum, tellus id lacinia fermentum, tortor lectus tincidunt sapien, vel varius augue tortor vel tortor.</ p > </ div > < span id = "banner" >< img src = "/banner1.jpg" alt = "Big Banner" /></ span > < div class = "post" > < h3 >Post Title</ h3 > < p >Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed viverra tempus sapien. Cras condimentum, tellus id lacinia fermentum, tortor lectus tincidunt sapien, vel varius augue tortor vel tortor.</ p > < span >Image Title</ span > < img src = "/image2.jpg" alt = "Image Alt Text" /> < p >Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed viverra tempus sapien. Cras condimentum, tellus id lacinia fermentum, tortor lectus tincidunt sapien, vel varius augue tortor vel tortor.</ p > < span class = "inner-banner" >Banner Text</ span > < p >Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed viverra tempus sapien. Cras condimentum, tellus id lacinia fermentum, tortor lectus tincidunt sapien, vel varius augue tortor vel tortor.</ p > </ div > </ div > </ div > < div id = "sidebar" > < ul > < li >< a href = "/item0.html" >Menu Item 0</ a ></ li > < li >< a href = "/item1.html" >Menu Item 1</ a ></ li > < li >< a href = "/item2.html" >Menu Item 2</ a ></ li > < li >< a href = "/item3.html" >Menu Item 3</ a ></ li > </ ul > </ div > < div id = "footer" > Copyright © 2008 </ div > |
А теперь приступим к выборкам:
Выбор элементов по Id либо ClassName аналогично используемому в CSS
1 2 3 4 | $( '#sidebar' ); // выбор элемента с id = sidebar $( '.post' ); // выбор элементов с class = post $( 'div#sidebar' ); // выбор элемента div с id = sidebar $( 'div.post' ); // выбор элементов div с class = post |
Примечание: используйте валидные имена классов и id
Бродим по иерархии объектов в DOM’е
Простой выбор потомков:
1 | $( 'div span' ); // выбор всех span элементов в элементах div |
Аналогичный результат так же можно получить используя следующую конструкцию:
1 | $( 'div' ).find( 'span' ); // выбор всех span элементов в элементах div |
Выбор только непосредственных потомков
1 | $( 'div > span' ); // выбор всех span элементов в элементах div, где span является прямым потомком div'a |
Как же лучше поступить, что работает быстрее? Надо бы протестировать…
Так же селекторы можно группировать:
1 | $( 'div, span' ); // выбор всех div и span элементов |
Поиск по соседям:
1 2 3 4 | $( 'span + img' ); // выбор всех img элементов перед которыми идут span элементы $( 'span ~ img' ); // выбор всех img элементов после первого элемента span $( '#banner' ).prev(); // выбор предыдущего элемента от найденого $( '#banner' ).next(); // выбор следующего элемента от найденого |
Выбор всех элементов, всех предков, всех потомков
1 2 3 4 5 6 7 | $( '*' ); // выбор всех элементов $( 'p > *' ); // выбор всех потомков элементов p $( 'p' ).children(); // -- $( 'p' ).parent(); // выбор всех прямых предков элементов p $( '* > p' ); // выбор всех предков элементов p (скорей всего Вам не понадобится) $( 'p' ).parents(); // -- $( 'p' ).parents( 'div' ); // выбор всех предков элемента p которые есть div (parents принимает в качестве параметра селектор) |
Фильтры
Фильтров в jQuery реализовано достаточно много, и пользоваться ими одно удовольствие:
01 02 03 04 05 06 07 08 09 10 | $( 'div:first' ); // выбираем первый div в доме $( 'div:last' ); // выбираем последний div в доме $( 'div:not(.red)' ); // выбираем div'ы у которых нету класса red $('div:even '); // выбираем четные div' ы $( 'div:odd' ); // выбираем нечетные div'ы $('div:eq(N) '); // выбираем div идущим под номером N в DOMe $(' div:gt(N) '); // выбираем div' ы, индекс которых больше чем N в DOMe $( 'div:lt(N)' ); // выбираем div'ы, индекс которых меньше чем N в DOMe $(':header '); // выбо заголовоков h1, h2, h3 и т.д. $(' div:animated'); // выбор элементов с активной анимацией |
Фильтры по контенту и видимости:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | $( 'div:contains(text)' ); // выбираем div'ы содержащие текст $('div:empty '); // выбираем пустые div' ы $( 'div:has(p)' ); // выбираем div'ы которые содержат p $('div.red ').filter(' .bold ') // выбираем div' ы которые содержат класс red и класс bold $( 'div:hidden' ); // выбираем скрытые div'ы $('div:visible '); // выбираем видимые div' ы [/code] Так же есть фильтры по атрибутам: [code lang= "javascript" ] $( "div[id]" ); // выбор всех div с атрибутом id $( "div[title='my']" ); // выбор всех div с атрибутом title=my $( "div[title!='my']" ); // выбор всех div с атрибутом title не равного my $( "div[title^='my']" ); // выбор всех div с атрибутом title начинающихся с my // <div title="myCat">,<div title="myCoffee">, <div title="my..."> $( "div[title$='my']" ); // выбор всех div с атрибутом title заканчивающихся на my // <div title="itsmy">,<div title="somy">, <div title="...my"> $( "div[title*='my']" ); // выбор всех div с атрибутом title содержащим my // <div title="itsmy">,<div title="myCat">, <div title="its my cat">,<div title="...my..."> |
так же стоит отдельно отметить следующий фильтр:
1 | $( "a[rel~='external']" ); // выбор всех A с атрибутом rel содержащим external в списке значений разделенных пробелом |
В результате его работы будут выбраны следующие теги:
1 2 3 4 5 | <a href= "" rel= "external" >link</a> — да <a href= "" rel= "nofollow external" >link</a> — да <a href= "" rel= "external nofollow" >link</a> — да <a href= "" rel= "friend external follow" >link</a> — да <a href= "" rel= "external-link" >link</a> — нет |
Для работы с элементами форм есть ряд селекторов позволяющий выбирать по типу элемента и фильтров – enabled/disabled/selected/checked :
1 2 3 4 5 | $( ":text" ); // выбор всех input элементов с типом =text $( ":radio" ); // выбор всех input элементов с типом =radio // и так далее $( "input:enabled" ); // выбор всех включенных элементов input $( "input:checked" ); // выбор всех отмеченных чекбоксов |
Фильтры так же можно группировать:
1 | $( "div[name=city]:visible:has(p)" ); // выбор видимого div'a с именем city, который содержит тег p |
Приведу так же ряд полезных селекторов для работы с элементами форм:
1 2 3 | $( "form select[name=city] option:selected" ).val(); // получение выбранного(-ых) элементов в селекте city $( "form :radio[name=some]:checked" ).val(); // получение выбранного значения радиобатона с именем some $( "form :checkbox:checked" ); // выбор всех выбранных чекбоксов |
Примеры из ныне недоступной статьи “jQuery: 8 полезных советов при работе с элементом SELECT”:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // 1. удалить все элементы списка mySelect $( 'select[@name=mySelect] option' ).remove(); // 2. добавить в список новый элемент $( 'select[@name=mySelect]' ).append( '<option>Новый элемент списка</option>' ); // 3. сделать выделенным первый пунки списка $( 'select[@name=loadFileName] option:first' ).attr( 'selected' , 'yes' ); // 4. принудительно снять выделение с элемента списка $( 'select[@name=loadFileName] option:first' ).removeAttr( 'selected' ); // 5. получить значение выделенного пункта из списка // если вы используете атрибут <option value="some value">: var file = $( 'select[@name=loadFileName] option:selected' ).val(); // если вас интересует то, что заключено между <option>...</option>: var file = $( 'select[@name=loadFileName] option:selected' ).text(); // 6. проверить, выбран ли какой-нибудь элемент списка if ( typeof $( 'select[@name=loadFileName] option:selected' ).text() === 'undefined' ){ alert( 'Ни один элемент списка не выбран' ); } // 7. превратить список в "автомасштабируемый" $( 'select[@name=loadFileName]' ).attr( 'size' , $( 'select[@name=loadFileName] option' ).size()); // 8. сделать недоступны для выбора отдельный элемент $( 'select[@name=loadFileName] option:contains(' текст нужного элемента ')' ).attr( 'disabled' , 'disabled' ); // разрешить выделение всех ранее недоступных элементов можно так: $( 'select[@name=loadFileName] option:disabled' ).removeAttr( 'disabled' ); |
Если Вам хочеться опробовать как это все работает – то для этого можете воспользоваться тестовой страничкой
Слайды
Как-то слишком много текста получилось, пожалуй пора показывать слайды ;)














Данная статья написана с использованием следующих ресурсов:
Цикл статей
- jQuery для начинающих
- jQuery для начинающих. Часть 2. JavaScript Меню
- jQuery для начинающих. Часть 3. AJAX
- jQuery для начинающих. Часть 4. Селекторы
- jQuery для начинающих. Часть 5. Эффекты
- jQuery для начинающих. Часть 6. События
- jQuery для начинающих. Часть 7. Пишем плагины
- jQuery для начинающих. Часть 8. Расширяем фильтры
- jQuery для начинающих. Часть 9. Пишем плагины анимации
А с выходом jQuery 1.3 изменилась поддержка селекторов? Это же вроде основная часть где есть изменения между 1.2 и 1.3.
PS: К слову о селекторах: http://blog.jquery.com/2008/10/28/jquery-pumpkin/ =)
@EvilFaeton:
Принцип работы селекторов не изенился, ибо он основывается на CSS3 – были оптимизирована их работа – это да, да еще был добавлен event live – который отслеживает изменения в DOM’е и вешает соответствующие обработчики на новые элементы…
Более подробно можно почитать на домашней страничке проекта Release: jQuery 1.3
Нет,я про это:
Насколько я помню бета версия 1.3 с селекторами xPath не дружила, в финальной версии, он xPath поддерживает?
Давно читаю ваш блог и посты про jquery всегда в закладках валялись, так как плотно с ним сталкиваться не приходилось. И вот буквально на днях пришлось реализовывать сложное меню, прочитал два первых урока и все получилось, спасибо!
За эту статью тоже большое спасибо, но тут, слава богу знаний о селекторах достаточно) Очень хотелось бы увидеть статью про события, надеюсь она у вас в задумках ;)
Есть еще 2 вида селекторов атрибутов:
$(
"a[rel~='external']"
);
// выбор всех A с атрибутом title содержащим my в списке значений разделенных пробелом
rel="external" — да
rel="nofollow external" — да
rel="external nofollow" — да
rel="friend external follow" — да
rel="external-link" — нет
$(
"a[hreflang|='en']"
);
// выбор всех A с атрибутом hreflang начинающемся на en в списке значений разделенных дефисом
hreflang="en-us" — да
hreflang="en-en" — да
hreflang="us-en" — нет
Первый способ нормально работает в jQuery, а вот второй в версии 1.3.1 вроде не правильно, но код, обрабатывающий селектор такого вида точно есть :)
А еще в статье нет упоминания о том, что можно группировать селекторы атрибутов:
$(
"a[hreflang|='en'][rel~='external']"
)
и использовать составные селекторы:
$(
"#sidebar, .post"
)
Спасибо – добавлю Ваши примеры…
$(
"form :radio[name=some]:selected"
).val();
// получение выбранного значения радиобатона с именем some
Здесь небольшая ошибка. Вместо selected должно быть checked.
Наверное все таки A с атрибутом rel
Спасибо за хорошую подборку в одном месте и за удобные слайды, можно было бы их еще скачать в шпаргалку ;)
Таки да, исправил – спасибо…
Антон, после фичи СЛАЙДЫ я окончательно стал Вашим поклонником =)
Очень редко в интернете встретишь людей, которые на доступном языке и с применением хороших методов обучения (слайды,примеры,практика,дискуссия) умеют объяснять суть. Спасибо за Ваше желание создавать кладези грамотной инфы, не перенасыщенные лишним контентом.
Антон, у меня как раз есть вопрос на счет обращения к элементу. Мне необходимо узнать реальную ширину и длину изображения.jpg Пробовал пользоваться функциями Height.. , но они показывают данные о размерах, заданных в CSS.
P.S. Подскажите, пожалуйста, какой программой Вы создаете эти слайды? Мне она очень поможет, я обладаю похожими с Вами качествами объяснять людям и делаю это постоянно, но вот средств не хватает, программных средств.
Насчет получения размера изображение – $(‘img’).attr(“width”) …
Слайды создавались с помощью фотошопа – минута на слайд – не так уж и много :) Слайдшоу сделано с помощью плагина (a) Slideshow
Для будущих посетителей допишу:
Дякую, за статтю, хоча біля 90% було мені відомо, все одно цікаво почитати.
А слайди – то взагалі бомба.
хм, почему то у меня $(’#id’).attr(”width”) … выдает значение 0. Как только не провобыл извлечь размер изображения, результат всё тот же: вместо реальных значений ширины и высоты (разрешения изображения) выдаются значения ширины и высоты, заданные в для самого элемента страницы (например, в коде css).
В чем может быть дело?
P.S.
А вот $(’#id’).attr(”src”)… действительно выдает имя файла с изображением, здесь всё правильно срабатывает.
Якщо в рисунка не заданий атрибут width – то jQuery нічого не поверне, бо вона не тягне ширину зображення з сервера, а тягне з атрибутів (а атрибут src завжди потрібно задавати, на відміну від ширини).
Отвечаю сам.
Выход я нашел только один, т.к. в языке судя по всему не предусмотрены такие тривиальные вещи, …
Итак,
var
hugeimage=
new
Image();
hugeimage.src=currentsrc+
".jpg"
;
cc=hugeimage.width;
dd=hugeimage.height;
Переменные cc и dd теперь можно использовать при задании размеров изображения:
$(
"#enlargedimage"
).css({width: cc, height: dd, opacity:
"1.0"
});
/* показать картинку на экране монитора в натуральную величину */
Если у вас код достаточно простой, то возможно он позволит поступить ещё проще:
Просто не задавайте нигде размеров увеличенного изображения (того, что будет показываться при клике на маленькое изображение) – ни в тэге img (в моем случае он имеет id=enlargedimage), ни в css, ни функциями Height(здесь размер в пикселях) и Width(здесь размер в пикселях).
Тогда при загрузке увеличенного изображения браузер сам определит необходимые ширину и высоту для этого изображения,и они будут равняться реальным ширине и высоте изображения (его разрешению).
@Sergio:
$(“#id”).attr(“width”) действительно работает только в том случае если размер не задан ни через CSS, ни через атрибуты…
Толковая, подробная статья, спасибо.
Только конструкции типа div:first и div:last, наверное, правильнее все-таки, называть не фильтрами, а псевдоклассами.
CSS-фильтрами обычно называют:
CSS-спецэффекты от Микрософт, такие как тень, отражение и пр.
Или CSS-хаки — селекторы, срабатывающие только в определенных бразуерах, например * html для IE.
Антон скажи пожалуйсто что такое .siblings попроще и поподробней, совсем непойму что-то..
Книжку достал jQuery in Action, интересно достаточно.
Антон, ты наверняка работал с jQuery tools. Я только новичок, и мне необходима помощь толковых программистов.
Вот здесь (http://flowplayer.org/tools/demos/overlay/external.html) описана функция:
$(
function
() {
// if the function argument is given to overlay, it is assumed to be the onBeforeLoad event listener
$("a[rel]").overlay(
function
() {
// grab wrapper element inside content
var
wrap =
this
.getContent().find("div.wrap");
// load only for the first time it is opened
if
(wrap.is(":empty")) {
wrap.load(
this
.getTrigger().attr("href"));
}
});
});
При этом для селектора можно задать параметры:
$(
function
() {
$("a[rel]").overlay({
// custom expose settings
expose: {
color:
'#BAD0DB'
,
opacity: 0.7
}
});
});
А можно ли их объединить? То есть чтобы в работе первой функции учитывались параметры второй?
Насколько я помню:
$(
"a[rel]"
).overlay(
function
() {
// ...
});
Аналогично записи:
$(
"a[rel]"
).overlay({onBeforeLoad:
function
() {
// ...
}});
Т.е. callback функцию передавайте в качестве параметра onBeforeLoad…
Здравствуйте, может не в ту тему пишу, но очень надеюсь на вашу помощь!
У меня такая проблемка, мне нужно узнать загружен ли iframe или нет, т.е. сработало у него событие onLoad …..
Для чего мне это надо …..
У меня есть строки в таблице, которые я могу редактировать посредством ajax ….. А вот сохранение происходит через iframe, чтобы не перегружать страницу. Допустим я несколько записей открыла для редактирования и хочу их всех сразу сохранить. Нажимаю на кнопку сохранить все и вызываю функцию saveAll(form) в которой делаю следующее: перебираю все ссылки, начинающиеся с слова save_ и вызываю обработчик на onclick
$(
'a[@id^=save_]'
).each(
function
()
{
$(
this
).click();
});
Сам обработчик навешивается на событие в другом участке кода так
/* save icon click handler */
$(
'a[@id=save_'
+id+
']'
).click(
function
()
{
inlineObject.submitInputContent(id, key,
"edit"
);
UnblockRecordInline(inlineObject.edit_link,key,id);
});
Получается что для каждой записи вызывается функция submitInputContent, которая делает сабмит формы в iframе, а потом этот iframe удаляется.
И вот мне нужно как то узнать загружены ли в iframe данные после сабмита или нет. Суть всего этого следующая, что если хоть одна из записей после сабмита вернула ошибку то я делаю один код, если нет, то другой …..
К сожалению, я не совсем понял решаемую задачу, но насчет загрузки iframe – это отслеживается следующим образом:
$(
'iframe'
).ready(
function
() {
$(
'body'
, $(
'iframe'
).contents()).html(
'Hello World!'
);
});
Но у меня сложилось впечатление, что использование фреймов в данном случае неверно – лучше уж использовать AJAX
Скажите, а как выбрать в div другой div с id=test, а в нём изображение?
<
div
class
=
"wrap"
>
<
div
id
=
"test"
>
<
img
..../>
</
div
>
</
div
>
так верно?
...
this
.getContent().find(
"div.wrap #test img[title]"
)
...
Есть таблица, в ней кнопки и спэны:
<
td
><
button
id
=
"btn1"
>Click Me</
button
></
td
>
<
td
><
span
>Нужный текс</
span
></
td
>
Как при обработке нажатия на кнопку получить доступ к тексту спэна?
Я уже запутался с parent, child и sibling Ж(
Надо изменить ссылку на XML-файл при загрузке документа
<link
id="os"
rel="search"
type="application/opensearchdescription+xml"
href="http://transcriptor.ru/transcription/pinyin-russian/plugins/os-ie.xml" />
<script type="text/javascript">
<!--//--><![CDATA[//><!--
$("#os").attr({href,"http://transcriptor.ru/transcription/pinyin-russian/plugins/os.xml"});
//--><!]]>
</script>
Подскажите, почему не работает?
Небольшая ошибка в синтаксисе, должно быть:
$(
"#os"
).attr(
"href"
,
"http://transcriptor.ru/transcription/pinyin-russian/plugins/os.xml"
);
// либо
$(
"#os"
).attr({href:
"http://transcriptor.ru/transcription/pinyin-russian/plugins/os.xml"
});
Хм, почти та же ошибка, что и у NASA, когда они потеряли спутник.
Спасибо, вроде все заработало. Правда, вылез другой баг уже связанный с браузером. :(((
Здравствуйте! Хочу попросить вашей помощи в одном вопросе.
У меня есть код:
$(document).ready(
function
()
{
$(
'#timeval'
).text =
''
;
var
refreshId = setInterval(
function
()
{
$(
'#timeval'
).load(
'/ajax/refresh/'
+ Math.random());
}, 4000);
});
Он подгружает каждые 4 секунды вывод php-странички.
Все прекрасно, только вот никак не смог отыскать в интернете, как сделать так, чтобы при получении текста , начинающегося с
“done” , обновление страницы бы прекращалось.
( в интернете нашел, что обновление странички останавливается с помощью clearInterval(refreshId); )
Интересует сама возможность определить регулярным выражением, что пришедший текст начинается с “done”.
Подскажите решение, если не трудно
Все спасибо, разобрался.
сделано конечно по извращенному, но тут сроки поджимают.
Может кому пригодится
var txt = $(‘#timeval’).attr(‘innerHTML’);
далее , preg_match’ем по txt ищем строку.
Статья суперская! Поэтому подумал, может тут кто-нибудь поможет с моей проблемкой.
Еще раз поднимаю тему-вопрос о картинках.
Проблема: не все браузеры показывают реальные размеры изображения. IE – показывает, GoogleChrome – нет.
$(document).ready(
function
(){
//Создаем строку (две картинки).
var
stroka =
""
;
stroka +=
"<img id='pics1' src='pics/101-02-01.jpg'>"
;
stroka +=
"<img id='pics2' src='pics/101-02-02.jpg'>"
;
//Вставляем строку в <div id='forlink5'></div> .
$(
'#forlink5'
).html(stroka);
//Перечисляем всех деток ('img') у элемента 'forlink5'
//и смотрим какие у них размеры ('w' и 'h').
$(
'#forlink5'
).find(
'img'
).each(
function
(i){
var
w = $(
this
).width();
var
h = $(
this
).height();
var
src = $(
this
).attr(
"src"
);
alert(
"W="
+w+
", H="
+h+
", SRC="
+src);
});
});
Читал на других форумах, что мол картинка може уже находится в кеше и т.д. и т.п. Говорю сразу… это я уже проходил.
Нужен вариант, чтобы определения размера картинки не зависело от наличия кеша и/или картинки в нем.
Вариант получения размера при помощи PHP тоже не подходит.
Решение должно быть в рамках JavaScript (и jQuery).
А вариант из следующей заметки вам не подходит? http://anton.shevchuk.name/javascript/ger-real-image-size-with-jquery/
Возникла проблема.
В начале одного из моих скриптов стоит такой код
$(document).ready(
function
(){
$(
"#report tr:has(h2)"
).addClass(
"od"
);
$(
"#repor tr:has(li)"
).addClass(
"od2"
);
});
Делал я его в Опере, все работало. Когда начал проверять в других браузерах, то работать не хочет. Причем не назначаются именно классы. С этими классами связаны как CSS так и обработчики событий (кликов) по именам этих классов.
Если изменить селектор например на
$(“#report tr:odd”).addClass(“od”);
то сразу же появляется и должный стиль класса и на клик реагирует.
Отсюда вопрос. Есть ли разница в обработке селектора has() для разных браузеров и если есть, то как с этим боротся.
Дядя Вова,
ответственно заявляю, что строчка
$(
"#report tr:odd"
).addClass(
"od"
);
работает в MozillaFirefox, GoogleChrome, IE, Opera.
Сам специально сейчас по-быстренькому накидал код и посмотрел. Все работает. Поэтому рекомендирую просмотреть свой код на наличие очепяток.
Вы не поняли. Я как раз и говорил, что
$(“#report tr:odd”).addClass(“od”);
работает. Не работает
$(“#report tr:has(h2)”).addClass(“od”);
Но этот вопрос уже решен. Идентификатор класса h2 у меня стоял в таблице сразу после tr. Когда я перенес его в ячейку все начало работать. Опера видела его на прежнем месте, а остальные не видели.
Извините еще один вопрос. Этот скрипт по кликам скрывает и показывает строки таблицы. Но в IE только скрывает строки, а показывать не хочет (не срабатывает toggle()). Как мне объясняли это особенность и ограничение IE. Можно ли это как то обойти.
Тэг [h2] сразу после [tr] – это конечно же нехорошо. Зачем так пугать браузеры? Они и так все пуганые… Чтобы сделать рабочий скрипт под все браузеры и без того столько сил уходит.
Что касается toggle… то я сам использую hide() и show().
Вот примерчик:
<script language=
"javascript"
>
$(document).ready(
function
(){
$(
"#knopka1"
).click(
function
(){
state = $(
'#shtukovina'
).css(
"display"
);
if
(state ==
"none"
) {
$(
'#shtukovina'
).show();
}
else
{
$(
'#shtukovina'
).hide();
}
});
});
</script>
и вот html-код к этому скрипту:
<
a
id
=
'knopka1'
> [KNOPKA] </
a
>
<
div
id
=
'shtukovina'
> SHTUKOVINA </
div
>
Работает в IE6.0, Firefox, Chrome, Opera, Iron.
Спасибо. Как в Опере, так и в IE работает.
Здравствуйте!
Подскажите, будьте добры.
есть список – 3-х уровневое меню
<
div
id
=
"page-listw"
>
<
ul
><
li
>Пункт 1
<
ul
><
li
>Пункт 1-1
<
ul
><
li
>Пункт 1-1-1
</
li
></
ul
>
</
li
></
ul
>
</
li
></
ul
>
</
div
>
И такой код.
<script type=
"text/javascript"
>
$(document).ready(
function
() {
$(
'#page-listw'
).click(
function
() {
if
($(
this
).hasClass(
"noactive"
)) {
$(
this
).removeClass(
"noactive"
);
}
else
{
$(
this
).addClass(
"noactive"
);
}
});
});
</script>
При щелчке по пункту меню класс меняется у всех #page-list ul li, а нужно, чтобы менялся только у того, по которому щелкнули.
Будьте добры, подскажите.
$(
'#page-listw li'
).click(
function
() {
$(
this
).toggleClass(
'noactive'
);
});
Антон, класс меняется у всех li в блоке #page-listw.
А нужно только у текущей. Как-то неправильно работает this
Добрый день, Антон.
Подскажите, пожалуйста, как быть.
Имеется таблица.
<
table
>
<
tr
>
<
td
><
input
type
=
"checkbox"
></
td
>
<
td
>Text</
td
>
<
td
>Text</
td
>
</
tr
>
</
table
>
Необходимо что бы при клике на строке чекбокс активировался/деактивировался. Как можно обратиться к чекбоксу текущей строки?
Заранее благодарен.
Неплохо бы в раздел “Бродим по иерархии” добавить “siblings” для полноты описания
Скажите пожалуйста, а как написать, чтобы ссылка стала неактивной, тоесть присвоить ее href значению # ?
Немного странная реализации “неактивности”, лучше просто отменять событие дефолтное:
$(
'a'
).click(
function
(){
return
false
;
});
Если же таки надо заменить:
$(
'a'
).each(
function
(){
$(
this
).attr(
'href'
,
'#'
);
});
Спасибо за ответ, я просто не знал. Вообще то слабо ориентируюсь в джаваскрипте, вот и разбираюсь в джквери. А как кстати сделать активной потом? Так –
$('a').click(function(){
return true;
});
??
Подскажите плиз как из jquery обратиться к свойству background
так работает
$(
'.k a'
).each(
function
(){
$(
this
).find(
"img"
).attr(
"src"
,
"/images/photo.jpg"
);
});
так не работает
$(
'.k a'
).each(
function
(){
$(
this
).find(
"img"
).css(
"backgroundImage"
,
"/images/photo.jpg"
);
});
Статья хорошая, спасибо =)
Ксения, если не ошибаюсь, css свойство – фоновая картинка – правильно
записывается так:
background-image
поэтому:
$(
'.k a'
).each(
function
(){
$(
this
).find(
"img"
).css(
"background-image"
,
"/images/photo.jpg"
);
});
(не проверял, но должно работать)
В отличие от стандартных функций Js названия свойств css в Jquery полностью
идентичны названиям в самом css, в том его и прелесть.
P.S.: по поводу “тэг [h2] сразу после [tr] – это конечно же нехорошо …” – это
не нехорошо, а недопустимо, поскольку для своей работы Jquery строит объектную
модель страницы, и если не соблюден правильный порядок вложенности тегов,
хорошего от скрипта не ждите. Здесь недопустимы даже (вроде бы безобидные)
перекрещения вида
<
b
><
i
> нечто очень важное </
b
></
i
>
, только так:
<
b
><
i
> нечто очень важное </
i
></
b
>
или так
<
i
><
b
> нечто очень важное </
b
></
i
>
Стоит отметить, что методы брожения по ДОМу можно комбинировать, например так:
var
mytable = $(
'#selector'
).parent(
'div'
).next(
'table'
);
mytable.fadeOut().fadeIn();
Это задействует таблицу, следующую за слоем-родителем элемента #selector.
после выполнения скрипта
<script type=
"text/javascript"
>
function
ajaxFileUpload()
{
$(
"#avatar"
)
.ajaxComplete(
function
(){
});
$.ajaxFileUpload
(
{
url:
'upload_avatar.php'
,
secureuri:
false
,
fileElementId:
'fileToUpload'
,
dataType:
'json'
,
}
)
return
false
;
}
</script>
у элемента avatar
<
div
id
=
"avatar"
><
img
width
=
"240"
src
=
"./foto.jpg"
id
=
"preview_photo"
/></
div
>
меняеться картинка, точнее ее src, как мне обновить только картинку , какую функцию нужно в писать в ajaxComplete ??
Спасибо за вменяемую информацию :)
Здравствуйте. Антон, если не сложно то помогите. Стоит JQuery 1.6.2.
Мне нужно выбрать текст PDF, то есть “Спецификация на мотоцикл “.
<
ul
id
=
"my_links"
>
<
li
><
a
href
=
"http://www.yamaha-motor.ru"
target
=
"_blank"
id
=
"superlink"
>Yamaha Motors Russia</
a
></
li
>
<
li
><
a
href
=
"documents/yamaha_fz6.PDF"
>Спецификация на мотоцикл Yamaha FZ6</
a
></
li
>
</
ul
>
Пишу выборку сылки с окончанием пдф.
$(document).ready (
function
(){
var
myLink = $(
'a [href$=".PDF"]'
);
myLink.hide().text(
'Ololo'
).show(2000);
});
Ничего не происходит. Текст не меняется. В чем проблема? Спасибо.
Олег, вот это точно работает:
<
body
>
<
script
type
=
"text/javascript"
src
=
"libs/jquery-1.6.2.min.js"
></
script
>
<
script
type
=
"text/javascript"
>
$(document).ready (function(){
var myLink = $('a[href$=".PDF"]');
myLink.css({"color":"#b00"});
myLink.hide().text('Ololo').show(2000);
});
</
script
>
</
head
>
<
body
>
<
ul
id
=
"my_links"
>
<
li
><
a
href
=
'http://www.site01.ua'
rel
=
'nofollow'
target
=
'_blank'
id
=
'superlink'
>Megasite#01</
a
>
</
li
>
<
li
><
a
href
=
"documents/file01.PDF"
>Megafile#01</
a
>
</
li
>
</
ul
</body></
html
>
Ой, сорри, немного с тегами BODY и HEAD накосячил. Но думаю разберетесь в моей маленькой ошибке.