Будут ли загружаться теги скрипта при загрузке html-страницы через ajax?

Константа по определению статична.

29
задан pixeline 5 February 2010 в 13:44
поделиться

5 ответов

Когда вы вызываете метод jQuery.ajax () , вы можете указать свойство dataType , которое описывает, какие данные вы ожидают от сервера, и как его обработать после его получения.

По умолчанию jQuery пытается угадать dataType на основе MIME-типа ответа. Однако вы можете явно указать dataType из следующего:

  • html : возвращает HTML как обычный текст; включенные теги сценария оцениваются при вставке в DOM.

  • текст : обычная текстовая строка.

  • xml : возвращает XML-документ, который можно обработать с помощью jQuery.

  • скрипт : оценивает ответ как JavaScript и возвращает его как обычный текст. Отключает кеширование, если не используется опция «cache».

  • json : оценивает ответ как JSON и возвращает объект JavaScript.

  • jsonp : загружает блок JSON с использованием JSONP. Добавлю лишний "? Callback =?" в конец вашего URL-адреса, чтобы указать обратный вызов.

В качестве примера следующий вызов ajax вернет данные в виде простой текстовой строки без выполнения сценариев или манипулирования DOM:

$.ajax({
  url: 'ajax/test.html',
  dataType: 'text',
  success: function(data) {
    alert(data);
  }
});
39
ответ дан 28 November 2019 в 00:55
поделиться

Нет, они не будут интерпретированы.

HTML можно загрузить либо с помощью innerHTML, либо с помощью манипуляций с DOM. В обоих случаях, если HTML содержит теги , он будет интерпретирован.

2
ответ дан 28 November 2019 в 00:55
поделиться

Главное, что нужно сделать - отключить пользовательский интерфейс от набора данных. Я бы предложил, чтобы способ сделать это - поместить слой между ними.

Вам потребуется разработать структуру данных, приготовленных для отображения. Это, скорее всего, будет содержать копии некоторых ваших бэкэнд-данных, но «приготовленные», чтобы быть легко почерпнуть из. Ключевая идея здесь в том, что это быстро и легко рисовать из. Эта структура данных может даже содержать вычисленные позиции на экране битов данных, чтобы их можно было быстро извлечь.

При получении WM_PAINT сообщения необходимо получить последнюю полную версию этой структуры и извлечь ее из нее. Если вы делаете это правильно, вы должны иметь возможность обрабатывать несколько сообщений WM_PAINT в секунду, потому что код краски никогда не ссылается на ваши внутренние данные вообще. Он просто вращается в приготовленной структуре. Идея здесь в том, что лучше быстро рисовать устаревшие данные, чем повесить ваш пользовательский интерфейс.

Тем временем...

У вас должно быть 2 полных копии этой готовой для отображения структуры. Во-первых, на что смотрит WM_PAINT сообщение. (назовите его cfd _ A ) Другое - это то, что вы передаете функции CookDataForDisplay (). (назовите его cfd _ B ). Функция CookDataForDisplay () выполняется в отдельном потоке и работает над построением/обновлением cfd _ B в фоновом режиме. Эта функция может занимать столько времени, сколько требуется, поскольку она не взаимодействует с дисплеем ни в одном пути. После возврата вызова cfd _ B будет самой последней версией структуры.

Теперь поменяйте местами cfd _ A и cfd _ B и InvalidateRect в окне приложения.

Упрощенный способ сделать это состоит в том, чтобы ваша приготовленная для дисплея структура была битовой, и это может быть хорошим способом пойти, чтобы получить мяч качения, но я уверен, что с немного мысли вы можете сделать гораздо лучше работу с более сложной структурой.

Итак, возвращаясь к вашему примеру.

  • В методе покраски вызывается метод GetData, часто сотни раз для сотен битов данных в одной операции покраски

Это теперь 2 потоков, метод покраски ссылается на cfd_A и выполняется в потоке пользовательского интерфейса. Тем временем cfd_B строится фоновым потоком с помощью вызовов GetData.

Быстрый и грязный способ сделать это -

  1. Возьмите текущий код WM_PAINT, поместите его в функцию PaintIntoBitmap ().
  2. Создайте битовую карту и контроллер домена памяти, это cfd_B.
  3. Создайте поток и передайте его cfd_B и вызовите PaintIntoBitmap ()
  4. После завершения этого потока поменяйте местами cfd_B и cfd_A

Now новый метод WM_PAINT просто берет предварительно визуализированное растровое изображение в cfd_A и выводит его на экран. Теперь пользовательский интерфейс отключен от бэкэнд-функции GetData ().

Теперь начинается настоящая работа, потому что быстрый и грязный способ не очень хорошо справляется с изменением размеров окна.Вы можете пойти оттуда, чтобы уточнить, что ваши cfd_A и cfd_B структуры немного за раз, пока вы не достигнете точки, где вы удовлетворены результатом.

-121--2072760-

Перед вами стоит большая задача. Перед мной была похожая задача - 15-летняя монолитная однопоточная кодовая база, не использующая преимущества многоядерности и т. Д. Мы приложили много усилий, пытаясь найти такой дизайн и решение, которые были бы работоспособны и работали бы.

Сначала плохие новости. Это будет где-то между непрактичным и невозможным сделать ваше однопотоковое приложение многопоточным. Одно многопоточное приложение полагается на то, что однонаправленное - это как тонкие, так и грубые способы. Одним из примеров является случай, когда вычислительная часть требует ввода от части GUI. Графический интерфейс пользователя должен работать в основном потоке. Если вы попытаетесь получить эти данные непосредственно из вычислительного механизма, вы, скорее всего, будете работать в условиях взаимоблокировки и гонки, которые потребуют крупных изменений для исправления. Многие из этих зависимостей не будут накапливаться на этапе проектирования или даже на этапе разработки, но только после того, как сборка выпуска окажется в суровой среде.

