Как можно динамически загружать функции Javascript, используя Ajax? - PullRequest
2 голосов
/ 26 января 2010

(риторический вопрос)

Сегодня я столкнулся со странным сценарием, в котором я хотел, чтобы PHP обновлял поведение javascript на лету. Раздражало, вот что я попробовал ...

/*
 * ajax-php-javascript-function-loader.php
 *
 * this gets called by AJAX and defines or re-defines the 
 * definition of dynamicDoStuff()
 */
 <script type="text/javascript">
     function dynamicDoStuff(a,b){
          <?php
          //dynamically defined function behavior
          ?>
     }
 </script>

Это не сработало, потому что при загрузке нового javascript область действия определения новой функции была ограничена новыми тегами сценария. Скрипты в других местах на странице не могли прочитать его.

Итак, вот что вам нужно сделать.

/*
 * index.html
 */
 <html>
     <head>
        <script type="text/javascript">
           var dynamicDoStuff;
        </script>
        <!-- Other Head Stuff -->
     </head>
     <body>
         <!-- the body of the site -->
     </body>
 </html>

и

/*
 * axax-php-javascript-function-loader.php
 */
 <script type="text/javascript">
     dynamicDoStuff = function(a,b){
         <?php
         //dynamically define function behavior
         ?>
     }
 </script>

, определяя имя функции в заголовке, она становится общедоступной, поэтому вы можете динамически изменять ее назначение с помощью ajax и (php или чего-либо еще)

Ответы [ 2 ]

2 голосов
/ 26 января 2010

Вместо

function newFunctionViaAjax() { ... }

вместо этого можно использовать

window['newFunctionViaAjax'] = function newFunctionViaAjax() { ... };
0 голосов
/ 26 января 2010

Лучший подход может заключаться в том, чтобы ваш AJAX-метод возвращал data , в этом случае флаг, указывающий, какое поведение должен использовать ваш рассматриваемый метод.

var ajaxResponseHandler = function(jsonResponse) {
    dynamicDoStuff = jsonResponse.someFlagFromTheServer == someExpectedValue 
         ? staticDoStuffA
         : staticDoStuffB;
};

В идеале, по крайней мере в большинстве ситуаций, ваш метод AJAX должен просто возвращать данные в любом случае.

Кроме того, с помощью этого метода вы можете иметь требуемое альтернативное поведение, определенное в обычном файле JavaScript, который уже загружен клиентом, вместо того, чтобы смешивать JavaScript с вашим PHP.

...