Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№120-04-2012 17:34:54

ptolemey
Участник
 
Группа: Members
Зарегистрирован: 18-04-2012
Сообщений: 2
UA: Chrome 17.0

После ajax запроса не работает javascript в firefox 4 - 11

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

Есть веб приложение которое работает так:
При первом обращении грузится страница которая разделена на части/области: меню, верхняя, нижняя, средняя и область для виджетов.
Все остальные переходы по сайту происходят посредством вызова ajax и перерисовки той или иной области на интерфейсе.

Все это делалось во времена когда были firefox 3,6, IE6, JQuery 1.2.6.

Все работало отлично пока не появилась новая версия firefox (начиная с 4 и заканчивая 11 версией).
Самое удивительное что в ИЕ9 все как работало так и работает.
А вот с последним фф, а именно 11-й версией, ничего не работает.

Суть проблемы. При нажатии на одит из элементов меню, происходит ajax запрос, в ответ получаем html и javascript.
Этот ответ посредством реплейса div'а мы вставляем на страницу (В моем слуучае это в центральную область экрана).
В этом ответе как я уже упоминал есть html и javascript, так вот в javascript'е описаны функции, которые делают чтото с контентом на странице.
Есть еще так же функция инициализации (которая задает какието начальные значения). Также сам html код имеет элементы на которые навешан javascript (всякие там он клики и тд.).

Так вот в фф 3,6 все это нормально отрабатывало. В фф 11 javascript уже не отрабатывает/не выполняется.
Смотрел в firebug, при ajax запросе мне возвращается одинаковый ответ, что в фф3,6 что в фф11, в html тоже нету никаких отличий между фф3,6 и фф11.
Что такое изменилось в фф11, что загруженный с помощью аякса и вставленый на страницу в определенный див джава скрипт перестал выполняться? И подскажите как такое можно исправить/обойти.

Код страници ответа (простой пример):

Выделить код

Код:

<script type="text/javascript" language="javascript">
  function init() {
    $("#createContractPassportSerial").setValue("12");
  }
</script>

<input type="hidden" name="workContract.foreignTemporary" value="false">
<input type="text" changeable="false" onfocus="globalInputOnFocusHandler(this);" enter="" maxlength="2" class="input" style="width: 246px;" name="contract.passportSeries" value="" autocomplete="off" id="input_createContractPassportSerial" tabindex="3">

<script type="text/javascript" language="javascript">
 init();
</script>

Заранее благодарен.

Отредактировано ptolemey (20-04-2012 19:04:51)

Отсутствует

 

№220-04-2012 19:22:21

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 11.0

Re: После ajax запроса не работает javascript в firefox 4 - 11

Так сами по себе скрипты после .innerHTML = "полученный HTML со скриптами" никогда не выполнялись.
Разве что с атрибутом defer, вроде, должны.

http://api.jquery.com/jQuery.ajax/

"html": Returns HTML as plain text; included script tags are evaluated when inserted in the DOM.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№321-04-2012 01:02:14

banbot
Moderator
 
Группа: Moderators
Зарегистрирован: 23-12-2007
Сообщений: 5253

Re: После ajax запроса не работает javascript в firefox 4 - 11

Тема перенесена из форума «Firefox» в форум «Разработка».


Do you feel lucky, punk?

Отсутствует

 

№423-04-2012 17:50:46

ptolemey
Участник
 
Группа: Members
Зарегистрирован: 18-04-2012
Сообщений: 2
UA: Firefox 3.6

Re: После ajax запроса не работает javascript в firefox 4 - 11

Уточню, при получении ответа, производились вот такие манипуляции:

вызывался метод replaceHtml  в котором происходила замена самого контента и вызов eval
параметры  метода replaceHtml
  el - id дива в который вставляется контент
  html - то что приходит после аякс запроса, тоесть html и javascript

Выделить код

Код:

function replaceHtml(el, html, flag, context) {
  var oldEl = (typeof el === "string" ? document.getElementById(el) : el),
  
  tagName = el.tagName, newEl = DomCache.createElement(tagName);
  // Preserve the element's id and class (other properties are lost)
  if (oldEl.id) { newEl.id = oldEl.id; }
  if (oldEl.className) { newEl.className = oldEl.className; }
  
  var style = oldEl.style;
  var styleAttr = $(oldEl).attr('style');
  
  if (styleAttr) { $(newEl).attr('style',styleAttr); }
  // Replace the old with the new     
  if (!flag) {
    html = '<div class="dummyBlock">&nbsp;</div>' + html;
  }
  newEl.innerHTML = html;
  oldEl.parentNode.replaceChild(newEl, oldEl);
  DomCache.removeElement(oldEl);

  evalScript(newEl);
}

var DomCache = new function() {
  var elementCache = {};
  var jqueryDiv = null;
  return {
    /**
     * Create new DOM element.
     * @param {String} elementName - name of new dom element
     * @return new dom element
     */
    createElement: function(elementName) {
      if ($.browser.ie) { 
        return document.createElement(elementName);
      }
      if (elementCache[elementName+'Element'] == null){
        elementCache[elementName+'Element'] = document.createElement(elementName.toUpperCase());
      }     
      return elementCache[elementName+'Element'].cloneNode(false);
    }
  }
}
Выделить код

Код:

function evalScript(target, doInFF) {
  if ($.browser.ie || doInFF) {
    var scrArr = target.getElementsByTagName('script');   
    for (var i = 0, len = scrArr.length; i < len; i++) {
      if (scrArr[i]) {
          //alert("scrArr[i].innerHTML=" + scrArr[i].innerHTML);
        $.globalEval(scrArr[i].innerHTML);
      }    
    }
    if ($.browser.ie) {
      for (var i = 0; i < scrArr.length; i++) {
        scrArr[i].outerHTML = '';
        i--;    
      }       
    }
  }
  return true;     
}
Выделить код

Код:

jQuery.globalEval = function( data ) {
      data = jQuery.trim( data );
      if ( data ) {
        if ( window.execScript ) {
            ( window.execScript || function( data ) {
                window[ "eval" ].call( window, data );
            } )( data );
        } else if ( jQuery.browser.safari )
          // safari doesn't provide a synchronous global eval
          window.setTimeout( data, 0 );
        else {
          eval.call( window, data );
        }
      }
    }

В итоге выполнялось eval.call( window, data ); (Это в JQuery 1.2.6) и в фф 3,6 версии все работало.
Поменял на

Выделить код

Код:

( window.execScript || function( data ) {
                window[ "eval" ].call( window, data );
            } )( data );

из JQuery 1.7 но джава скрипт все равно не выполняется под фф11.

Отредактировано ptolemey (23-04-2012 18:01:01)

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]