Próbuję pobrać HTML wybranego obiektu za pomocą jQuery. Jestem świadomy tej .html()
funkcji; Problemem jest to, że potrzebuję kodu HTML zawierającego wybrany obiekt (w tym przypadku wiersz tabeli, w którym .html()
zwracane są tylko komórki wewnątrz wiersza).
Szukałem wokoło i znalazłem kilka bardzo „hackerskich” metod klonowania obiektu, dodawania go do nowo utworzonego pliku div itp., Ale wydaje się to naprawdę brudne. Czy jest jakiś lepszy sposób, czy też nowa wersja jQuery (1.4.2) oferuje jakąkolwiek outerHtml
funkcjonalność?
$('div')[0].outerHTML
.Odpowiedzi:
Edycja 2014: Pytanie i ta odpowiedź pochodzą z 2010 roku. W tym czasie żadne lepsze rozwiązanie nie było powszechnie dostępne. Teraz wiele innych odpowiedzi jest lepszych: na przykład Eric Hu lub Re Capcha.
Ta witryna wydaje się mieć dla Ciebie rozwiązanie: jQuery: outerHTML | Yelotofu
źródło
outerHTML
jest obsługiwany w Firefoksie tylko od wersji 11 (marzec 2012).outerHTML
jest zastrzeżonym atrybutem wymyślonym przez Microsoft, a nie standardem W3C. (Ciekawostka:innerHTML
jest znormalizowany tylko od HTML5 )el.outerHTML || document.createElement('div').appendChild( el.cloneNode( true ) ).parentNode.innerHTML
Uważam, że obecnie (5/1/2012) wszystkie główne przeglądarki obsługują funkcję outerHTML. Wydaje mi się, że ten fragment jest wystarczający. Osobiście wolałbym zapamiętać to:
EDYCJA : Podstawowe statystyki wsparcia dla
element.outerHTML
źródło
Nie ma potrzeby generowania dla niego funkcji. Po prostu zrób to w ten sposób:
(Nawiasem mówiąc, konsola przeglądarki pokaże, co jest zalogowane. Większość najnowszych przeglądarek od około 2009 roku ma tę funkcję.)
Magia jest na końcu:
Klon oznacza, że tak naprawdę nie przeszkadzasz DOM. Uruchom go bez niego, a zobaczysz
p
tagi wstawione przed / po wszystkich hiperłączach (w tym przykładzie), co jest niepożądane. Tak, użyj.clone()
.Działa w ten sposób, że pobiera każdy
a
znacznik, tworzy jego klon w pamięci RAM, otacza gop
znacznikami, pobiera jego element nadrzędny (czylip
znacznik), a następnie pobiera jegoinnerHTML
właściwość.EDYCJA : Wziąłem porady i zmieniłem
div
tagi nap
tagi, ponieważ mniej piszą i działają tak samo.źródło
Co z
prop('outerHTML')
:?I ustawić:
To zadziałało dla mnie.
PS : Zostało to dodane w jQuery 1.6 .
źródło
Rozszerz jQuery:
I użyj tego w ten sposób:
$("#myTableRow").outerHTML();
źródło
return $('<div>').append(this.clone()).html();
to tylko trochę więcej do rzeczy.Zgadzam się z Arpanem (13 grudnia 2010 r. 5:59).
Jego sposób robienia tego jest w rzeczywistości O wiele lepszym sposobem, ponieważ nie używasz klonowania. Metoda klonowania jest bardzo czasochłonna, jeśli masz elementy potomne, a nikomu innemu wydawało się, że IE NIE MA
outerHTML
atrybutu (tak, IE rzeczywiście ma NIEKTÓRE przydatne sztuczki).Ale prawdopodobnie stworzyłbym jego skrypt nieco inaczej:
źródło
clone()
itextarea
potrzebowałem rozwiązania nieklonowanego, i to było na miejscu.outerHTML
jeśli jest dostępne, ponieważ jest obsługiwany przez Chrome oprócz Internet Explorera.Aby być naprawdę jQuery-esque, możesz chcieć
outerHTML()
być pobierającym i ustawiającym, a jego zachowanie powinno byćhtml()
jak najbardziej podobne:To pozwala nam przekazać argument
outerHTML
, który może byćfunction (index, oldOuterHTML) { }
- gdzie zwracana wartość stanie się nowym HTML dla elementu (chyba żefalse
zostanie zwrócona).Aby uzyskać więcej informacji, zobacz dokumentację jQuery dla
html()
.źródło
Możesz także użyć get ( pobierz elementy DOM pasujące do obiektu jQuery.).
na przykład:
Jako metoda rozszerzenia:
Lub
Wielokrotny wybór i zwrot zewnętrznego HTML wszystkich dopasowanych elementów.
powrót:
źródło
Aby utworzyć PEŁNĄ wtyczkę jQuery jako
.outerHTML
, dodaj następujący skrypt do dowolnego pliku js i dołącz po jQuery do nagłówka:Umożliwi to nie tylko uzyskanie zewnętrznego HTML jednego elementu, ale nawet powrót tablicy wielu elementów jednocześnie! i mogą być używane jako oba standardowe style jQuery:
Dla wielu elementów
Przykłady fragmentów:
Pokaż fragment kodu
źródło
możesz to po prostu zrobić w ten sposób
gdzie id jest identyfikatorem szukanego elementu
źródło
$("#" + id).attr("id")
jest niesamowicie zbędny. Jeśli masz już identyfikator w zmiennej, dlaczego używasz selektora jquery, aby wyciągnąć element z domeny, a następnie pytasz o jego atrybut ID?Użyłem rozwiązania Jessiki (które było edytowane przez Josha), aby uzyskać outerHTML do pracy z Firefoksem. Problemem jest jednak to, że mój kod się zepsuł, ponieważ jej rozwiązanie owinęło element w DIV. Dodanie jeszcze jednej linii kodu rozwiązało ten problem.
Poniższy kod daje zewnętrzny HTML, pozostawiając drzewo DOM bez zmian.
I użyj tego w następujący sposób: $ ("# myDiv"). OuterHTML ();
Mam nadzieję, że ktoś uzna to za przydatne!
źródło
Fiddle tutaj: http://jsfiddle.net/ezmilhouse/Mv76a/
źródło
Jeśli scenariusz dynamicznie dodaje nowy wiersz, możesz użyć tego:
.myrow
jest nazwą klasy<tr>
. Tworzy kopię ostatniego wiersza i wstawia jako nowy ostatni wiersz. Działa to również w IE7 , podczas gdy[0].outerHTML
metoda nie pozwala na przypisania w ie7źródło
node.cloneNode () prawie nie wygląda na włamanie. Możesz sklonować węzeł i dołączyć go do dowolnego pożądanego elementu nadrzędnego, a także manipulować nim poprzez manipulowanie poszczególnymi właściwościami, zamiast konieczności np. Uruchamiania na nim wyrażeń regularnych lub dodawania go do DOM, a następnie manipulowania nim po słowie.
To powiedziawszy, możesz także iterować atrybuty elementu, aby utworzyć jego reprezentację ciągu HTML. Wydaje się prawdopodobne, że w ten sposób zaimplementowano by dowolną funkcję outerHTML, gdyby jQuery ją dodał.
źródło
Użyłem rozwiązania Volomike zaktualizowanego przez Jessicę. Właśnie dodałam sprawdzenie, czy element istnieje, i sprawił, że zwrócił pusty, na wypadek, gdyby nie istniał.
Oczywiście używaj go w następujący sposób:
źródło
Dobrą opcję .outerHTML () można znaleźć tutaj https://github.com/darlesson/jquery-outerhtml .
W przeciwieństwie do .html (), który zwraca tylko treść HTML elementu, ta wersja .outerHTML () zwraca wybrany element i jego zawartość HTML lub zastępuje go jako metodę .replaceWith (), ale z tą różnicą, że dziedziczenie zastępującego HTML może być dziedziczone przez łańcuchy.
Przykłady można również zobaczyć w powyższym adresie URL.
źródło
Zauważ, że rozwiązanie Josha działa tylko dla jednego elementu.
Prawdopodobnie „zewnętrzny” HTML ma sens tylko wtedy, gdy masz jeden element, ale są sytuacje, w których warto wziąć listę elementów HTML i zamienić je w znaczniki.
Rozszerzając rozwiązanie Josha, ten będzie obsługiwał wiele elementów:
Edycja: kolejny problem z rozwiązaniem Josha, patrz komentarz powyżej.
źródło
Inne rozwiązanie z dodanym
remove()
tymczasowym obiektem DOM.źródło
Zrobiłem ten prosty test, w którym outerHTML jest rozwiązaniem tokimon (bez klonu), a outerHTML2 jest rozwiązaniem jessica (klon)
i wynik w mojej przeglądarce Chrome (wersja 20.0.1132.57 (0)) był
outerHTML: 81ms
outerHTML2: 439ms
ale jeśli użyjemy rozwiązania tokimon bez natywnej funkcji outerHTML (która jest teraz obsługiwana prawdopodobnie w prawie każdej przeglądarce)
dostajemy
outerHTML: 594ms
outerHTML2: 332ms
w przykładach z prawdziwego świata będzie więcej pętli i elementów, więc idealna kombinacja byłaby
więc metoda klonowania jest w rzeczywistości szybsza niż metoda zawijania / rozpakowywania
(jquery 1.7.2)
źródło
Oto bardzo zoptymalizowana zewnętrzna wtyczka HTMLH dla jquery: ( http://jsperf.com/outerhtml-vs-jquery-clone-hack/5 => 2 inne fragmenty szybkiego kodu nie są kompatybilne z niektórymi przeglądarkami, takimi jak FF <11)
@Andy E => Nie zgadzam się z tobą. outerHMTL nie potrzebuje gettera ORAZ setera: jQuery już daje nam „replaceWith” ...
@mindplay => Dlaczego dołączasz do wszystkich outerHTML? jquery.html zwraca tylko treść HTML pierwszego elementu.
(Przepraszamy, nie mam wystarczającej reputacji, aby pisać komentarze)
źródło
Krótkie i słodkie.
lub wydarzenie bardziej słodkie za pomocą funkcji strzałek
lub w ogóle bez jQuery
lub jeśli nie podoba ci się to podejście, sprawdź to
źródło
To jest dość proste z waniliowym JavaScript ...
źródło
Jest to świetne do zmiany elementów w dom, ale NIE działa np. Przy przekazywaniu łańcucha html do jquery w następujący sposób:
Po pewnych manipulacjach stworzyłem funkcję, która pozwala na działanie powyższego, tj. Dla ciągów HTML:
źródło
$.html = el => $("<div>"+el+"</div>").html().trim();
źródło
Natknąłem się na to, szukając odpowiedzi na mój problem, który polegał na tym, że próbowałem usunąć wiersz tabeli, a następnie dodać go z powrotem na dole tabeli (ponieważ dynamicznie tworzyłem wiersze danych, ale chciałem wyświetlić komunikat „Dodaj nowy” Zapisz wiersz typu na dole).
Miałem ten sam problem, ponieważ zwracał on wewnętrzny plik HTML, więc brakowało znaczników TR, które zawierały identyfikator tego wiersza i uniemożliwiały powtórzenie procedury.
Znalazłem odpowiedź, że
remove()
funkcja jquery faktycznie zwraca element, który usuwa, jako obiekt. Tak więc usunięcie i ponowne dodanie wiersza było tak proste, jak to ...Jeśli nie usuwasz obiektu, ale chcesz go skopiować gdzie indziej, użyj
clone()
funkcji.źródło
Wtyczka jQuery jako skrót do bezpośredniego pobrania całego elementu HTML:
I użyj tego w ten sposób:
$(".element").outerHTML();
źródło
Gdzie „x” to numer węzła, zaczynając od 0 jako pierwszy, powinien uzyskać odpowiedni węzeł, jeśli chcesz uzyskać konkretny. Jeśli masz węzły potomne, naprawdę powinieneś umieszczać identyfikator na tym, który chcesz, aby go po prostu wyzerować. Korzystanie z tej metodologii i brak „x” działało dla mnie dobrze.
źródło
.html()
na danym elemencie. TO DZIAŁA i chciałbym wyjaśnić, dlaczego tak nie jest.Proste rozwiązanie.
źródło
Być może nie rozumiem poprawnie twojego pytania, ale otrzyma html elementu nadrzędnego wybranego elementu.
Czy o to ci chodzi?
źródło