Nhận HTML bên ngoài của phần tử được chọn


792

Tôi đang cố gắng để có được HTML của một đối tượng được chọn bằng jQuery. Tôi nhận thức được .html()chức năng; vấn đề là tôi cần HTML bao gồm cả đối tượng được chọn (một hàng trong trường hợp này, trong đó .html()chỉ trả về các ô bên trong hàng).

Tôi đã tìm kiếm xung quanh và tìm thấy một vài phương pháp nhân bản rất "hackish", thêm nó vào một div mới được tạo, v.v., nhưng điều này có vẻ thực sự bẩn. Có cách nào tốt hơn không, hay phiên bản mới của jQuery (1.4.2) có cung cấp bất kỳ loại outerHtmlchức năng nào không?


89
Thật kỳ quặc khi jQuery không có nghĩa là phải làm một việc như vậy. Tôi cũng cần cái này
Josef Sábl

9
Tôi đã đăng một yêu cầu tính năng, với một tham chiếu đến chủ đề này và phản hồi ban đầu là tích cực. bug.jquery.com/ticket/8142
mindplay.dk

11
Để cứu một số người một vài giây thời gian của họ khỏi thử giải pháp của Ulhas Tuscano, nó không hoạt động.
Dave

73
Uh, wth đang diễn ra. $('div')[0].outerHTML.
Salman von Abbas

24
@Tuscan có nghĩa là $ ("# selectorid"). Prop ("outsHTML")
anh chàng mograbi

Câu trả lời:


189

Chỉnh sửa 2014: Câu hỏi và câu trả lời này là từ năm 2010. Tại thời điểm đó, không có giải pháp nào tốt hơn được phổ biến rộng rãi. Bây giờ, nhiều câu trả lời khác tốt hơn: ví dụ của Eric Hu, hoặc Re Capcha.

Trang web này dường như có một giải pháp cho bạn: jQuery: outsHTML | Đậu hũ

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

4
Tôi đã thấy điều này nhưng đã cố gắng tránh nó bởi vì nó có vẻ như hackish và giống như có một cách tốt hơn, nhưng nó hoạt động tốt. Cảm ơn.
Ryan

359
$ ( '[chọn]') [0] .outerHTML
Drogon

25
@drogon: Lưu ý rằng chỉ outerHTMLđược hỗ trợ trong Firefox kể từ phiên bản 11 (tháng 3 năm 2012).
Blaise

8
@PavingWays: Trong bảo vệ của Firefox: outerHTMLlà một thuộc tính độc quyền được phát minh bởi Microsoft, không phải là tiêu chuẩn W3C. (Sự thật thú vị: chỉ innerHTMLđược chuẩn hóa từ HTML5 )
Blaise

3
thuần jsel.outerHTML || document.createElement('div').appendChild( el.cloneNode( true ) ).parentNode.innerHTML
rab

675

Tôi tin rằng hiện tại (5/1/2012), tất cả các trình duyệt chính đều hỗ trợ chức năng bên ngoàiHTML. Dường như với tôi rằng đoạn trích này là đủ. Cá nhân tôi sẽ chọn ghi nhớ điều này:

// 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('');

EDIT : Số liệu thống kê hỗ trợ cơ bản choelement.outerHTML


14
@SalmanPK FireFox đã không hỗ trợ tài sản này cho đến 2011-11-11. bugzilla.mozilla.org/show_orms.cgi?id=92264 Vẫn còn rất nhiều người dùng bị mắc kẹt trên 3.6. Tôi nghĩ rằng đây thực sự là một ví dụ hoàn hảo về lý do tại sao người ta lại chọn sử dụng jQuery hơn chức năng bản địa.
Lucifer Sam

8
@LuciferSam Firefox 3.6 có ~ 6% thị phần toàn cầu theo gs.statc gặp.com Tuy nhiên, việc lọc kết quả trong 6 tháng qua (Dec '11 -May '12) và sang Hoa Kỳ đẩy nó ra khỏi danh sách 12 hàng đầu của họ (dưới 3 %). Tôi đã chọn cửa sổ này vì bài viết này cho thấy việc sử dụng FF 3.6 giảm đáng kể sau tháng 1 năm 2012. Với dữ liệu này, tôi đứng trước giải pháp của mình cho mã đơn giản hơn khả năng tương thích ngược.
Eric Hu

