Jump to content

Необходима небольшая помощь с массивом на JS


Critical Error
 Share

Recommended Posts

Есть код js


var usa = [ 'Нью Йорк', 'Лос Анджелес', 'Вашингтон' ];
if( $( '.box header' ).text(usa) ) {
$( '.box' ).addClass( 'box-usa' );
}
var russia = [ 'Москва', 'Санкт Петербург', 'Владивосток' ];
if( $( '.box header' ).text(russia) ) {
$( '.box' ).addClass( 'box-russia' );
}

и код шаблона (динамически выводится)

<div class="box">
<header><h5>{city}</h5></header>
{info}
</div>

Суть проблемы в том, что когда генерится контент, DIV'у с классом box добавляются оба класса - box-usa и box-russia.

Как правильно записать условие в каждом из случаев, чтобы, в зависимоси от того, с каким массивом совпадет текст, указанному элементу с классом box добавлялся нужный класс?

Link to comment
Share on other sites

Как правильно записать условие в каждом из случаев, чтобы, в зависимоси от того, с каким массивом совпадет текст, указанному элементу с классом box добавлялся нужный класс?

http://api.jquery.com/jQuery.inArray/

Ответ тут

Link to comment
Share on other sites

Как правильно записать условие в каждом из случаев, чтобы, в зависимоси от того, с каким массивом совпадет текст, указанному элементу с классом box добавлялся нужный класс?

http://api.jquery.com/jQuery.inArray/

Ответ тут

И как же это прикрутить интересно!? У меня ведь два массива! Даже если я и сделаю проверку, один хрен будет добавлять два класса.

Я не могу никак сообразить, что именно нужно записать в if() для каждого случая.

То есть, если город принадлежит массиву usa то добавляется класс box-usa, если к russia - box-russia

Edited by Critical Error
Link to comment
Share on other sites

Попробуй так:

 var usa = [ 'Нью Йорк', 'Лос Анджелес', 'Вашингтон' ];
if(inString(usa)) {
$( '.box' ).addClass( 'box-usa' );
}
var russia = [ 'Москва', 'Санкт Петербург', 'Владивосток' ];
if(inString(russia)){
$( '.box' ).addClass( 'box-russia' );
}

А теперь определим inString :

function inString(ar){
var s = $( '.box header' ).text();
if (jQuery.inArray(s,ar)>-1) {

return true;

}
}

Link to comment
Share on other sites

Попробуй так:

 var usa = [ 'Нью Йорк', 'Лос Анджелес', 'Вашингтон' ];
if(inString(usa)) {
$( '.box' ).addClass( 'box-usa' );
}
var russia = [ 'Москва', 'Санкт Петербург', 'Владивосток' ];
if(inString(russia)){
$( '.box' ).addClass( 'box-russia' );
}

А теперь определим inString :

function inString(ar){
var s = $( '.box header' ).text();
if (jQuery.inArray(s,ar)>-1) {

return true;

}
}

Да, все получилось. Теперь более детально изучу принцип работы)

PS. Не знаю почему, но не могу плюс поставить(

Edited by Critical Error
Link to comment
Share on other sites

Попробуй так:

 var usa = [ 'Нью Йорк', 'Лос Анджелес', 'Вашингтон' ];
if(inString(usa)) {
$( '.box' ).addClass( 'box-usa' );
}
var russia = [ 'Москва', 'Санкт Петербург', 'Владивосток' ];
if(inString(russia)){
$( '.box' ).addClass( 'box-russia' );
}

А теперь определим inString :

function inString(ar){
var s = $( '.box header' ).text();
if (jQuery.inArray(s,ar)>-1) {

return true;

}
}

Да, все получилось. Теперь более детально изучу принцип работы)

PS. Не знаю почему, но не могу плюс поставить(

Плюсы сможешь ставить когда напишешь >30 сообщений на этом форуме..

Link to comment
Share on other sites

Одно только теперь не ясно, если на странице генерит более одного блока с классом box, то почему-то ни к одному блоку не добавляется указаный класс.

Edited by Critical Error
Link to comment
Share on other sites

Одно только теперь не ясно, если на странице генерит более одного блока с классом box, то почему-то ни к одному блоку не добавляется указаный класс.

Critical Error, реши по-быстренькому проблему.

Link to comment
Share on other sites

Одно только теперь не ясно, если на странице генерит более одного блока с классом box, то почему-то ни к одному блоку не добавляется указаный класс.

http://jsfiddle.net/ZWtDQ/1/

Кривой способ. Но вроде работает.

Интересно было бы узнать как можно было бы улучшить..

Link to comment
Share on other sites

Одно только теперь не ясно, если на странице генерит более одного блока с классом box, то почему-то ни к одному блоку не добавляется указаный класс.

Critical Error, реши по-быстренькому проблему.

Я понимаю, что вы умный человек и опыта у вас ого-го, однако ваш мозг воспринимает мои сообщения как неадекватное общение, а руки так и чешутся чтобы написать что-то саркастичное и с презрением чтоб почуствовать себя царем, ну, или царевной...

Если группа светится красненьким это не значит что можно вести себя как чудак на букву М.

Я ведь попросил о помощи с написанием условия, а не послать меня на сайт с документацией, которую (явно!) я читал; скрипт написан мною, но некоторые детали мне не ясны.

Одно только теперь не ясно, если на странице генерит более одного блока с классом box, то почему-то ни к одному блоку не добавляется указаный класс.

http://jsfiddle.net/ZWtDQ/1/

Кривой способ. Но вроде работает.

Интересно было бы узнать как можно было бы улучшить..

По идее, в написаном вами первом варианте должно в DOM находить элементы с классом box и добавлять зависимый от массива класс, не смотря сколько на странице таких элементов, но почему не происходт то что ожидалось я не понимаю, увы.

Попробую второй вариант, вижу что работает. Еще раз спасибо. огромное :)

Link to comment
Share on other sites

Одно только теперь не ясно, если на странице генерит более одного блока с классом box, то почему-то ни к одному блоку не добавляется указаный класс.

Critical Error, реши по-быстренькому проблему.

Я понимаю, что вы умный человек и опыта у вас ого-го, однако ваш мозг воспринимает мои сообщения как неадекватное общение, а руки так и чешутся чтобы написать что-то саркастичное и с презрением чтоб почуствовать себя царем, ну, или царевной...

Если группа светится красненьким это не значит что можно вести себя как чудак на букву М.

Я ведь попросил о помощи с написанием условия, а не послать меня на сайт с документацией, которую (явно!) я читал; скрипт написан мною, но некоторые детали мне не ясны.

Одно только теперь не ясно, если на странице генерит более одного блока с классом box, то почему-то ни к одному блоку не добавляется указаный класс.

http://jsfiddle.net/ZWtDQ/1/

Кривой способ. Но вроде работает.

Интересно было бы узнать как можно было бы улучшить..

По идее, в написаном вами первом варианте должно в DOM находить элементы с классом box и добавлять зависимый от массива класс, не смотря сколько на странице таких элементов, но почему не происходт то что ожидалось я не понимаю, увы.

Попробую второй вариант, вижу что работает. Еще раз спасибо. огромное :)

Первый способ не работал, потому что не был гибким - он исходил из того, что в .box header только одна строка и сам .box header только один на странице, когда .box header'ов стало много, .text() тоже возвращал строку, однако эта строка - результат конкатенации всех строк внутри всех .box header'ов. Понятно, что такая строка никогда не даст true в нашем предикате - в результате css классы не ставились.. Теперь каждая строка каждого .box header'а рассматривается отдельно и соответственно ставится класс.. (если есть вхождение в массив)

Link to comment
Share on other sites

Я ведь попросил о помощи с написанием условия, а не послать меня на сайт с документацией, которую (явно!) я читал; скрипт написан мною, но некоторые детали мне не ясны.

Вы коммерческий проект делаете?

Вам дали задание, вы сделали его за счет чужой головы, получили денежки и радуетесь, что нашли на форуме лошков, которые за 0 копеек все чудненько заколбасили. Вопрос, как к вам относиться? Как к чудаку на букву М?

Вопрос, вы хоть что-то поняли из того кода, что вам дали? Я уверен что ничего. Тогда зачем вам помогать дальше?

Можете не отвечать на мои вопросы, потому что с вами и так все понятно.

Кривой способ. Но вроде работает.

Почему вы думаете, что кривой?

Link to comment
Share on other sites

Почему вы думаете, что кривой?

Я имел ввиду, кривой, потому что процедуру нужно вызывать дважды чтобы решить задачу..

Я думал, может можно переписать её так, чтобы с одного вызова всё работало??

Link to comment
Share on other sites

Я ведь попросил о помощи с написанием условия, а не послать меня на сайт с документацией, которую (явно!) я читал; скрипт написан мною, но некоторые детали мне не ясны.

Вы коммерческий проект делаете?

Вам дали задание, вы сделали его за счет чужой головы, получили денежки и радуетесь, что нашли на форуме лошков, которые за 0 копеек все чудненько заколбасили. Вопрос, как к вам относиться? Как к чудаку на букву М?

Вопрос, вы хоть что-то поняли из того кода, что вам дали? Я уверен что ничего. Тогда зачем вам помогать дальше?

Можете не отвечать на мои вопросы, потому что с вами и так все понятно.

Кривой способ. Но вроде работает.

Почему вы думаете, что кривой?

Что вам со мной понятно!? А ничего! Если вы всю жизнь и попадаются одни такие чудаки на букву М, то не стоит всех их клеймить этим логотипом. Среди них могут попасться нормальные адекватные люди, готовые в будущем подсобить в чем-то другом.

Отвечу вам на первый вопрос, а из ответа сделаете вывод сами. Проект у меня не комерческий, а для себя любимого. Как закончу, скину ссылку. Из трехлетнего опыта единственным за что я получил деньги, так это за установку CBox чата на CMS DataLife Engine. Все!

И если вы решите вдруг побывать на форуме этой CMS, то вы сможете меня там найти, и увидеть, что я помогаю людям на голодном энтузиазме.

И да, я понял принцип работы из примера.

PS. Тему перекинул? Молодееец...

PSS. И если я пришел на этот форум, то не ради корыстных целей или обманом что-то получить. Я готов поделится и своими знаниями и опытом.

Link to comment
Share on other sites

И да, я понял принцип работы из примера.

А я уверен, что нет. Иначе не было бы последнего вопроса.

А ведь для того, чтобы понять принцип работы jQuery, нужно было хоть раз почитать документацию, в которой сказано следующее: любой селектор возвращает массив элементов, и любая "сцепленная" (chained) функция применяется к каждому из элементов этого массива.

Второе, если бы вы использовали firebug, и сделали бы вот такой простой вызов

var s = $( '.box header' ).text();
console.debug(s);

и сложив с информацией, что я написал выше, поняли бы ошибку данного кода без нашего участия.

Итого: чтение документации и знание функций дебага дает вам прямое указание на ошибку в коде. Дальнейший вопрос должен быть не "не работает", а "text() возвращает склеенную строку, если элементов больше одного, как это обойти?"

Но ведь проще, чтобы кто-то разобрался, правда?

Если к вам придет голодный, то нужно не давать ему рыбу, а дать ему удочку и научить рыбачить, тогда он будет сытым всю оставшуюся жизнь.

PS. Тему перекинул? Молодееец...

А то!

PSS. И если я пришел на этот форум, то не ради корыстных целей или обманом что-то получить. Я готов поделится и своими знаниями и опытом.

Пока что не видно, чтобы вы пришли за знаниями, а не за готовыми решениями...

Edited by s0rr0w
Link to comment
Share on other sites

и любая "сцепленная" (chained) функция применяется к каждому из элементов этого массива.

многие, но всё-таки не любая - .html(), .height() (и некоторые другие) применяются только к первому элементу из множества найденных элементов..

P.S.: точнее некоторые методы как .html() и .height() и т.п. когда работают "на чтение" применяются только к первому элементу из множества найденных элементов, а когда "на запись" - тогда к каждому

элементу из множества найденных элементов..

Edited by DrStrangeLove
Link to comment
Share on other sites

Я firebug'ом как-то не пользовался, но попробовал и увидел что возвращает текст сразу со всех найденных элементов. Поэтому и не находит в массиве подходящего текста. Спасибо за помощь. Вам обоим. Я учусь пока что на инженера-технолога в сфере строительства, а сайтостроение как хобби. Поэтому еще не тот уровень знаний JS как хотелось бы.

Link to comment
Share on other sites

Я учусь пока что на инженера-технолога в сфере строительства, а сайтостроение как хобби. Поэтому еще не тот уровень знаний JS как хотелось бы.

Ну так выучите сначала что-то одно, потом уже за все остальное беритесь.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy