2014-08-29 2 views
0

Я не смог найти ни одного обсуждения того, с чем я борюсь на этом сайте или в любом другом, но, возможно, я не задаю правильный вопрос. Я работаю на веб-интерфейс для беспроводной динамик питается от малинового пи, и (как я унаследовал) почти все запросы POST выполняются с вызовами $.ajax.$().ready() выглядит следующим образом:JQuery - элементы таргетинга, которые были изменены после загрузки страницы

$().ready(function(){ 
     $(document).ajaxStart(function(){ 
      $.blockUI({ message: '<img id="loadimg" src="img/loading.gif" width="64" />'}); 
     }).ajaxStop($.unblockUI); 

    $("nav.setup-nav a").not("[target='_blank']").on("click", function (event){ 
     event.preventDefault(); 
     var href=$(this).attr('href'); 
     $.ajax({ 
      type:"POST", 
      url:href, 
      success:function (data){ 
       $(".contentPanel").html(data); 
       $(this).blur(); 
       $("html, body").animate({ scrollTop:100, scrollLeft:400}, 600); 
       }, 
      }); 
      return false; 
     }); 
    }); 

какие силы все содержимое связанных страниц в навигационном меню для загрузки внутри div в центре страницы. То есть, за исключением страниц с атрибутом target="_blank". Это так event.preventDefault, и блокировка пользовательского интерфейса не вызывается при ссылке на внешнюю страницу, которую мы хотим загрузить в новом окне. Я попытаюсь кратко описать мою проблему: одним из пунктов меню является (условно) ссылка на веб-клиент MPD, который мы определенно НЕ хотим загружать внутри div на той же странице и, следовательно, имеет атрибут target="_blank" , Проблема заключается в том, что пользователь может также включить или отключить демон MPD через веб-интерфейс. PHP обрабатывает настройки всех этих переменных состояния. В принципе, как это:

if ($config->is_flag_set($MPD_FLAG)) 
    { 
     echo '<li><a target="_blank" id="mpd" href="rompr/">Local Playback Web Interface</a></li>'; 
    } 
    else 
    { 
     echo '<li><a id="mpd" href="local-disabled.php">Local Playback Web Interface</a></li>'; 
    } 

и поэтому при первой загрузке страницы, если демон MPD не работает ссылка на веб-интерфейс направлен на страницу, которая объясняет MPD не включен. Эта ссылка НЕ ​​содержит атрибут target="_blank". Однако, если вы переходите к форме настроек и включаете MPD, существует логика для замены атрибутов href и target этой конкретной ссылки, поэтому теоретически все должно работать так, как если бы страница сначала загружалась с флагом MPD (если это Чисто!). Проблема в том, что, когда ссылка «заменена» с target="_blank" (установлена ​​.prop() или .attr(), я пробовал и то, и другое, похоже, не имеет значения) щелкнул, страница все еще загружается внутри div! Я попытался дублировать обработчик кликов, который определен в пределах $().ready и помещает его в другую функцию, которую я вызываю после того, как установлены атрибуты ссылки, но она по-прежнему не работает, как я себе представляю! Просто чтобы убедиться, что я не сумасшедший, я использовал .each(), чтобы напечатать все ссылки, которые сделали и не имеют атрибута target="_blank", и что все это соответствует тому, что я считаю. Почему заменяемая ссылка не обрабатывается так, как будто она имеет атрибут target="_blank" в обработчике кликов? Кстати, Идти другим способом и удаляя атрибут target="_blank", если MPD выключен, он работает как шарм. Большое спасибо за любые ответы и мои извинения, если я повторил предыдущий вопрос!

Приветствия,

ответ

0

События всегда сложно в любое время вы должны перезагрузить элементы с помощью AJAX. Лучший способ я нашел, чтобы прикрепить событие к какому-то элементу контейнера, который не будет перезагружать:

$('#always_present_container').on('click', "nav.setup-nav a", function (event){ 
    if($(this).attr('target') != '_blank'){ 
     ... 
    } 

}); 

таким образом элемент проверяется для атрибута, когда его контейнер щелкнул. Когда вы устанавливаете $ ('element'). Click() селектор проверяется на загрузке страницы и приложенных событиях, поэтому, когда вы перезагружаете что-либо через ajax, новый элемент не присоединяет это событие.

Примечание: обычно вы могли бы избежать условного оператора в функции, но я не знал, как легко фильтровать по цели в селекторе css.

+0

Thats the ticket. Теперь я чувствую себя глупо - родительский элемент nav никогда не изменяется, я просто забыл, что вы можете передать аргумент селектора '.on()'! Благодаря! – jhansen317

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