Есть хороший способ сказать jQuery, чтобы не eval скрипты на запросы ajax, которые являются HTML - PullRequest
5 голосов
/ 18 июня 2011

Я использую jQuery для выполнения ajax-запроса, и все работает как положено. Но он оценивает сценарии не в том контексте.

У меня есть iframe (тот же домен, здесь нет проблем), и я пытаюсь заставить сценарии работать в контексте iframe вместо того, где был сделан запрос ajax - например. другой кадр.

Я подумал, что могу сказать ajax не оценивать сценарии, и я сам выполнил бы работу, чтобы оценить их в правильном контексте. Есть идеи или способы отключить автоматический eval?

Редактировать

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

$('#some_element').html('<span>content</span><script>alert(window)</script>');

Теперь, когда вы делаете это из другого фрейма, оценка происходит в контексте того, куда вы звоните, а не в элементе, в который вы вставляете контент.

Я закончил настройку содержимого без использования jQuery, а затем нашел / проверил любые теги скрипта:

element.get(0).innerHTML = data;
element.find('script').each(function() {
  otherWindow.eval(this.innerText);
});

Окончательное обновление

Я закончил тем, что отследил его до источника и переопределил оттуда ... ниже приведен coffeescript, но вы можете понять идею. Я решил переопределить его, потому что для моего использования это никогда не должно происходить в верхнем окне, но ожидается в содержимом iframe.

    $.globalEval = (data) -> (iframeWindow.execScript || (data) -> iframeWindow["eval"].call(iframeWindow, data))(data) if (data && /\S/.test(data))

1 Ответ

1 голос
/ 18 июня 2011

Этот вопрос показывает, как выполнить пользовательский eval сценариев:

jQuery: оценка сценария в ответе ajax

В следующем фрагменте кода ... ** этот код взят из ответа на другой вопрос ** только что получил его как фрагмент:

  $("body").append($(xml).find("html-to-insert").eq(0));
  eval($(xml).find("script").text());

eval сам привязан к окну, которое можно определить как контекст:

windowObject.eval - при вызове просто eval ('...') предполагается, что вы звоните так: window.eval('...')

Теперь вам нужно получить окно, соответствующее фреймуВы хотите выполнить eval в и сделать что-то вроде этого:

myIFrameWindow.eval('...')

Когда вы делаете это, оно выполняется в контексте этого окна.Это просто вопрос поиска окна, связанного с тем фреймом, который вам нужен.

Чтобы найти окно данного фрейма, взгляните на этот пост:

Получение окна IFRAME (и затем документа) Ссылки с помощью contentWindow

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