Больше плохих новостей. Программирование многопоточных приложений исключительно сложно. Это может показаться довольно простым, чтобы просто заблокировать вещи и сделать то, что вы должны сделать, но это не. Во-первых, если вы блокируете все на виду, вы в конечном итоге сериализируете свое приложение, сводя на нет все преимущества mutithreading в первую очередь, все еще добавляя во всей сложности. Даже если вы выйдете за рамки этого, написать бездефектное приложение MP достаточно сложно, но написать высокоэффективное приложение MP гораздо сложнее. Вы могли бы учиться на работе в своего рода крещении огнем. Но если вы делаете это с производственным кодом, особенно устаревшим производственным кодом, вы подвергаете риску свой бизнес.

Теперь хорошие новости. У вас есть варианты, которые не включают рефакторинг всего приложения и предоставят вам большую часть того, что вы ищете. Один вариант, в частности, легко реализовать (в относительном выражении) и гораздо менее подвержен дефектам, чем сделать ваше приложение полностью MP.

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

Это может показаться взломом. И, возможно, так и есть. Но это даст вам то, что вам нужно, не подвергая стабильность и производительность вашей системы такому большому риску. Плюс есть скрытые выгоды. Во-первых, невидимые копии вашего приложения будут иметь доступ к собственным пространствам виртуальной памяти, что облегчит использование всех ресурсов системы. Он также хорошо чешется. Если вы работаете на 2-ядерном ящике, вы можете отключить 2 копии вашего движка. 32 ядра? 32 экземпляра.Ты понимаешь идею.

-121--2072762-

при загрузке HTML-документа с помощью AJAX, что он делает с узлами внутри тэга HEAD: (сценарий, ссылка, стиль, мета, заголовок)

Это зависит от способа загрузки. ajax () (как и в случае запроса XMLHtterRequest, на котором он основан) сам просто выдает строку. Как вы попадаете в документ?

Если вы пишете этот ряд в iniveHTML элемента, скрипты внутри него не будут выполняться. Это нигде не стандартизировано, но все популярные в настоящее время браузеры ведут себя таким путем.

Однако если затем вставить этот элемент в документ (независимо от того, был ли он уже внутри документа или нет), он будет выполнен во многих браузерах при первом выполнении. В IE сценарий будет выполняться при непосредственной вставке элемента сценария в любой элемент , будь то в документе или нет.

Это все очень непоследовательно и неудобно, поэтому следует избегать загрузки элементов AJAX < script > в документе. Обычно в любом случае нет веских причин; лучше сохранить статический код сценария и использовать JSON (или eval только при крайней необходимости) для передачи им данных сценария. Функция

jQuery load пытается компенсировать различия браузера при загрузке содержимого AJAX в документ. Не удается уловить все обстоятельства, связанные с < скрипт > (есть некоторые действительно странные). На это вообще не стоит полагаться. Можно избежать взятия ответа HTML-страницы, но затем загрузить только определенные элементы без < скрипта > , потому что это делает только шаг writing-to-iniveHTML. Но опять же, ты не хочешь полагаться на это. Гораздо лучше, чтобы сервер вернул фрагмент HTML или JSON ваши сценарии могут использовать напрямую.

Что касается таблиц стилей и ссылок на таблицы стилей, вставка их в тело, как правило, работает, хотя по терминам HTML это, вероятно, не должно. meta и title ничего не сделают, им слишком поздно давать эффект. Просто проанализировать их с помощью iniveHTML ничего не сделает, но все же, избегайте его, если можете.

31
ответ дан 28 November 2019 в 00:55
поделиться

Когда вы говорите "загрузить", я понимаю, что просто означает вызов XHR (или $ .ajax, $ .get и т. д.), чтобы получить XML, JSON или текстовый ресурс с веб-сервера, сохранить его в памяти времени выполнения JS браузера и получить ссылку на него. Для ресурсов HTML это действие само по себе ничего не анализирует.

Однако, если вы возьмете этот HTML и вставите его в DOM (по крайней мере, в Firefox 3.5), то он будет интерпретирован. Например, предположим, что у вас есть следующие три очень профессиональных файла.

barf1.html:

<html>
    <head>
        <script src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js" type="text/javascript"></script>
        <script type="text/javascript">
            $(init);

            function init() {
                $.get('barf2.html', inject);
            }

            function inject(data) {
                debugger;
                $('body').html(data);
                //document.write(data);
            }
        </script>
    </head>
    <body>
        long live barf1!
    </body>
</html>

barf2.html:

<div>
    <script type="text/javascript">
        alert('barf2!');
    </script>
    <script type="text/javascript" src="barf3.js"></script>
    barf2 lives here now!
</div>

barf3.js:

alert('barf3!');

Когда вы переходите к barf1.html, содержимое страницы изменится, и вы увидите два предупреждения JavaScript, указывающие, что интерпретируются как встроенные блоки сценария, так и внешние файлы сценария.

8
ответ дан 28 November 2019 в 00:55
поделиться

Как было указано, в целом - нет, теги скрипта не будут интерпретироваться.

Я совершенно не уверен, что будет с другими тегами.

Я предполагаю, что вы загружаете всю страницу в AJAX - я не уверен, зачем вам это нужно? Может быть, вы могли бы дать нам немного больше информации, и мы могли бы внести некоторые предложения?

Чтобы ответить на ваш вопрос более прямо - в общем, любые скрипты, требуемые для перезагружаемого контента, следует перезагружать не вместе с контентом, а со страницей. Таким образом, вы можете организовать обратный вызов от обработчиков событий AJAX для повторного подключения и т. Д.

1
ответ дан 28 November 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: