2014-08-29 143 views
0

我一直无法找到关于我在本网站或其他任何网站上挣扎的任何讨论,但也许我没有提出正确的问题。我工作的一个Web界面搭载了树莓派无线扬声器,并且(我继承了它),几乎所有的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和链接到我们要加载到一个新窗口的外部页面时,UI阻塞的东西不会被调用。我将尝试简要描述我的问题:其中一个菜单项是(有条件的)指向基于Web的MPD客户端的链接,我们绝对不希望在同一页面的div中加载,因此具有target="_blank"属性。问题是用户也可以选择通过Web界面启用或禁用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"属性?顺便说一下,如果MPD关闭,则以其他方式去除target="_blank"属性,就像魅力一样。非常感谢您提供任何答案,如果我重复了上一个问题,我很抱歉!

欢呼声,

回答

0

任何时候你必须用ajax重新加载元素时,事件总是很棘手。我发现最好的办法是附加的事件,一些容器元素,不会重新加载:

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

}); 

这样被点击的容器,当元素被检查的属性。当你设置$('element')。click()时,选择器在页面加载和附加事件上被选中,所以当你通过ajax重新加载某些东西时,新元素不会附加这个事件。

注意:通常你可以避免函数中的条件语句,但我不知道在css选择器中按目标过滤的简单方法。

+0

那就是票。现在我觉得愚蠢 - 父导航元素永远不会改变,我只是忘了你可以传递一个选择器参数给'.on()'!谢谢! – jhansen317 2014-08-29 20:27:58

相关问题