«Неожиданное» поведение при вызове кода ColdFusion (серверного кода) из обработчиков событий javascript - PullRequest
0 голосов
/ 01 октября 2009

У меня есть простой диалог YUI с 2 кнопками - Принять и Отклонить. Я хотел бы вызывать код ColdFusion вместе с кодом JavaScript при нажатии каждой кнопки. Когда я представляю код CF вместе с кодом JS, к сожалению, оба кода CF, присутствующие в каждой из функций, запускаются.

Весь код показан ниже:

<script type="text/javascript"> 

function displayForm() {
   YAHOO.namespace("example.container");    
        if (!YAHOO.example.container.Form) {        
            YAHOO.example.container.Form = new          
                           YAHOO.widget.SimpleDialog("Form", {
                modal: true,
                icon: YAHOO.widget.SimpleDialog.ICON_WARN,
                visible: false,
                fixedcenter: true,
                constraintoviewport: true,
                width: "500px",
                role: "alertdialog",
                draggable: false, 
                buttons: [ { text:"Accept", handler:handleAccept, isDefault:true }, { text:"Decline", handler:handleDecline} ]
            });             
            YAHOO.example.container.Form.setHeader("Info");         
                    YAHOO.example.container.Form.setBody("Body");   
            YAHOO.example.container.Form.render(document.body);
        }           
        YAHOO.example.container.Form.show();            
   }        


   function handleAccept() {
       this.cancel();
       <CFQUERY name="UpdTable" datasource="test>
           UPDATE t 
           set a = '1'
           where b = '1'
       </CFQUERY>
   }

   function handleDecline() {
       this.cancel();        
       <CFQUERY name="UpdTable" datasource="test>
           UPDATE t 
           set a = '2'
           where b = '1'
       </CFQUERY>
   }

   displayForm();

</script>

Проблема в том, что когда handleAccept () запускается автоматически, CF-код handleDecline () запускается, поэтому я заканчиваю с = 2 в базе данных, а не = 1.

Есть ли обходной путь или простое решение для этого? В идеале я не хочу использовать перенаправление JS.

Ответы [ 2 ]

5 голосов
/ 01 октября 2009

Код ColdFusion выполняется, когда браузер запрашивает страницу. То есть, когда код отправляется в браузер, выполняются два запроса Coldfusion (так что каждый раз, когда кто-то просматривает страницу с вышеуказанным кодом, эти 2 запроса выполняются). Вот как работает ColdFusion:

  1. Браузер запрашивает страницу с веб-сервера
  2. Веб-сервер обрабатывает весь код ColdFusion
  3. Веб-сервер отправляет полученный текст в браузер
  4. Браузер интерпретирует текст как веб-страницу

Ваша проблема возникает в 4. Код ColdFusion больше не существует! (Просмотреть исходный код страницы для просмотра.) Код ColdFusion уже был обработан еще на этапе 2 и не отправлен в браузер.

Так как вы решаете свою проблему? Что ж, поскольку обработка ColdFusion происходит после запроса страницы, вам нужно запросить страницу. Поскольку вы изменяете данные на сервере, вам нужно сделать сообщение, см. http://developer.yahoo.com/yui/examples/connection/post.html пример выполнения сообщения с помощью диспетчера соединений YUI.

Для простоты имейте две страницы, одну, которую запрашивают для принятия, а другую для отклонения. На странице просто сделайте соответствующий CFQUERY. Теперь, в ваших функциях handleAccept и handleRequest, запрашивайте эти страницы, как в примере с диспетчером соединений YUI выше. например.

var callback = 
{ 
    success: function(o){}, 
    failure: function(o){}, 
    argument: [] 
};  
var request = YAHOO.util.Connect.asyncRequest('POST', "accept.cfm", callback, "");
1 голос
/ 01 октября 2009

Оба ваших запроса оцениваются на сервере до , когда страница отображается в браузере пользователя.

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

ColdFusion является языком на стороне сервера и всегда запускается до того, как пользователь что-либо увидит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...