4
Không thể đồng ý nhiều hơn. Đây là câu trả lời đúng ở đây, không phải những thứ khác mà mọi người đang đề xuất. Phần tử tôi chọn có các thuộc tính tôi muốn giữ lại bị mất bởi các câu trả lời khác. Chết tiệt, cái này thậm chí còn hoạt động trong IE!
Matthew Bonig

Số Firefox 11 không được phát hành cho đến ngày 13 tháng 3 năm 2012 (đã được sửa bây giờ), tức là chưa đầy một năm trước khi viết bài này. Một trong những lợi ích của jQuery là nó hỗ trợ các trình duyệt cũ hơn. Tôi nghĩ rằng hỗ trợ ít nhất một năm là hợp lý và một số trang web rõ ràng sẽ muốn nhiều hơn nữa (hãy nhớ, jQuery hỗ trợ IE6).
Matthew Flaschen

7
Trình thống kê @EricHu cũng cho biết IE8 có 9,3% chia sẻ trình duyệt toàn cầu. Tuy nhiên, một số trang web của tôi gần với mức 40%. Tất cả đều tương đối và thay đổi rất nhiều từ trang web này sang trang web khác, Firefox 3.6 vẫn chiếm khoảng 10% trên một số trang web của tôi. Thị trường toàn cầu có nghĩa là gì. Đó là tất cả về khán giả trang web của bạn.
George Reith

343

Không cần phải tạo một chức năng cho nó. Chỉ cần làm như thế này:

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

(Nhân tiện, bảng điều khiển của trình duyệt của bạn sẽ hiển thị những gì được ghi lại. Hầu hết các trình duyệt mới nhất kể từ khoảng năm 2009 đều có tính năng này.)

Điều kỳ diệu là điều này ở cuối:

.clone().wrap('<p>').parent().html();

Bản sao có nghĩa là bạn không thực sự làm phiền DOM. Chạy nó mà không có nó và bạn sẽ thấy pcác thẻ được chèn trước / sau tất cả các siêu liên kết (trong ví dụ này), điều này là không mong muốn. Vì vậy, có, sử dụng .clone().

Cách thức hoạt động của nó là lấy từng athẻ, tạo một bản sao của nó trong RAM, bọc bằng pcác thẻ, lấy cha mẹ của nó (có nghĩa là pthẻ) và sau đó lấy thuộc innerHTMLtính của nó.

EDIT : Nhận lời khuyên và thay đổi divthẻ thành pthẻ vì nó ít gõ và hoạt động giống nhau.


82
Tôi tự hỏi tại sao nhóm jQuery không thêm phương thức outsHtml ()?
Donny V.

1
@Derek, điều đó sẽ không quan trọng. Tôi đang sử dụng DIV như một trình bao bọc để có được thứ gì đó bên trong nó.
Volomike

11
.clone (). quấn ('<p>'). Parent (). html (); ngắn hơn
Uğur Gümüşhan

1
Có, ít nhấn phím và đạt được hiệu quả tương tự.
Volomike

14
Tốt hơn là sử dụng DIV thay vì P cho một giải pháp chung - không phải tất cả các yếu tố có thể được bọc trong P dưới dạng HTML hợp lệ.
Blazemonger

149

Thế còn : prop('outerHTML')?

var outerHTML_text = $('#item-to-be-selected').prop('outerHTML');

Và để thiết lập:

$('#item-to-be-selected').prop('outerHTML', outerHTML_text);

Nó làm việc cho tôi.

PS : Điều này được thêm vào trong jQuery 1.6 .


4
Mã rất gọn gàng và nhỏ so với các câu trả lời khác. H: Điều này có các hạn chế bên ngoài tương tự như đã lưu ý trong các câu trả lời khác không? Nó có hoạt động trong FF <11 không?
Macroman

3
Hoạt động tốt, đây có thể là giải pháp tốt nhất ở đây. Đối với các trình duyệt, điều này sẽ tương thích như ngoàiHTLM. Phương thức prop () về cơ bản chỉ là lấy thuộc tínhHTML bên ngoài.
Tom Tom

2
Giải pháp này tốt hơn, tuy nhiên Jquery 1.6.1 đã được phát hành vào năm 2011. Câu hỏi (và câu trả lời của tôi) là từ năm 2010
David V.

1
Đối với tôi "$ ('[bộ chọn]') [0] .outerHTML;" đã không hoạt động trong mọi trường hợp, nhưng "$ ('# item-to-be-select'). prop ('outsHTML');" Đúng!
Eduardo Lucio

