jQuery/JavaScript: Задействане на функция за щракване върху котви на същата страница

Уебсайт, който разработвам, има списък с връзки в долния колонтитул на всяка страница. Тези връзки са добавени с котви по следния начин:

<ul>
    <li class="lines exp"><a href="/bgservices.html#sa">Service A</a></li>
    <li class="lines exp"><a href="/bgservices.html#sb">Service B</a></li>
    <li class="lines exp"><a href="/bgservices.html#sc">Service C</a></li>
</ul>

На целевата страница „services.html“ за тези връзки има поредица от div в стил превключване, всеки от които съответства на горните закотвени връзки, като така:

<div id="sa" class="toggle-trigger">
    <h3 class="services-title">
        <a class="toggle-text">Service A</a>
    </h3>
</div>
<div class="toggle-container">
    <p>Lorem ipsum sit dolorem.</p>
</div>
<div id="sb" class="toggle-trigger">
    <h3 class="services-title">
        <a class="toggle-text">Service B</a>
    </h3>
</div>
<div class="toggle-container">
    <p>Lorem ipsum sit dolorem.</p>
</div>
<div id="sc" class="toggle-trigger">
    <h3 class="services-title">
        <a class="toggle-text">Service C</a>
    </h3>
</div>
<div class="toggle-container">
    <p>Lorem ipsum sit dolorem.</p>
</div>

Крайната цел е връзките в долния колонтитул да активират целевия си div "toggle-trigger" със симулирано събитие за щракване, което ще превключи отварянето на свързания div "toggle-container" след зареждане на страницата "services.html".

За тази цел добавих следния JavaScript / jQuery към „services.html“ в края на тялото, тъй като трябва да се задейства само след като страницата е готова:

<script type="text/javascript">
    $( document ).ready(function() {
        var target = document.URL;
        var regex = /services\.html#[a-z]{2}$/;
        var result = regex.exec(target);
        console.log("Target / Regex / Result: " + target + " / " + regex + " / " + result);
        if (result) {
            var divID = /#[a-z]{2}/.exec(result);
            console.log("divID: " + divID[0]);
            $(divID[0]).delay(1000).trigger('click');
        }
    });
    $(".exp").click(function() {
        var target = window.location.hash;
        console.log("Target: " + target);
        $(target).delay(1000).trigger('click');
    });
</script>

Добавих втората функция, тъй като променливата result в първата функция винаги е нула, когато щракнете върху закотвени връзки в рамките на същата страница.

В момента това работи точно както искам, когато щраквам върху връзка в долния колонтитул на други страници на сайта. Когато обаче вече съм на страницата „services.html“ и щракна върху една от връзките в долния колонтитул на същата страница, това не работи при първото щракване, а вместо това работи при второто щракване върху закотвената връзка.

Желаното поведение, разбира се, е да работи по същия начин, независимо от страницата, на която е щракнато върху връзката в долния колонтитул.

какво правя грешно


person Enzan    schedule 19.09.2013    source източник
comment
В странична бележка: $(document).ready(function(){}); alias $(function(){}); прави точно това, от което се нуждаете: Изпълнява функцията, след като HTML структурата завърши зареждането. Вече няма нужда да го поставяте в края на тялото.   -  person Kiruse    schedule 20.09.2013
comment
А, да, прав сте... но поради други причини, на този сайт всички скриптове се зареждат в края на тялото, включително jQuery, така че горният скрипт също трябва да бъде.   -  person Enzan    schedule 20.09.2013
comment
Достатъчно честно. Предполагам, че вашата администрация не иска да създава ненужни разходи за JavaScript, преди действителният уебсайт да бъде зареден, което е разумно нещо, което трябва да направите, когато работите с API за социални мрежи, например.   -  person Kiruse    schedule 20.09.2013
comment
Ами... имайки предвид това, което казвате за кода, който работи на други страници... Сигурен съм, че проблемът идва от факта, че сте на същата страница. Което би означавало, че проблемът е или в $document.ready, който прави нещо нередно, или в манипулатора на кликванията... проверихте ли какво точно се случва, когато щракнете за първи път? вероятно част от кода работи... и можете да откриете какъв е проблемът в отстраняването на грешки.   -  person Lyth    schedule 20.09.2013
comment
Да, Лит, точно. Работи добре, когато пристига от друга страница, но не, когато целевата страница е текущата страница. Това, което изглежда се случва, е, че по отношение на втората функция, променливата target не се попълва при първото щракване. При всички следващи кликвания той се попълва. Все още не разбирам защо е така.   -  person Enzan    schedule 20.09.2013
comment
Можете ли да ми кажете как изглежда URL адресът след първото ви кликване?   -  person Lyth    schedule 20.09.2013
comment
Колкото и да е странно, котвата наистина се добавя към URL адреса при първото щракване... по някакъв начин, който все още не разбирам, window.location.hash не присвои фрагмент на target при първото щракване, както се очакваше.   -  person Enzan    schedule 20.09.2013


Отговори (1)


Начинът, по който го виждам... когато вече сте на страницата services.html, нещо се държи зле. Това може да е href="/bgservices.html#sa". Въпреки че не знам какво точно може да не е наред, бих препоръчал извличането на вашия "#anchor" по различен начин.

Нещо като

$(".exp").click(function(){
  $a = $(this).find("a").first() ;
  href = $a.attr('href') ;
  // parse the href to retrieve #anchor
}) ;

По този начин няма да зависиш от window.location... което може да се държи зле, когато вече си на services.html.

person Lyth    schedule 19.09.2013
comment

вашият код работи добре, мисля

my $text = "botolo";
my $separator = "o";
print +(split($separator, $text))[0];  
#uglyness with + necessary because Perl

Въпреки че, с цената на един допълнителен ред, бих предпочел да напиша последния ред като:

my @parts = split($separator, $text);
print $parts[0];
- person Kiruse; 20.09.2013
comment
Изглежда, че зарежда страница. В този случай може да има нови DOM елементи. Не съм сигурен обаче дали съм разбрал механиката, може да съм прочел кода твърде бързо и да съм визуализирал малко. - person Lyth; 20.09.2013
comment
Не съм сигурен дали той наистина го зарежда с AJAX. Ще ни трябва обратна връзка от питащия. Но тъй като той каза, че работи при второ щракване, съмнявам се, че изпълнява такава заявка. - person Kiruse; 20.09.2013
comment
Да, и аз не съм сигурен. - person Lyth; 20.09.2013
comment
Страницата не се зарежда през AJAX. По същество проблемът се крие във факта, че във втората функция на target не се присвоява стойност при първото щракване върху една от закотвените връзки в долния колонтитул, когато потребителят вече е на страницата services.html. При следващи щраквания той се попълва. Много странно.... - person Enzan; 20.09.2013
comment
Добре. почакай Може да имам решение. - person Lyth; 20.09.2013
comment
Лит, не мога да ти благодаря достатъчно, след като се борих с този проблем около 2 часа. Вашето решение работи перфектно. - person Enzan; 20.09.2013
comment
Готино :D и наистина странно. - person Lyth; 20.09.2013