>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >После ajax запроса не работает javascript в firefox 4 - 11 http://forum.mozilla-russia.org/viewtopic.php?id=54650 |
ptolemey > 20-04-2012 17:34:54 |
Добрый день. Есть веб приложение которое работает так: Все это делалось во времена когда были firefox 3,6, IE6, JQuery 1.2.6. Все работало отлично пока не появилась новая версия firefox (начиная с 4 и заканчивая 11 версией). Суть проблемы. При нажатии на одит из элементов меню, происходит ajax запрос, в ответ получаем html и javascript. Так вот в фф 3,6 все это нормально отрабатывало. В фф 11 javascript уже не отрабатывает/не выполняется. Код страници ответа (простой пример): Выделить код Код:<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> Заранее благодарен. |
Infocatcher > 20-04-2012 19:22:21 |
Так сами по себе скрипты после .innerHTML = "полученный HTML со скриптами" никогда не выполнялись. http://api.jquery.com/jQuery.ajax/
|
banbot > 21-04-2012 01:02:14 |
Тема перенесена из форума «Firefox» в форум «Разработка». |
ptolemey > 23-04-2012 17:50:46 |
Уточню, при получении ответа, производились вот такие манипуляции: вызывался метод replaceHtml в котором происходила замена самого контента и вызов eval Выделить код Код: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. |