2
$ ('# item-to-be-select'). attr ('outsHTML'); // ** Đối với các jQuery trước đó
Meetai.com 3/03/2015

91

Mở rộng jQuery:

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

Và sử dụng nó như thế này: $("#myTableRow").outerHTML();


8
Vấn đề nhỏ với giải pháp này: bạn cần sao chép () trước khi bạn bọc (), nếu không, bạn sẽ để lại gói thêm <div> trong tài liệu.
mindplay.dk

1
Cảm ơn, mindplay.dk - Tôi đã chỉnh sửa mã để kết hợp đề xuất của bạn .. bắt tốt. :)
jessica

2
Điều gì về việc đảo ngược điều đó thành: return $('<div>').append(this.clone()).html();Đó chỉ là một chút nữa.
Justin Warkentin

2
Trước tiên, bạn nên kiểm tra bên ngoàiHTML và chỉ sử dụng nó cho các trình duyệt hỗ trợ nó
James Westgate

Điều này rất tốt cho những người như tôi, những người thích xây dựng HTML trong các phản hồi AJAX bằng cách sử dụng các đối tượng jQuery và các hàm .appendTo () và .append (). .outerHTML không hoạt động cho những trường hợp đó từ những gì tôi thấy trong thử nghiệm của mình. Một số người khác có thể muốn kiểm tra thêm, nhưng tôi không có thời gian.
Sean Kendle

43

Tôi đồng ý với Arpan (ngày 13 tháng 12 '10 5:59).

Cách làm của anh ta thực sự là một cách tốt hơn để làm điều đó, vì bạn không sử dụng bản sao. Phương pháp nhân bản rất tốn thời gian, nếu bạn có các phần tử con và dường như không ai khác quan tâm rằng IE thực sự CÓ outerHTMLthuộc tính (vâng IE thực sự có MỘT SỐ thủ thuật hữu ích trong tay áo).

Nhưng tôi có thể sẽ tạo ra kịch bản của anh ấy một chút khác biệt:

$.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;
    }
};

2
Điều này làm việc hoàn hảo cho tôi. Do một lỗi với clone()textarea, tôi cần một giải pháp không nhân bản, và đây là điểm chính.
Shpigford

5
+1 để sử dụng nguồn gốc outerHTMLnếu có, do Chrome hỗ trợ cùng với Internet Explorer.
Andy E

9
cảnh báo if (! ('outsHTML' trong $ t [0])) ('thần chết tiệt, cập nhật trình duyệt của bạn');
tâm lý brm

19

Để thực sự là jQuery-esque, bạn có thể muốn outerHTML()trở thành một getter setter và có hành vi tương tự html()như có thể:

$.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;
}

Bản demo hoạt động: http://jsfiddle.net/AndyE/WLKAa/

Điều này cho phép chúng tôi chuyển một đối số để outerHTML , có thể là

  • một chức năng có thể hủy - function (index, oldOuterHTML) { } - trong đó giá trị trả về sẽ trở thành HTML mới cho phần tử (trừ khi falseđược trả về).
  • một chuỗi, sẽ được đặt thay cho HTML của từng thành phần.

Để biết thêm thông tin, hãy xem tài liệu jQuery cho html().


Điều này nên được thêm vào lõi jQuery để mọi người không cần phải suy nghĩ về nó. Câu hỏi duy nhất của tôi là liệu quấn () / unsrap () có khả năng tốt hơn hay kém hơn so với clone ()?
IMSoP

1
IMSoP: Nói chung, bọc / unsrap sẽ nhanh hơn vì bản sao phải sao chép tất cả các phần tử con và thuộc tính của phần tử. quấn () chỉ tạo ra một phần tử duy nhất và unsrap () phá hủy nó, tất cả các phần tử khác chỉ được di chuyển, đây là thao tác khá nhanh trong hầu hết thời gian.
Andy E

16

Bạn cũng có thể sử dụng get (Lấy các phần tử DOM khớp với đối tượng jQuery.).

ví dụ:

$('div').get(0).outerHTML;//return "<div></div>"

Là phương pháp mở rộng:

jQuery.fn.outerHTML = function () {
  return this.get().map(function (v) {
    return v.outerHTML
  }).join()
};

Hoặc là

jQuery.fn.outerHTML = function () {
  return $.map(this.get(), function (v) {
    return v.outerHTML
  }).join()
};

