jQuery: выбор и манипулирование html-элементами вне DOM
Насколько я могу судить, с помощью селекторов можно манипулировать только объектами, которые были загружены в DOM. Это проиллюстрировано в приведенном ниже примере, когда кнопка нажата, ее обработчик щелчка безуспешно пытается выбрать элемент на странице для загрузки и изменить его HTML раньше. Я предполагаю, что, поскольку обработчик щелчков срабатывает до того, как страница ссылок загружается в DOM, селектор не влияет на элемент.
Мой вопрос заключается в том, есть ли способ создать внешний фрагмент html и манипулировать им, прежде чем вставлять его в DOM.
script_1.js:
$(document).ready(function () {
$("#testButton").click(function () {
$("#externalPageDiv").html("hello world");
});
});
HTML-код внешней страницы:
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0-rc.1/jquery.mobile-1.1.0-rc.1.min.css"
/>
<script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script src="http://code.jquery.com/mobile/1.1.0-rc.1/jquery.mobile-1.1.0-rc.1.min.js"></script>
<script src="script_1.js"></script>
</head>
<body>
<div data-role="page" id="externalPage" data-add-back-btn="true">
<div data-role="content" id="externalPageContent">
<div id="externalPageDiv"></div>external page</div>
</div>
</body>
Главная страница Html:
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0-rc.1/jquery.mobile-1.1.0-rc.1.min.css"
/>
<script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script src="http://code.jquery.com/mobile/1.1.0-rc.1/jquery.mobile-1.1.0-rc.1.min.js"></script>
<script src="script_1.js"></script>
</head>
<body>
<div data-role="page" id="internalPage_1" data-add-back-btn="true">
<div data-role="content" id="internalPageContent_1">
<a href="externalPage.html" id="testButton" data-role="button" rel="external">Page Change</a>
</div>
</div>
<div data-role="page" id="mainPage" data-add-back-btn="true">
<div data-role="content" id="mainPageContent">Main Page</div>
</div>
</body>
3 ответа
Я исправляю свой неправильный комментарий. Да, вы можете сделать что-то вроде этого, но, читая документацию jQuery, говорят, что код вставлен в DOM http://api.jquery.com/jQuery/. Таким образом, даже приведенный ниже код, похоже, ничего не вставляет в DOM, он действительно вставлен.
Попробуй это:
var codeToProcess = "<div>" +
" <div id='myDiv1'>a</div>" +
" <div id='myDiv2'>b</div>" +
" <div id='myDiv3'>c</div>" +
"</div>";
var $toProcess = $( codeToProcess );
$toProcess.find( "div" ).addClass( "processed" );
// getting by id before insertion
alert( $toProcess.find( "#myDiv1" ).html() );
alert( $( "#myDiv1" ).html() ); // this will return null, since the divs
// were not yet added to the document
$toProcess.appendTo( "#container" );
// or $( "#container" ).html( $toProcess );
// getting by id after insertion
alert( $( "#myDiv2" ).html() );
jsFiddle: http://jsfiddle.net/davidbuzatto/me7T3/
Редактировать:
Чтобы вставить код из внешнего файла, вы можете использовать функцию загрузки. Вы можете увидеть пример здесь: http://jsfiddle.net/davidbuzatto/zuFsc/ Обратите внимание, что в этом примере я использовал службу echo os jsFiddle для эмуляции внешнего файла. Посмотрите здесь Как вы выводите файл представления как ответ ajax в Java? и здесь http://api.jquery.com/load/
Вы можете использовать javascript для ручного создания элементов DOM, которые не вставляются в иерархию DOM, и вы можете манипулировать ими столько, сколько хотите, прежде чем вставлять их в DOM.
Но, если вы пытаетесь манипулировать элементами DOM, созданными HTML вашей страницы до того, как HTML этой страницы был проанализирован, вы не сможете этого сделать. Элементы DOM в этот момент не существуют, поэтому манипулировать ими нечего, если вы не создали их вручную, как описано в первом абзаце.
Некоторые операции работают только с элементами DOM, вставленными в иерархию DOM, такими как document.getElementById()
, но другие методы могут использоваться в DOM, который не входит в основную иерархию, например item.getElementsByClassName()
где item
является элементом DOM, не входящим в иерархию DOM.
В jQuery контекстом по умолчанию является документ, поэтому такая простая операция выбора, как $(".foo")
будет искать только элементы DOM в иерархии документов DOM. Но, если вы передаете определенный контекст, $(".foo", item)
затем селектор jQuery будет искать этот контекст, а не основной документ.
Есть несколько способов сделать это.
Некоторые из них также можно использовать вместе.
Используяtemplate
ярлык
(подробнее) Это может существовать в вашем HTML-коде, но не отображается.
С использованиемdocument.createElement('tagtype');
(подробнее) Опционально вместе с фрагментом документа . Затем добавьте к родителю через.append(newEl)
или.prepend(newEl)
или другой. Конечно, их можно добавлять друг к другу, и если у вас есть что добавить, вы можете использоватьinnerHTML
с этими тоже.
Использование теневого DOM
Обратите внимание, что это всего лишь обзор, у некоторых есть свои маленькие причуды и все такое.