AJAX - wykonywanie kodu z resnponseText
June 22nd, 2007 by prondNiewątpliwie jednym z większych problemów związanych z użyciem na stronie AJAX’a jest wykonywanie kodu JavaScript zawartego w HTML’u zwracanym przez serwer. Można go rozwiązać w bardzo prosty sposób - zbudować aplikację w oparciu o jakiś framework, taki na przykład jak prototype.js i korzystać z metody Element.update
Jednak wśród developer’ów są prawdziwi hardcore’owcy, którzy muszą wszystko napisać sami ![]()
Poniższy kod jest niemal dokładną kopią rozwiązania zastosowanego w prototype.js.
Postarałem się go tylko trochę uporządkować dla tych, którzy nie korzystają z framework’ów i pewnie będą chcieli sobie poradzić z tym problemem samemu.
/* * Wzorzec dla wyciagania wszystkich skryptow * i - case insensitive * m - tryb multiline * g - global (znajduje wszystkie wystapienia, a nie tylko pierwsze) */ var matchAll = new RegExp('(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 'img'); /* * Wzorzec dla wyciagania pojedynczego skrypty */ var matchOne = new RegExp('(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 'im'); /* * Zamiana wszystkich skryptow na pusty string - dostajemy czysty html bez skryptow */ var html = response.responseText.replace(new RegExp('(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 'img'), ''); /* * Wyszukujemy wszystkie skrypty */ var scripts = (response.responseText.match(matchAll) || []); /* * Tu bedziemy wrzucac kod wszystkich skryptow */ var script = script; /* * Doklejamy po kolei znalezione skrypty */ for (var i = 0; i < scripts.length; i++) { script += (scripts[i].match(matchOne) || ['',''])[1]; } /* * Wklejamy html do obiektu */ document.getElementById(element).innerHTML = html; /* * Wykonujemy skrypt * Tak dla pewności dopiero po 10 ms */ setTimeout(script, 10);
Posted in Javascript |