【问题标题】:Help with manipulating child/parent elements with jQuery帮助使用 jQuery 操作子/父元素
【发布时间】:2010-05-27 16:27:25
【问题描述】:

目前我有这个 JQuery 脚本

var img = $(this);
img.wrap('<div class="photo"></div>');
img.parent().append("<p>" + img.attr("alt") + "</p>");

成功转为:

    <img src="photo.jpg" alt="caption">

进入这个

<div class="photo">
    <img src="photos.jpg" alt="caption"/>
        <p>caption</p>
</div>

一切都很好,除非图像具有作为父级的链接; &lt;a href="#"&gt;&lt;img 因为我希望它是正确的 html(我很挑剔),所以改善下面的结果将是令人满意的

<a href="#">
<div class="photo">
    <img src="photos.jpg" alt="caption"/>
        <p>caption</p>
</div>
</a>

到这里:

<div class="photo">
    <a href="#">
    <img src="photos.jpg" alt="caption"/>
    </a>
        <p><a href="#">caption</a></p>
</div>

到目前为止,这是我的 jQuery 脚本(因为我是菜鸟,这不起作用)啊哈

if(img.parent('a')){
    var targetLink = img.parent('a').attr('href').val();
    img.parent('a').wrap('<div class="photo"></div>');
    img.parent('div').append('<p><a href="'+targetLink+'">' + img.attr("alt") + '</p></a>');
}else{
     img.wrap('<div class="photo"></div>');
     img.parent().append("<p>" + img.attr("alt") + "</p>");
};

任何建议或帮助将不胜感激:)
谢谢!

更新 回答

var withLink = img.parent('a').length > 0,
targetPar = withLink ? img.parent() : img;

targetPar.wrap('<div class="photo"></div>');

if(withLink > 0){
    targetPar.parent().append('<p class="caption"><a href="'+img.parent().attr('href')+'">' + img.attr('title') + '</p></a>');
}else{
    img.parent().append('<p class="caption">' + img.attr('title') + '</p>');
}

【问题讨论】:

    标签: javascript jquery jquery-selectors parent-child dom-manipulation


    【解决方案1】:

    我认为问题在于你的“if”语句,应该是:

    if (img.parent('a').length) {
      // ...
    }
    

    然后,当您尝试获取 &lt;a&gt; 标记的“href”时,您调用的是“val()”,这不是必需的(甚至是正确的):

      var targetLink =  img.parent('a').attr('href');
    

    此外,虽然与您的问题无关,但“alt”属性应该描述图像的内容,而“title”更像是我所说的“caption”。换句话说,“alt”文本应该对于完全看不到图像的人来说是可以理解的,而“title”向可以看到图像的人描述图像。只是一点点。;

    【讨论】:

    • 嗯,这似乎不起作用。但你说得很好,我会调整我的代码以获取标题而不是 alt 属性:)
    • 啊,我错过了“.attr('href').val()” - 这是错误的,我会更新我的答案。
    • 还有一点,在我将链接元素包装在div 中之后,img.parent('div') 不再存在,应该类似于img.parent('a').parent('div'),这是草率的但我现在会找到更好的写法啊哈。
    • @Mohammad 可以使用“closest()”,而不是使用“parent()”,它会在 DOM 上向上直到找到你要找的东西。
    • Pointy,我已经在问题空间中更新了我的答案。它看起来是实现前一个的更清洁的方法。我确信有特定于 JQuery 的更有效的方法来编写使用 document.createElement() 而不是 innerHTML 的代码,但目前该知识已在上面。
    【解决方案2】:

    我会这样做:

    var img = $(this);
    var target = $(img).parent();
    if (target.is("a")) {
      target = target.parent();
    }
    target.wrap("<div>");
    var div = target.parent();
    div.addClass("photo");
    $("<p>").attr("alt", $(img).attr("alt")).appendTo(div);
    

    一些浏览器在使用innerHTML 类型的方法创建标记时异常缓慢,所以我倾向于使用上述方法,它使用 diretc DOM 元素创建。澄清一下,至少从 jQuery 1.4+ 开始:

    $("<p class='photo'>...</p>')...
    

    使用innerHTML 但是:

    $("<p>").addClass("photo").text("...");
    

    使用document.createElement()

    【讨论】:

    • 谢谢克莱图斯!您的代码返回以下结果(几乎在那里,但可能需要进行一些调整)&lt;div class="photo"&gt;&lt;div id="parentDiv"&gt;&lt;a href="#"&gt;&lt;img src="photo.jpg" alt="caption"&gt;&lt;/a&gt;&lt;/div&gt;&lt;p alt="caption"&gt;&lt;/p&gt;&lt;/div&gt; 只是使用类“照片”创建的 div 放置在持有父 div 的上方,并且创建的 p 元素持有一个属性应该包含文本“标题”时的标题。
    • cletus 我要查看您的代码并学习调整我的代码以提高效率并使用直接 DOM 元素创建。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多