获取所选元素的外部HTML

Rya*_*yan 780 jquery

我正在尝试使用jQuery获取所选对象的HTML.我知道这个.html()功能; 问题是我需要包含所选对象的HTML(在这种情况下是一个表行,其中.html()只返回行内的单元格).

我已经四处搜索并发现了一些克隆对象的非常"hackish"类型的方法,将它添加到新创建的div等等,但这看起来真的很脏.有没有更好的方法,或新版本的jQuery(1.4.2)是否提供任何类型的outerHtml功能?

Eri*_* Hu 662

我相信目前(2012年5月1日),所有主流浏览器都支持outerHTML功能.在我看来,这个片段就足够了.我个人会选择记住这个:

// Gives you the DOM element without the outside wrapper you want
$('.classSelector').html()

// Gives you the outside wrapper as well only for the first element
$('.classSelector')[0].outerHTML

// Gives you the outer HTML for all the selected elements
var html = '';
$('.classSelector').each(function () {
    html += this.outerHTML;
});

//Or if you need a one liner for the previous code
$('.classSelector').get().map(function(v){return v.outerHTML}).join('');
Run Code Online (Sandbox Code Playgroud)

编辑:基本支持统计element.outerHTML

  • @SalmanPK FireFox直到2011-11-11才支持这个属性.https://bugzilla.mozilla.org/show_bug.cgi?id=92264仍然有很多用户坚持使用3.6.我认为这实际上是一个完美的例子,为什么人们会选择使用jQuery而不是本机功能. (14认同)
  • 根据gs.statcounter.com,@ LucucSam Firefox 3.6拥有约6%的全球市场份额但是,[过滤结果](http://gs.statcounter.com/#browser_version-US-monthly-201112-201205-bar)过去6个月(11月11日 - 5月12日)和美国将其排在前12位(低于3%).我之所以选择这个窗口是因为[本文](http://www.maximumpc.com/article/news/advertised_update_leads_sharp_decline_firefox_36_usage)表明2012年1月之后FF 3.6的使用率大幅下降.鉴于这些数据,我支持我的解决方案,以简化代码兼容性. (8认同)
  • @EricHu statcounter还表示,IE8拥有全球浏览器份额的9.3%.然而,我的一些网站接近40%的标记.它们都是相对的,并且从网站到网站各不相同,Firefox 3.6在我的一些网站上仍占大约10%.全球市场份额毫无意义.这完全取决于您的网站受众. (7认同)
  • 不能同意更多.这是正确的答案,而不是人们建议的其他东西.我选择的元素具有我想要保留的属性,这些属性会被其他答案丢失.天哪,这甚至可以在IE中运行! (4认同)

Vol*_*ike 343

无需为其生成函数.就这样做:

$('a').each(function(){
    var s = $(this).clone().wrap('<p>').parent().html();
    console.log(s);
});
Run Code Online (Sandbox Code Playgroud)

(顺便提一下,您的浏览器控制台将显示记录的内容.自2009年左右以来,大多数最新的浏览器都具有此功能.)

最终的神奇之处在于:

.clone().wrap('<p>').parent().html();
Run Code Online (Sandbox Code Playgroud)

克隆意味着你实际上并没有打扰DOM.没有它运行它你会看到p在所有超链接之前/之后插入标签(在这个例子中),这是不可取的.所以,是的,使用.clone().

它的工作方式是它接受每个a标记,在RAM中复制它,用p标记包装,获取它的父项(意味着p标记),然后获取innerHTML它的属性.

编辑:提出建议并将div标签更改为p标签,因为它的输入较少且工作原理相同.

  • 我想知道为什么jQuery团队不添加outerHtml()方法? (82认同)
  • 最好使用DIV而不是P作为一般解决方案 - 并非所有元素都可以作为有效的HTML包装在P中. (14认同)
  • ..clone()包裹( '<P>')母体()HTML().; 更短 (11认同)

Dav*_* V. 187

2014年编辑:问题和回复是从2010年开始的.当时,没有更好的解决方案可供广泛使用.现在,许多其他回复都更好:例如Eric Hu,或Re Capcha.

这个网站似乎有一个解决方案: jQuery:outerHTML | Yelotofu

jQuery.fn.outerHTML = function(s) {
    return s
        ? this.before(s).remove()
        : jQuery("<p>").append(this.eq(0).clone()).html();
};
Run Code Online (Sandbox Code Playgroud)

  • $( '[选择器]')[0] .outerHTML (358认同)
  • `$('div').clone().wrap('<div>').parent().html()`semantic (41认同)
  • @drogon:请注意,自版本11(2012年3月)以来,Firefox中仅支持`outerHTML`. (25认同)
  • @PavingWays:在Firefox的辩护中:`outerHTML`是微软发明的专有属性,而不是W3C标准.(有趣的事实:[`innerHTML`仅在HTML5之后才被标准化](http://www.w3.org/TR/2008/WD-html5-20080610/dom.html#innerhtml0)) (8认同)
  • 我看到了这个但是试图避免它,因为它似乎是hackish,并且应该有一个更好的方法,但它运作良好.谢谢. (4认同)
  • 纯js`el.outerHTML || document.createElement('div').appendChild(el.cloneNode(true)).parentNode.innerHTML` (3认同)
  • @Blaise请注意,根据[marketshare](http://www.netmarketshare.com/report.aspx?qprid=3&qpaf=&qpcustom=Firefox+10&qpcustomb=0),Firefox 10的市场份额约为0.18%. (2认同)
  • @reggie这个回复是6岁.2年前我编辑了回复,说其他回复更好.此时,你正在向合唱团讲道. (2认同)

Re *_*cha 146

怎么样prop('outerHTML')

var outerHTML_text = $('#item-to-be-selected').prop('outerHTML');
Run Code Online (Sandbox Code Playgroud)

并设置:

$('#item-to-be-selected').prop('outerHTML', outerHTML_text);
Run Code Online (Sandbox Code Playgroud)

它对我有用.

PS:这是在jQuery 1.6中添加的.

  • 与其他答案相比,代码非常简洁.问:这是否具有与其他答案中所述相同的outerHTML限制?它在FF <11中有效吗? (4认同)
  • 效果很好,这可能只是这里最好的解决方案.对于浏览器来说,这应该与outerHTLM兼容.prop()方法基本上只是获取outerHTML属性. (2认同)
  • 这个解决方案更好,但Jquery 1.6.1于2011年发布.问题(和我的回复)是2010年. (2认同)
  • $( '#项对待选')ATTR( 'outerHTML'); //**对于早期的jQuery (2认同)

jes*_*ica 90

扩展jQuery:

(function($) {
  $.fn.outerHTML = function() {
    return $(this).clone().wrap('<div></div>').parent().html();
  };
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

并像这样使用它: $("#myTableRow").outerHTML();

  • 这个解决方案的小问题:你需要在wrap()之前克隆(),否则你将在文档中留下额外的包装<div>. (8认同)
  • 感谢您将我的建议转换为扩展程序.可笑的是,jQ还没有内置这个...... (4认同)
  • 那么将它反转为:`return $('<div>').append(this.clone()).html();`这只是一点点. (2认同)
  • 您应首先检查outerHTML,然后将其用于支持它的浏览器 (2认同)

Tok*_*mon 43

我同意Arpan(2010年12月13日5:59).

他这样做的方式实际上是一种更好的方法,因为你不使用克隆.克隆方法非常耗时,如果你有子元素,并且没有其他人似乎关心IE实际上有outerHTML属性(是的IE实际上有一些有用的技巧).

但我可能会创建他的脚本有点不同:

$.fn.outerHTML = function() {
    var $t = $(this);
    if ($t[0].outerHTML !== undefined) {
        return $t[0].outerHTML;
    } else {
        var content = $t.wrap('<div/>').parent().html();
        $t.unwrap();
        return content;
    }
};
Run Code Online (Sandbox Code Playgroud)

  • if(!($ t [0]中的'outerHTML'))alert('god dammit,update your browser'); (9认同)
  • 在可用时使用原生`outerHTML`的+1,因为除了Internet Explorer之外,Chrome还支持它. (5认同)
  • 这对我很有用.由于`clone()`和`textarea`的错误,我需要一个非克隆解决方案,这是现货. (2认同)

And*_*y E 19

要成为真正的jQuery-esque,您可能希望outerHTML()成为getter setter并使其行为尽可能类似html():

$.fn.outerHTML = function (arg) {
    var ret;

    // If no items in the collection, return
    if (!this.length)
        return typeof arg == "undefined" ? this : null;
    // Getter overload (no argument passed)
    if (!arg) {
        return this[0].outerHTML || 
            (ret = this.wrap('<div>').parent().html(), this.unwrap(), ret);
    }
    // Setter overload
    $.each(this, function (i, el) {
        var fnRet, 
            pass = el,
            inOrOut = el.outerHTML ? "outerHTML" : "innerHTML";

        if (!el.outerHTML)
            el = $(el).wrap('<div>').parent()[0];

        if (jQuery.isFunction(arg)) { 
            if ((fnRet = arg.call(pass, i, el[inOrOut])) !== false)
                el[inOrOut] = fnRet;
        }
        else
            el[inOrOut] = arg;

        if (!el.outerHTML)
            $(el).children().unwrap();
    });

    return this;
}
Run Code Online (Sandbox Code Playgroud)

工作演示:http://jsfiddle.net/AndyE/WLKAa/

这允许我们传递参数outerHTML,可以是

  • 可取消的函数 - function (index, oldOuterHTML) { }- 返回值将成为元素的新HTML(除非false返回).
  • 一个字符串,它将被设置为代替每个元素的HTML.

有关更多信息,请参阅jQuery文档html().


MJ *_*ili 16

您还可以使用get(检索与jQuery对象匹配的DOM元素.).

例如:

$('div').get(0).outerHTML;//return "<div></div>"
Run Code Online (Sandbox Code Playgroud)

作为扩展方法:

jQuery.fn.outerHTML = function () {
  return this.get().map(function (v) {
    return v.outerHTML
  }).join()
};
Run Code Online (Sandbox Code Playgroud)

要么

jQuery.fn.outerHTML = function () {
  return $.map(this.get(), function (v) {
    return v.outerHTML
  }).join()
};
Run Code Online (Sandbox Code Playgroud)

多项选择并返回所有匹配元素的外部html.

$('input').outerHTML()
Run Code Online (Sandbox Code Playgroud)

返回:

'<input id="input1" type="text"><input id="input2" type="text">'
Run Code Online (Sandbox Code Playgroud)


SpY*_*3HH 11

要制作一个完整的jQuery插件.outerHTML,将以下脚本添加到任何js文件中,并在标题中包含jQuery之后:

更新新版本有更好的控制以及更多的jQuery Selector友好服务!:)

;(function($) {
    $.extend({
        outerHTML: function() {
            var $ele = arguments[0],
                args = Array.prototype.slice.call(arguments, 1)
            if ($ele && !($ele instanceof jQuery) && (typeof $ele == 'string' || $ele instanceof HTMLCollection || $ele instanceof Array)) $ele = $($ele);
            if ($ele.length) {
                if ($ele.length == 1) return $ele[0].outerHTML;
                else return $.map($("div"), function(ele,i) { return ele.outerHTML; });
            }
            throw new Error("Invalid Selector");
        }
    })
    $.fn.extend({
        outerHTML: function() {
            var args = [this];
            if (arguments.length) for (x in arguments) args.push(arguments[x]);
            return $.outerHTML.apply($, args);
        }
    });
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

这样您不仅可以获得一个元素的outerHTML,甚至可以同时获得多个元素的Array返回!并且可以在两种jQuery标准样式中使用:

$.outerHTML($("#eleID")); // will return outerHTML of that element and is 
// same as
$("#eleID").outerHTML();
// or
$.outerHTML("#eleID");
// or
$.outerHTML(document.getElementById("eleID"));
Run Code Online (Sandbox Code Playgroud)

对于多个元素

$("#firstEle, .someElesByClassname, tag").outerHTML();
Run Code Online (Sandbox Code Playgroud)

片段示例:

console.log('$.outerHTML($("#eleID"))'+"\t", $.outerHTML($("#eleID"))); 
console.log('$("#eleID").outerHTML()'+"\t\t", $("#eleID").outerHTML());
console.log('$("#firstEle, .someElesByClassname, tag").outerHTML()'+"\t", $("#firstEle, .someElesByClassname, tag").outerHTML());

var checkThisOut = $("div").outerHTML();
console.log('var checkThisOut = $("div").outerHTML();'+"\t\t", checkThisOut);
$.each(checkThisOut, function(i, str){ $("div").eq(i).text("My outerHTML Was: " + str); });
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://rawgit.com/JDMcKinstry/ce699e82c7e07d02bae82e642fb4275f/raw/deabd0663adf0d12f389ddc03786468af4033ad2/jQuery.outerHTML.js"></script>
<div id="eleID">This will</div>
<div id="firstEle">be Replaced</div>
<div class="someElesByClassname">At RunTime</div>
<h3><tag>Open Console to see results</tag></h3>
Run Code Online (Sandbox Code Playgroud)


小智 9

你也可以这样做

document.getElementById(id).outerHTML
Run Code Online (Sandbox Code Playgroud)

其中id是您要查找的元素的id

  • `$("#"+ id).attr("id")`非常多余.如果你已经在变量中有了id,为什么你使用jquery选择器从dom中提取元素,然后查询它的ID属性? (4认同)

小智 7

我使用了Jessica的解决方案(由Josh编辑)来使outerHTML能够在Firefox上运行.然而问题是我的代码破坏了,因为她的解决方案将元素包装到DIV中.再添加一行代码解决了这个问题.

以下代码为您提供了外部HTML,使DOM树保持不变.

$jq.fn.outerHTML = function() {
    if ($jq(this).attr('outerHTML'))
        return $jq(this).attr('outerHTML');
    else
    {
    var content = $jq(this).wrap('<div></div>').parent().html();
        $jq(this).unwrap();
        return content;
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用它:$("#myDiv").outerHTML();

希望有人发现它有用!


Abd*_*UMI 6

// no cloning necessary    
var x = $('#xxx').wrapAll('<div></div>').parent().html(); 
alert(x);
Run Code Online (Sandbox Code Playgroud)

在这里小提琴:http://jsfiddle.net/ezmilhouse/Mv76a/