Создание объекта jQuery из большой HTML-строки


143

У меня есть большая HTML-строка, содержащая несколько дочерних узлов.

Можно ли построить объект JQuery DOM, используя эту строку?

Я пробовал, $(string)но он возвращает только массив, содержащий все отдельные узлы.

Я пытаюсь получить элемент, для которого я могу использовать функцию .find ().


Где находится HTML, что вы хотите с его помощью построить? Вы можете посмотреть на функцию .find (): api.jquery.com/find
Control Freak

3
Объект jQuery - это объект, подобный массиву, содержащий все узлы. Можете ли вы подробнее рассказать о том, чего пытаетесь достичь?
Frédéric Hamidi

Где «эта строка»? какая строка?
Viezevingertjes

Взгляните сюда, я думаю, это то, что вам нужно stackoverflow.com/q/759887/474535
bart s

Мне нужно передать элемент из одного WebView в другой через строку, строка будет просто источником HTML этого элемента. Думаю, я неправильно понял, что такое объект jQuery.
user1033619

Ответы:


204

Обновить:

Начиная с jQuery 1.8, мы можем использовать $ .parseHTML , который будет анализировать строку HTML на массив узлов DOM. например:

var dom_nodes = $($.parseHTML('<div><input type="text" value="val" /></div>'));

alert( dom_nodes.find('input').val() );

ДЕМО


var string = '<div><input type="text" value="val" /></div>';

$('<div/>').html(string).contents();

ДЕМО

Что происходит в этом коде:

  • $('<div/>')это подделка <div>, которой нет в DOM
  • $('<div/>').html(string)добавляется stringв эту подделку <div>как дети
  • .contents()извлекает дочерние элементы этой подделки <div>как объект jQuery

Если вы хотите .find()поработать, попробуйте следующее:

var string = '<div><input type="text" value="val" /></div>',
    object = $('<div/>').html(string).contents();

alert( object.find('input').val() );

ДЕМО


1
@ user1033619, вы также можете выполнить .find()операцию, посмотрите демо
thecodeparadox

Но как еслиstring = '<input type="text" value="val" />'
fdrv

1
Если можно $("<div/>"), то почему нельзя $(string)?
xr280xr

2
В более сложном HTML мне нужно было удалить .contents, чтобы это работало. jsfiddle.net/h45y2L7v
Саймон Хатчисон,

Вы не хотите делать $ (string), потому что вам нужен оборачивающий div для получения содержимого. Вы получите содержимое div, которое будет вашим вводом.
Майкл Халили

121

Начиная с jQuery 1.8 вы можете просто использовать parseHtml для создания объекта jQuery:

var myString = "<div>Some stuff<div>Some more stuff<span id='theAnswer'>The stuff I am looking for</span></div></div>";
var $jQueryObject = $($.parseHTML(myString));

Я создал JSFidle, демонстрирующий это: http://jsfiddle.net/MCSyr/2/

Он анализирует произвольную строку HTML в объект jQuery и использует find для отображения результата в div.


10
Я считаю, что этот ответ намного лучше, так как здесь не нужно использовать призрачный элемент div. $ .parseHtml ftw.
ZeeCoder

2
Этот ответ не сработал для меня, когда я тогда хотел $ jQueryObject.find (), я полагаю, потому что он не был добавлен в дом в тот момент.
dougajmcdonald

@dougajmcdonald - find должен работать без добавления контента в дом. Если вы посмотрите на мою скрипку ( jsfiddle.net/MCSyr/2 ), я вызываю find для объекта jQuery, и он возвращает ожидаемый результат: $ jQueryObject.find ("# theAnswer"). Html ()
kiprainey

1
@kiprainey интересно, я откопаю пример, на котором он не для меня, и посмотрю, есть ли что-то еще. Он был написан внутри модуля TypeScript внутри загрузки другой логики, вполне могла быть другая проблема! Мои извенения.
dougajmcdonald

8
Стоит упомянуть, что parseHTML был добавлен в jQuery 1.8
Жан-Мишель Гарсиа

12
var jQueryObject = $('<div></div>').html( string ).children();

Это создает фиктивный объект jQuery, в который вы можете поместить строку как HTML. Тогда вы получите только детей.


2
ive пробовал это, но он не работает с функцией .find (), которую мне придется использовать позже.
user1033619

3
@ user1033619 вы должны использовать .filter()вместо .find().
Кульбир Сайни

2

Также есть отличная библиотека под названием cheerio, разработанная специально для этого.

Быстрая, гибкая и экономичная реализация основного jQuery, разработанного специально для сервера.

var cheerio = require('cheerio'),
    $ = cheerio.load('<h2 class="title">Hello world</h2>');

$('h2.title').text('Hello there!');
$('h2').addClass('welcome');

$.html();
//=> <h2 class="title welcome">Hello there!</h2>

1

Я использую следующие шаблоны HTML:

$(".main").empty();

var _template = '<p id="myelement">Your HTML Code</p>';
var template = $.parseHTML(_template);
var final = $(template).find("#myelement");

$(".main").append(final.html());

Примечание: если вы используете jQuery


1

причина, по которой $ (string) не работает, заключается в том, что jquery не находит html-контент между $ (). Поэтому вам нужно сначала разобрать его на html. если у вас есть переменная, в которой вы проанализировали html. затем вы можете использовать $ (string) и использовать все функции, доступные для объекта


0

Вы можете попробовать что-то вроде ниже

$($.parseHTML(<<table html string variable here>>)).find("td:contains('<<some text to find>>')").first().prev().text();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.