Страницы: 1
Добрый день.
Убив кучу времени в поиске решения проблемы, так и не найдя решания, решил задать вопрос уважаемым форумчанам.
Есть веб приложение которое работает так:
При первом обращении грузится страница которая разделена на части/области: меню, верхняя, нижняя, средняя и область для виджетов.
Все остальные переходы по сайту происходят посредством вызова 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)
Отсутствует
Так сами по себе скрипты после .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.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Тема перенесена из форума «Firefox» в форум «Разработка».
Do you feel lucky, punk?
Отсутствует
Уточню, при получении ответа, производились вот такие манипуляции:
вызывался метод 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"> </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)
Отсутствует
Страницы: 1