jQuery .before和.after表现不如预期

时间:2014-07-05 13:57:48

标签: jquery html css

我有以下HTML代码

<p><img src="src.jpg" clas="left" title="image title text"></p>

以下jQuery

$( document ).ready(function() {
    $('img').each(function() {
        var t = $(this).attr('title'),
            c = $(this).attr('class'),
            w = $(this).width();
        $(this).before('<div class="caption ' + c + '">');
        $(this).after(t + '</div>');
    });
});

然而,这给我的输出如下

<p><div class="caption left"></div>
<img src="src.jpg" clas="left" title="image title text">
image title text</p>

我不能为我的生活看到为什么在我指定.after部分中的结束标记之前,DIV的打开和关闭发生了。我敢打赌它是超级基本但我无法看到它。任何帮助都非常受欢迎。

干杯。

3 个答案:

答案 0 :(得分:1)

如果不关闭它,就无法打开div。

或说出它的正确方法:你不能用before(或任何类型的追加算子)打开一个元素而不用相同的操作关闭它。

这意味着你不能拥有.before('<div>'),之后就是.after('</div>')

为此,您可以使用wrap

答案 1 :(得分:1)

您只能向文档添加元素,而不能添加标签。解析页面的HTML代码时,起始和结束标记最终成为DOM中的单个元素对象。

当您尝试添加起始标记时,浏览器将添加结束标记以完成它。当您尝试结束结束标记时,它将被忽略。 (至少在您使用的浏览器中。对于其他浏览器,行为可能会有所不同。)

要将元素包装在另一个元素周围,请使用wrap methodwrapAll method

$(this).wrapAll('<div class="caption ' + c + '"></div>').after(t);

演示:http://jsfiddle.net/JR4j3/

答案 2 :(得分:0)

这就是它的工作方式。您正在使用.before()函数在元素之前插入无效的HTML。没有结束标记的div元素无效,浏览器会自动附加结束标记以尝试解决问题。

不要使用.before()和.after(),而是查看.wrap()方法。