Google

Kategorie

Reprezentacja Wiedzy

Kalendarz

June 2007
M T W T F S S
« May   Jul »
 123
45678910
11121314151617
18192021222324
252627282930  

AJAX - wykonywanie kodu z resnponseText

June 22nd, 2007 by prond

Niewą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 |

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.