Попытка выбрать теги сценария из jQuery AJAX получить ответ - PullRequest
16 голосов
/ 13 декабря 2010

Я на странице A. Ссылка нажата, и я загружаю в DOM через jQuery get со страницы B. Внутри DOM страницы B есть несколько динамически генерируемых тегов сценария с классом "dataScript" вместе с куча других тегов скриптов, с которыми я не хочу иметь ничего общего.

Единственное, что мне нужно от этого DOM - это теги .dataScript, которые я затем хочу вставить в div с идентификатором «scriptOutput» в DOM страницы A. Это не будет работать, если элемент с Класс «dataScript» является тегом скрипта. Только если это какой-то другой тег, такой как тег "div". Вот пример того, что я пытаюсь сделать:

Страница A:

<html>
<head>
<title>Page A</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
<script type="text/javascript">
jQuery(function() {
 $("#ajaxJsLink").click(function() {
  $.get("pageB.html", function(data) {
   var scriptElements = $(data).find(".dataScript").contents();
   console.log(scriptElements);
   $(scriptElements).each(function(index) {
    $("#scriptOutput").append($(this).html());
   });
  });
  return false;
 });
 $("#ajaxDivsLink").click(function() {
  $.get("pageB.html", function(data) {
   var scriptElements = $(data).find(".dataDiv").contents();
   console.log(scriptElements);
   $(scriptElements).each(function(index) {
    $("#divOutput").append($(this).html());
   });
  });
  return false;
 });
});
</script>
</head>
<body>
<p>This is page A.</p>
<hr />
<p>
<a href="pageB.html" id="ajaxJsLink">Get JavaScript from Page B.</a><br />
<a href="pageB.html" id="ajaxDivsLink">Get Divs from Page B.</a>
</p>
<hr />
<div id="scriptOutput">
 <h2>Script Output</h2>
</div>
<div id="divOutput">
 <h2>Div Output</h2>
</div>
</body>
</html>

Страница B:

<html>
<head>
<title>Page B</title>
</head>
<body>
<p>This is page B.</p>
<div id="scripts">
 <script type="text/javascript" class="dataScript">
  function someFunction() {
   alert("I am");
  }
 </script>
 <script type="text/javascript" class="dataScript">
  function anotherFunction() {
   alert("Javascript");
  }
 </script>
</div>
<div id="divs">
 <div class="dataDiv">
  <div>
   function someFunction() {
    alert("I am");
   }
  </div>
 </div>
 <div class="dataDiv">
  <div>
   function anotherFunction() {
    alert("Html");
   }
  </div>
 </div>
</div>
</body>
</html>

Я пытался добавить .contents (), .html () и .text () для содержимого .dataScript, но, похоже, ничего не работает. Спасибо за ваше внимание к просмотру / ответу на мои вопросы. Я ценю вашу помощь!


UPDATE

На случай, если кто-то еще попытается сделать это, вот менее изящное, но полностью функциональное решение, которое я выбрал:

Вывод javascript в виде обычного текста (без тегов сценария) внутри одного элемента div (с идентификатором и установленным для отображения: нет) на странице B. Затем на странице A выполните следующее внутри функции обратного вызова запроса get:

var docHead = document.getElementsByTagName("head")[0]; //head of Page A
var newScript = document.createElement("script");
newScript.setAttribute("type","text/javascript");
newScript.innerHTML = jQuery(data).find("#divWithPlainTextJs").text(); //insert plain text JS into script element
docHead.appendChild(newScript); //append script element to head of Page A
jQuery("#divWithPlainTextJs").remove(); //remove the plain text div and JS from the DOM

Спасибо Эммету за напоминание о методе document.createElement.

Ответы [ 3 ]

11 голосов
/ 13 декабря 2010

jQuery фактически не добавляет <script> элементов в DOM.Вместо этого он просто искажает содержимое скрипта.Так как его нет в DOM, $(data).find(".dataScript") ничего не соответствует.

Если вам действительно нужно содержимое тега <script>, вы можете попробовать использовать регулярное выражение для анализа ответа ajax.

Ознакомьтесь с Комментарий Карла Сведберга для получения дополнительной информации:

Все методы вставки jQuery используют функцию domManip для очистки и обработки элементов до и после их обработки.вставлен в DOM.Одна из функций, которую выполняет функция domManip, - это извлекать любые элементы сценария, которые собираются вставить, и запускать их через «подпрограмму evalScript», а не вставлять их с остальной частью фрагмента DOM.Он вставляет сценарии отдельно, оценивает их, а затем удаляет их из DOM.

Я считаю, что одной из причин, по которой jQuery делает это, является предотвращение ошибок "Permission Denied", которые могут возникнуть в Internet Explorer при вставке сценариевпри определенных обстоятельствах.Это также позволяет избежать повторной вставки / оценки одного и того же сценария (который потенциально может вызвать проблемы), если он находится внутри содержащего элемента, который вставляется, а затем перемещается по DOM.

3 голосов
/ 05 декабря 2016

Основными проблемами являются ... ожидание того, что элементы <script> будут потомками <div id='scripts'>, и использование .find() вместо .filter().

при использовании jQuery $.get() и $.ajax(), возвращаемое data является текстовой строкой.Когда вы помещаете data в оболочку jQuery, $data = $(data), она преобразуется в массив: [p, div#scripts, div#divs, div#dataDiv, <script.dataScript>, <script.dataScript>].Вы заметили, что элементы <script> уже не являются потомками <div id='scripts'>, а находятся в корне?jQuery сделал это специально.

$dataScripts = $data.filter('script.dataScripts') даст нам коллекцию, которую мы теперь можем перебрать, вот так:

$dataScripts.each(function(i) {
    $('#scriptOutput').append($(this));
});

Это оценит сценарии в $dataScripts, не вставляйте их в DOM, как указано @ Emmett .

0 голосов
/ 13 декабря 2010

Если вы загрузите результат AJAX следующим образом:

function (data) {
 // the result is loaded in the variable 'data'
}

, а затем поместите его в div следующим образом:

function (data) {
 $("#someDiv").text(data);
}

Вся страница, включая HTML-теги, будет размещена кактекст, чтобы вы могли видеть теги.Вы можете обрезать страницу, чтобы получить только те скрипты, которые вам нужны, но спросите себя: это разумно?

Дело в том ... если вы просто сохраните скрипт как внешний файл .js, вы сможетезагрузить его в формате ajax как текст:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...