Премахване на активен клас от разделите на Mootools

Продължавам в опитите си да науча Mootools (по дяволите, пропускам 30-дневните уроци на Consider Open) и се опитвам да създам прост скрипт за превключване на класове. Намерих един на този сайт, който върши работа, но в идеалния случай бих искал да мога да премахна всички екземпляри на .active от елементите li, ако щракнете върху текущия активен елемент.

Създадох JSFiddle, ако някой иска да погледне проблема.

Разгледах документацията на сайта на mootools, но се страхувам, че все още не можах да разбера кой раздел ще ми помогне с това. Искам да се науча сам да правя тези неща, така че ще съм благодарен не само за решението, но и за указател към частите от документацията на mootools, които трябваше да разгледам, за да разбия това. Благодаря.


person Dave    schedule 14.11.2011    source източник


Отговори (2)


освен производителността, кодът ви е наред. под производителност имам предвид - не трябва да се налага да отива в dom при всяко щракване, за да получи списъка с елементи или текущия активен, за да направи това, което трябва - всичко това може да се кешира. вашият код ще работи срещу всеки .active в колекция, която първоначално ще има .length 0, така че при първото щракване нищо няма да се случи. проблемът с производителността е да се изберат отново всички елементи и тези с .active, след което да се изпълни .each върху тях за единствения член, който може да го има.

можете да направите нещо подобно вместо това:

http://jsfiddle.net/dimitar/m66Ju/2/

(function() {
    var ul = document.getElement("ul.examples"), lis = ul.getElements("li"), active;
    lis.addClass('transition');

    lis.each(function(item){
        item.addEvent('click',function(event){
            if (active) {
                // there is one, remove it.   
                active.removeClass('active');
            }
            if (active == this) {
                // is the active one already open?
                active = false;
                return;
            }
            // make a new active.
            active = this.addClass('active');
        });
    });
})();

това ще бъде най-ефективно и ще работи и с първоначален активен li.

няма ръководство за това как да структурирате кода си за производителност и повторна употреба, но има няколко беседи, които могат да помогнат, като Програмиране към шаблони на Арън Нютон (с mootools) и т.н. Основното правило е, не правете преждевременна оптимизация, а програмирайте така че най-бавният поддържан браузър (обикновено IE6 или 7) работи възможно най-бързо. събитията с щракване дават известна свобода на действие, но тези с преминаване на мишката могат да бъдат скъпи.

person Dimitar Christoff    schedule 14.11.2011
comment
Браво за това, Димитър, непременно ще хвърля едно око на разговора, който спомена. Някаква идея как мога да премахна всички активни класове, когато щракна върху активната връзка? Това е, срещу което се боря в момента. наздраве - person Dave; 14.11.2011
comment
направихте го вече - можете да направите ul.getElements("li.active").removeClass("active"); - което донякъде направихте с помощта на $$(".examples .active").removeClass("active") - не работи ли за вас? тъй като реших, че само един може да бъде .active, нямаше нужда да отивам в селектор, тъй като можете да съхраните кой от тях. - person Dimitar Christoff; 14.11.2011
comment
Страхувам се, че съм в момент, в който знам какво прави кодовият фрагмент, но не съм сигурен къде се вписва в синтаксиса, за да работи. Опитах се да го добавя там, където смятам, че трябва да отиде, но Не получавам никакъв резултат. Съжалявам, че съм такъв ноуб по въпроса, но мога ли да ви обезпокоя за работещ пример? - person Dave; 14.11.2011
comment
това имам предвид, и двете работят добре - моята редактирана версия и вашият оригинал - те премахват .active класа и след това добавят нов към щракнатия el. не сте сигурни какви са вашите очаквания? - person Dimitar Christoff; 14.11.2011
comment
Хей, не съжалявам, явно не съм обяснил целта си достатъчно добре. Това, което търся, е, че когато щракнете върху текущо активната връзка, тя премахва всички .active класове от елементите li, включително този, върху който е щракнато, така че всичко да се върне обратно към състояние, в което е щракнато преди, и никакви елементи не се показват като активен. - person Dave; 14.11.2011
comment
вече прави точно това. когато направите $$('.examples .active').removeClass('active');, той ще премахне класа от всеки и всички елементи, които намери, така че наистина нямате грешки като такива, само изпълнение. моят код просто кешира всичко, така че да не правите търсения - това е всичко. но вашите оригинални произведения. - person Dimitar Christoff; 14.11.2011
comment
Добре, тогава това е странно, защото когато щракна върху активния клас, нищо не се случва. Вие вече бяхте изключително щедри с вашето време и знания, така че не искам да ви безпокоя повече с това. Ще помоля няколко колеги дали могат да тестват примера и да разберат какво става. - person Dave; 14.11.2011
comment
работи тук във FF 7. ако не изглежда да прави нищо, може да е свързано с прехода. jsfiddle.net/dimitar/m66Ju/3 - това добре ли е за вас? - person Dimitar Christoff; 14.11.2011
comment
Използвам най-новата версия на Safari (Mac) и се страхувам, че е същото. Превключва активния клас без проблем, но когато щракнете върху активния клас, нищо не се случва, той просто остава активен. - person Dave; 14.11.2011
comment
това е правилното. кликването върху активния клас не трябва да го променя? или по-скоро го променя (премахва) и след това го добавя отново. това не е ли желаното от вас поведение? искате да премахнеClass и да излезе, ако го има (т.е. сгъване) - person Dimitar Christoff; 14.11.2011
comment
Ааа, да, виждате ли, че това е мястото, където мисля, че сме си пресекли кабелите. Да, наистина, когато щраквам върху активното състояние, бих искал да премахне класа .active и да не го добавя отново, по същество, пренастройвайки страницата до начина, по който е била преди да се щракне върху нещо. Разбира се, ако някоя от връзките бъде щракната отново, бих искал активният клас да бъде приложен, както е показано в примера, но по същество това, което бих искал, е щракването върху активния клас да функционира като „бутон за нулиране“, така че всички връзки се нулират до първоначалното си състояние и не се показват активни състояния. - person Dave; 14.11.2011
comment
няма проблем. jsfiddle.net/dimitar/m66Ju/5 - ако активен е указател към елемент, той премахва класа и излиза. във вашия оригинален код, можете да го запишете в променлива, напр. var active = $$(".active"); if (active.length) { active.removeClass("active"); return; } - person Dimitar Christoff; 14.11.2011
comment
Димитър, ти си звезда. Сериозно, благодаря много, че се придържахте към това и съжалявам, ако първоначалното ми описание не е било ясно. - person Dave; 14.11.2011

И така, вашият проблем може да се разложи на две фази:

  1. Избиране на вашите целеви li елементи.
  2. Премахнете класа active.

Не забравяйте, че MooTools е обектно-ориентиран. И така, върху кои обекти ще работите? DOM елементи. Това означава, че трябва да разгледате Element документацията на MooTools.

За да изберете, вие търсите Element.getElements метод (или $$) .

След това, за премахване на клас… Е, просто Element.removeClass ;)

И така, вашият код трябва да изглежда нещо като:

$$('li.active').removeClass('active');
person MattiSG    schedule 14.11.2011
comment
@Димитър: връзката прекъсна точно преди да публикувам. Съжалявам, че удвоявам отговора ви, дяда дяда. - person MattiSG; 14.11.2011
comment
Да, разбрах, благодаря за обяснението и връзките към документацията на Moo, това наистина помага. - person Dave; 14.11.2011