2012-03-16 84 views
1

如何查找加载子元素的父元素,而无需从另一个函数明确声明它?如何查找加载子元素而不显式声明它的父元素?

jQuery的,

$(document).ready(function(){ 

     $('.load-child').load_child(); 

    }); 


    (function($) { 

     $.fn.extend({ 

      load_child: function(options) { 

       var o = $.extend({ 
        target:'.parent' 
       }, options); 

       var $this = this; 

       var $cm = this.click(function(e) { 

        var object = $(this); 
        var path = object.attr('href'); 

        $(o.target).load(path, function(){ 

         $this.child(); 

        }); 

        return false; 

       }); 


       $this.child = function() { 

        $('.find-parent').click(function(event){ 

         var object = $(this); 
         object.parents('.parent').css({background:'red'}); 

         return false; 
        }) 

       }; 


       return $cm; 

      } 
     }) 
    })(jQuery); 

指数HTML,

<a href="child.php" class="load-child">load child</a> 

<div class="container"> 

    <div class="parent">  

    </div> 

</div> 

子页面,

<div> 
    <div></div> 
    <div></div> 
    <div><a href="#" class="find-parent">click me</a></div> 
</div> 

我可以得到.parent元以上,因为我明确地声明父名,

object.parents('.parent').css({background:'red'}); 

但是如果父母的名字是未知的或者经常改变呢?是否有任何通用的方法来定位/追溯到用于加载页面的元素?

加载的页面可能有div元素的负荷,所以我不能做到这一点,

object.parent().css({background:'red'}); 

object.parents(div).css({background:'red'}); // this will go up to the very top of div element. 

jsfiddle page

编辑:

solution

+0

你错过了一对';' – elclanrs 2012-03-16 02:11:56

+0

谢谢。刚刚找到他们!大声笑 – laukok 2012-03-16 02:14:23

回答

1

这是你的选择:

  1. 您标记以某种方式父(最简单的是可能与一类特殊的名称),当您加载内容。然后,内容可以通过.closest(".markerName")搜索祖先链,从内容的任何位置查找它。
  2. 您知道关于加载内容的结构的一些信息,以便内容知道它在哪里,并且可以从上面找到加载父项。
  3. 将负载父项存储在全局可到达的JavaScript变量中,以便内容可以在需要时获取该变量。

请注意,我认为您一般希望使用.closest(selector)而不是.parents(selector)。你可以阅读关于它here

编辑 - 根据您在您的评论问一个问题:

在一个全局变量存储负载父母是我最值得推荐的,但既然你问如何做到这一点,这是多么:

当你的负载孩子方法不这样:

$(o.target).load(path, function(){ 

你只需记得o.target值是这样的:

window.loadTarget = $(o.target); 

然后,window.loadTarget将是一个全局变量,其中包含上次加载内容的位置。

就我个人而言,我更喜欢你使用特殊的类名。所以,你会替换此:

$(o.target).load(path, function(){ 

与此:

$(o.target).addClass("loadTarget").load(path, function(){ 

,然后,你要查找的负载对象的内容内的任何地方,你可以这样做:

$(this).closest("loadTarget") 

第二个选项可以避免任何新的全局变量,并且可以同时支持多个loadTargets。

+0

感谢您的答案。如何将加载父项存储在全局变量中? – laukok 2012-03-16 02:18:06

+0

@lauthiamkok - 我添加更多的信息到我的答案的结尾。 – jfriend00 2012-03-16 02:26:39

+0

感谢您的编辑和建议。 jfriend00! :-) – laukok 2012-03-16 02:32:44

0

你可以使用closest()代替。

+0

'最接近('div')'?它和'object.parent()'一样... – laukok 2012-03-16 02:15:59

+0

为什么你不想使用泛型类? – elclanrs 2012-03-16 02:18:05

+0

已经使用了太多的泛型类,所以我认为可能有其他更好的解决方案... – laukok 2012-03-16 02:20:12