Подтвердить что ты не робот

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="#" onclick="location.href='http://code.jquery.com/mobile/1.1.0-rc.1/jquery.mobile-1.1.0-rc.1.min.css'; return false;"
    />
    <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="#" onclick="location.href='http://code.jquery.com/mobile/1.1.0-rc.1/jquery.mobile-1.1.0-rc.1.min.css'; return false;"
    />
    <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>

4b9b3361

Ответ 1

Я исправляю свой неправильный комментарий. Да, вы можете сделать что-то вроде этого, но, прочитав документацию jQuery, сказано, что код вставлен в DOM http://api.jquery.com/jQuery/#jQuery2. Таким образом, даже код ниже, кажется, не вставляет ничего в 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/

Edit:

Чтобы вставить код из внешнего файла, вы можете использовать функцию загрузки. Здесь вы можете увидеть пример: http://jsfiddle.net/davidbuzatto/zuFsc/ Обратите внимание, что в этом примере я использовал эхо-сервис os jsFiddle для эмуляции внешнего файла. Посмотрите здесь Как вы выводите файл вида как ответ ajax в Java? и здесь <а4 >

Ответ 2

Вы можете использовать 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 будет искать этот контекст, а не основной документ.