Nhiều lựa chọn và trả về html bên ngoài của tất cả các yếu tố phù hợp.

$('input').outerHTML()

trở về:

'<input id="input1" type="text"><input id="input2" type="text">'

11

Để tạo một plugin FULL jQuery như .outerHTML, hãy thêm đoạn mã sau vào bất kỳ tệp js nào và đưa vào sau jQuery trong tiêu đề của bạn:

cập nhật Phiên bản mới có quyền kiểm soát tốt hơn cũng như dịch vụ thân thiện với jQuery Selector hơn! :)

;(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);

Điều này sẽ cho phép bạn không chỉ nhận đượcHTML bên ngoài của một phần tử, mà thậm chí còn nhận được trả về Mảng của nhiều phần tử cùng một lúc! và có thể được sử dụng trong cả hai kiểu tiêu chuẩn jQuery như sau:

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

Đối với nhiều yếu tố

$("#firstEle, .someElesByClassname, tag").outerHTML();

Ví dụ về đoạn trích:


9

bạn cũng có thể làm theo cách này

document.getElementById(id).outerHTML

trong đó id là id của phần tử mà bạn đang tìm kiếm


4
$("#" + id).attr("id")là vô cùng dư thừa. Nếu bạn đã có id trong một biến, tại sao bạn lại sử dụng bộ chọn jquery để kéo phần tử từ dom, sau đó truy vấn thuộc tính ID của nó?
Sam Dufel

7

Tôi đã sử dụng giải pháp của Jessica (được Josh chỉnh sửa) để làm choHTML bên ngoài hoạt động trên Firefox. Tuy nhiên, vấn đề là mã của tôi bị phá vỡ vì giải pháp của cô ấy đã bọc phần tử vào DIV. Thêm một dòng mã đã giải quyết vấn đề đó.

Đoạn mã sau cung cấp cho bạn bên ngoàiHTML để cây DOM không thay đổi.

$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;
    }
}

Và sử dụng nó như thế này: $ ("# myDiv"). OuterHTML ();

Hy vọng ai đó thấy nó hữu ích!


1
Chỉ cần sử dụng .clone như @mindplay gợi ý trong nhận xét của anh ấy - nó dễ dàng hơn
Yarin


4

Nếu kịch bản đang nối thêm một hàng mới một cách linh hoạt, bạn có thể sử dụng điều này:

var row = $(".myRow").last().clone();
$(".myRow").last().after(row);

.myrowlà tên lớp của <tr>. Nó tạo một bản sao của hàng cuối cùng và chèn nó như một hàng cuối cùng mới. Điều này cũng hoạt động trong IE7 , trong khi [0].outerHTMLphương thức không cho phép các bài tập trong eg7


3

node.cloneNode () hầu như không giống như một hack. Bạn có thể sao chép nút và nối nó vào bất kỳ phần tử cha mong muốn nào và cũng thao tác nó bằng cách thao tác các thuộc tính riêng lẻ, thay vì phải chạy các biểu thức chính quy trên nó hoặc thêm nó vào DOM, sau đó thao tác với nó.

Điều đó nói rằng, bạn cũng có thể lặp lại các thuộc tính của phần tử để xây dựng một biểu diễn chuỗi HTML của nó. Có vẻ như đây là cách mà bất kỳ chức năng bên ngoài nào sẽ được triển khai là jQuery để thêm một chức năng.


3

Tôi đã sử dụng giải pháp của Volomike được cập nhật bởi Jessica. Chỉ cần thêm một kiểm tra để xem nếu phần tử tồn tại và làm cho nó trở lại trống trong trường hợp nó không.

jQuery.fn.outerHTML = function() {
return $(this).length > 0 ? $(this).clone().wrap('<div />').parent().html() : '';
};

Tất nhiên, sử dụng nó như:

$('table#buttons').outerHTML();

3

Bạn có thể tìm thấy một tùy chọn .outerHTML () tốt tại đây https://github.com/darlesson/jquery-outerhtml .

Không giống như .html () chỉ trả về nội dung HTML của phần tử, phiên bản .outerHTML () này trả về phần tử đã chọn và nội dung HTML của nó hoặc thay thế nó dưới dạng phương thức .replaceWith () nhưng với sự khác biệt cho phép HTML thay thế được kế thừa sự xiềng xích

Ví dụ cũng có thể được nhìn thấy trong URL ở trên.


2

