Обновление браузера в AJAX с тегами сценария в ответе - PullRequest
3 голосов
/ 04 июня 2009

У меня проблемы с вызовом jQuery AJAX. Мой код работает нормально, когда я запрашиваю страницу без JavaScript, но когда в моем коде есть теги сценария, все начинает становиться странным.

Кажется, что любые теги скрипта, ссылающиеся на внешние URL, вызывают перенаправление браузера. В Firefox страница становится пустой. В Safari страница очищается и загружается с содержимым ответа AJAX. В обоих браузерах URL не меняется.

Чтобы быть конкретным в моей проблеме; У меня есть вкладка, в которую я пытаюсь встроить виджет Walkscore. Поскольку он довольно тяжелый для клиентской части, я хочу загрузить его только после того, как пользователь нажмет на вкладку, в которой он находится. Страница AJAX walkscore выглядит следующим образом:

<script type="text/javascript">
  var ws_address = "1 Market St, San Francisco";
  var ws_width = "500";
</script>
<script type="text/javascript" src="http://www.walkscore.com/tile/show-tile.php?wsid=MY_WSID">
</script>

Существуют ли какие-либо ограничения на теги сценариев, ссылающиеся на внешние сайты в вызовах AJAX? Есть ли хороший способ обойти это?

- Правка -

Хорошо, я немного поиграл с этим и немного сузил проблему. Позвольте мне попытаться дать лучшее объяснение в то же время:

У меня есть два файла, index.html и walkscore.html

index.html

function widget() {
  var widget = $('#walkscore');
  $.get('/walkscore.html', function(data) {
    $('#loading').slideUp(function() {
      widget.html(data);
      loaded[name] = true;
      widget.slideDown();
    });
  });
}

walkscore.html - как показано в верхнем блоке кода

В index.html у меня есть ссылка, которая вызывает функцию виджета. Всякий раз, когда я нажимаю эту ссылку, вся страница заменяется выводом файла js. Это происходит независимо от домена, из которого файл js. Кажется, это происходит только с файлами js, в которых есть document.write. Он работает точно так же, когда я использую функцию $ .getScript, даже если он находится в index.html

- Правка -

Кажется, это все связано с document.write. Я сделал копию java-скрипта walkscore и заменил все вхождения document.write на jquery.html, и, похоже, он работает правильно. Я (очевидно) JS Noob. Это ожидаемое поведение document.write? Почему это не происходит, когда я включаю скрипт в загрузку страницы?

Ответы [ 6 ]

1 голос
/ 08 декабря 2009

Замена document.write - путь. Это бесстыдное самореклама, но если у вас нетривиальный случай, writeCapture.js обрабатывает все крайние случаи.

1 голос
/ 23 сентября 2009

Это происходит из-за вызова document.write. Вот некоторая информация о том, что происходит:

Запись после загрузки страницы

Если document.write () вызывается после завершения загрузки страницы, все статическое (не сгенерированное сценарием) содержимое страницы будет заменено параметром метода write. Этот сценарий чаще всего воспроизводится, когда метод write вызывается из обработчика событий - независимо от того, находится ли метод в функции, вызываемой обработчиком событий, или один внутри обработчика - потому что обработчики событий запускаются после завершения загрузки страницы. Это важно знать, потому что статическая замена контента не всегда является желаемым результатом. Другой распространенный сценарий перезаписи контента связан с записью контента в новом окне. В этом случае цель заключается в перезаписи пустой страницы. ( источник )

Решение, с которым я пошел, состояло в том, чтобы исключить команды document.write и заменить вместо него содержимое div. Если вы загружаете внешний скрипт и не можете его контролировать, вы можете заменить функцию document.write своей. Это обсуждается здесь:

http://www.webxpertz.net/forums/showthread.php?threadid=11658

Надеюсь, это поможет кому-то там!

1 голос
/ 26 августа 2009

Это связано с document.write в ответе. Мне удалось это исправить в Firefox, выполнив это:

<script type="text/javascript">

  // save default document.write function so we can set it back
  var write_func_holder = document.write;

  // redefine document.write to output text target div
  document.write = function(text) {
    $('#ad_container').html($('#ad_container').html() + text);
  }
</script>

<script language="JavaScript" type="text/javascript" src="javascriptfile">
</script>

<script type="text/javascript">
  // reset document.write function
 document.write = write_func_holder;
</script>

У меня все еще возникает проблема в Safari, когда браузер обновляется до пустой страницы с содержимым только document.write и IE6, IE7 вообще ничего не делает. Firefox работает, хотя.

Надеюсь, это поможет кому-то выяснить, что не так, и они, в свою очередь, смогут исправить проблемы IE6 / 7 и Safari

1 голос
/ 04 июня 2009

Загружать скрипт отдельно от html контента, вы можете использовать $ .getScript ().

0 голосов
/ 30 марта 2010

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

В любом случае, вот моя история, если кто-то ищет что-то связанное.

У меня есть страница с поддержкой jquery, которая загружает некоторый контент в div с помощью $ .ajax (), все работает отлично. Что мне нужно было сделать, так это включить одну из тех кнопок твиттера в Твиттере, которая показывает счетчик и позволяет твитнуть о содержимом страницы. Для этого на страницу должен быть включен простой фрагмент javascript из них.

<script type="text/javascript" src="http://www.retweet.com/static/retweets.js"></script>

Таким образом, в теории этот тег script должен быть возвращен в вызове ajax, а jquery должен выполнить его и включить в него результат, как я указал тип данных как html в вызове $ .ajax ().

Внешний скрипт при ближайшем рассмотрении делает:

if(!url)
{
 var url=window.location.href;
}
if(!size)
var size="big";
var height="75";
var width="54"
if(size=="small")
{
  height="22";
  width="120";
}
if(!username)  
  var username="none";
url=url.replace("?", "*");
var src="http://www.retweet.com/widget/button/"+size+"/"+username+"/"+url;
document.write('<iframe src="'+src+'" height="'+height+'" width="'+width+'" frameborder="0" scrolling="no"></iframe>');

Который явно взрывает документ.write.

Сегодня вечером я попробую методы в этом посте и посмотрю, работают ли они, спасибо за информацию.

0 голосов
/ 04 июня 2009

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

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