Lưu ý rằng giải pháp của Josh chỉ hoạt động cho một yếu tố duy nhất.

Có thể cho rằng, HTML "bên ngoài" chỉ thực sự có ý nghĩa khi bạn có một yếu tố duy nhất, nhưng có những tình huống có ý nghĩa khi lấy danh sách các yếu tố HTML và biến chúng thành đánh dấu.

Mở rộng giải pháp của Josh, cái này sẽ xử lý nhiều yếu tố:

(function($) {
  $.fn.outerHTML = function() {
    var $this = $(this);
    if ($this.length>1)
      return $.map($this, function(el){ return $(el).outerHTML(); }).join('');
    return $this.clone().wrap('<div/>').parent().html();
  }
})(jQuery);

Chỉnh sửa: một vấn đề khác với giải pháp của Josh đã được sửa, xem bình luận ở trên.


1
Hầu hết các phương thức "getter" của jQuery chỉ trả về dữ liệu cho phần tử đầu tiên, do đó, sẽ hợp lý hơn khi khớp với hành vi này.
Andy E

Tôi nghĩ rằng tôi đã nêu rõ tại sao nó hoạt động theo cách này? Nó sẽ tạo mã xấu / phức tạp khi bạn có một danh sách các phần tử - nếu vì lý do nào đó bạn muốn đánh dấu chỉ cho phần tử đầu tiên, chỉ cần sử dụng: đầu tiên trong bộ chọn của bạn.
mindplay.dk

Chắc chắn, giống như bạn chỉ có thể sử dụng bản đồ với giải pháp của mọi người khác để có được HTML gồm nhiều yếu tố. Tất cả những gì tôi đã nói là nó phù hợp hơn với hoạt động của các phương thức jQuery tiêu chuẩn.
Andy E


2

Tôi đã thực hiện thử nghiệm đơn giản này với bên ngoàiHTML là giải pháp tokimon (không có bản sao) và bên ngoàiHTML2 là giải pháp jessica (bản sao)

console.time("outerHTML");
for(i=0;i<1000;i++)
 {                 
  var html = $("<span style='padding:50px; margin:50px; display:block'><input type='text' title='test' /></span>").outerHTML();
 }                 
console.timeEnd("outerHTML");

console.time("outerHTML2");

 for(i=0;i<1000;i++)
 {                 
   var html = $("<span style='padding:50px; margin:50px; display:block'><input type='text' title='test' /></span>").outerHTML2();
  }                 
  console.timeEnd("outerHTML2");

và kết quả trong trình duyệt crôm (Phiên bản 20.0.1132.57 (0)) của tôi là

bên ngoàiHTML: 81ms
bên ngoàiHTML2: 439ms

nhưng nếu chúng ta sử dụng giải pháp tokimon mà không có chức năng bên ngoài gốc (hiện được hỗ trợ trong hầu hết mọi trình duyệt)

chúng tôi nhận được

bên ngoàiHTML: 594ms
bên ngoàiHTML2: 332ms

và sẽ có nhiều vòng lặp và các yếu tố hơn trong các ví dụ trong thế giới thực, vì vậy sự kết hợp hoàn hảo sẽ là

$.fn.outerHTML = function() 
{
  $t = $(this);
  if( "outerHTML" in $t[0] ) return $t[0].outerHTML; 
  else return $t.clone().wrap('<p>').parent().html(); 
}

vì vậy phương thức clone thực sự nhanh hơn phương thức quấn / unsrap
(jquery 1.7.2)


2

Đây là một plugin bên ngoài được tối ưu hóa rất tốt cho jquery: ( http://jsperf.com/outerhtml-vs-jquery-clone-hack/5 => 2 đoạn mã nhanh khác không tương thích với một số trình duyệt như FF <11)

(function($) {

  var DIV = document.createElement("div"),
      outerHTML;

  if ('outerHTML' in DIV) {
    outerHTML = function(node) {
      return node.outerHTML;
    };
  } else {
    outerHTML = function(node) {
      var div = DIV.cloneNode();
      div.appendChild(node.cloneNode(true));
      return div.innerHTML;
    };
  }

  $.fn.outerHTML = function() {
    return this.length ? outerHTML(this[0]) : void(0);
  };

})(jQuery);

@Andy E => Tôi không đồng ý với bạn. outsHMTL không cần getter VÀ setter: jQuery đã cung cấp cho chúng tôi 'thay thế' ...

@mindplay => Tại sao bạn tham gia tất cả bên ngoàiHTML? jquery.html chỉ trả lại nội dung HTML của phần tử FIRST.

(Xin lỗi, không có đủ danh tiếng để viết bình luận)


2

Ngắn và ngọt.

[].reduce($('.x'), function(i,v) {return i+v.outerHTML}, '')

hoặc sự kiện ngọt ngào hơn với sự trợ giúp của các chức năng mũi tên

[].reduce.call($('.x'), (i,v) => i+v.outerHTML, '')

hoặc hoàn toàn không có jQuery

[].reduce.call(document.querySelectorAll('.x'), (i,v) => i+v.outerHTML, '')

hoặc nếu bạn không thích cách tiếp cận này, hãy kiểm tra xem

$('.x').get().reduce((i,v) => i+v.outerHTML, '')

2

Điều này khá đơn giản với JavaScript vanilla ...

document.querySelector('#selector')

1

Điều này rất tốt cho việc thay đổi các phần tử trên dom nhưng KHÔNG hoạt động, tức là khi chuyển một chuỗi html vào jquery như thế này:

$('<div id="foo">Some <span id="blog">content</span></div>').find('#blog').outerHTML();

Sau một số thao tác, tôi đã tạo ra một hàm cho phép hoạt động ở trên tức là đối với các chuỗi html:

$.fn.htmlStringOuterHTML = function() {     
    this.parent().find(this).wrap('<div/>');        
    return this.parent().html();
};


0

Tôi đã gặp phải vấn đề này trong khi tìm kiếm câu trả lời cho vấn đề của mình, đó là tôi đang cố xóa một hàng của bảng sau đó thêm nó vào cuối bảng (vì tôi đang tự động tạo các hàng dữ liệu nhưng muốn hiển thị 'Thêm mới Ghi 'loại hàng ở phía dưới).

Tôi có một vấn đề tương tự, đó là việc trả lại InternalHtml nên đã thiếu các thẻ TR, giữ ID của hàng đó và có nghĩa là không thể lặp lại quy trình.

Câu trả lời tôi tìm thấy là remove()hàm jquery thực sự trả về phần tử, mà nó loại bỏ, như là một đối tượng. Vì vậy, để loại bỏ và thêm lại một hàng, nó đơn giản như thế này ...

var a = $("#trRowToRemove").remove();            
$('#tblMyTable').append(a);  

Nếu bạn không xóa đối tượng nhưng muốn sao chép nó ở nơi khác, hãy sử dụng clone()chức năng thay thế.


0

Plugin jQuery như một cách viết tắt để trực tiếp lấy toàn bộ phần tử HTML:

jQuery.fn.outerHTML = function () {
    return jQuery('<div />').append(this.eq(0).clone()).html();
};

Và sử dụng nó như thế này: $(".element").outerHTML();


-2
$("#myNode").parent(x).html(); 

Trong đó 'x' là số nút, bắt đầu bằng 0 là số đầu tiên, sẽ lấy đúng nút bạn muốn, nếu bạn đang cố lấy một nút cụ thể. Tuy nhiên, nếu bạn có các nút con, bạn thực sự nên đặt ID vào cái bạn muốn, mặc dù vậy, chỉ bằng 0 trên cái đó. Sử dụng phương pháp đó và không có 'x' nào hoạt động tốt với tôi.


1
Mọi người bỏ phiếu này, quan tâm để lại nhận xét? Tôi đang có mã đi tới PHỤ HUYNH, sau đó lấy HTML của nội dung - không chỉ thực hiện .html()phần tử đã cho. CÔNG TRÌNH NÀY và tôi muốn một lời giải thích tại sao nó không.
vapcguy

-4

Giải pháp đơn giản.

var myself = $('#div').children().parent();

-12
$("#myTable").parent().html();

Có lẽ tôi không hiểu đúng câu hỏi của bạn, nhưng điều này sẽ nhận được html của phần tử cha của phần tử được chọn.

Có phải đó là những gì bạn đang theo đuổi?


25
Thực tế là không, bởi vì nếu cha mẹ đó có những đứa con khác, anh ta cũng sẽ nhận được html đó.
David V.

1
...những gì ông nói. Tôi đang tìm kiếm chính yếu tố đó, không phải nó và tất cả những đứa trẻ khác của cha mẹ nó. Làm thế nào điều này có được hai phiếu bầu lên ???
Ryan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.