Открыть Word из JS

Тема в разделе "Другие языки", создана пользователем KilllorD, 20 апр 2009.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. KilllorD

    KilllorD Создатель

    Регистр.:
    27 мар 2009
    Сообщения:
    36
    Симпатии:
    0
    print "<a href=\"javascript:ABC()\" type=\"application/msword\" id=\"a1\"></a>";

    в этой строке запускается функция JS, возвращаемое значение этой функции открывается в ворде. Это всё работает, но нужно из функции ABC запускать PHP скрипт, который и генерирует сам этот документ. Но функция завершается быстрей скрипта и никак значение скрипта вернуть не могу. Какие могуть быть решения этой проблемы? или какието другие способы создания документа в ворде?

    Функция такого вида:
    function ABC(){


    $.ajax({
    type: "POST",
    url: "../print.php",
    data: "a=1",
    success: function(msg){
    alert( "Data Saved: " + msg );
    }
    });

    return msg;
    };

    Ну естественно msg оказывается пустым, как сделать чтобы ретёрн мог вернуть то что сгенерирует скрипт print.php?
     
  2. andrnag

    andrnag

    Регистр.:
    26 мар 2008
    Сообщения:
    350
    Симпатии:
    124
    Таймауты где-нить в jQuery подкрутить?
    Или длинных циклов пустых понаставить чтобы за'sleep'ать ее.
     
  3. KilllorD

    KilllorD Создатель

    Регистр.:
    27 мар 2009
    Сообщения:
    36
    Симпатии:
    0
    я по другому поступил, просто поставил редактор tinyMCE и использовал его вместо ворда, получилось даже лучше
     
  4. andrnag

    andrnag

    Регистр.:
    26 мар 2008
    Сообщения:
    350
    Симпатии:
    124
    Ааа, так это для WYSIWYG нужно было! Конечно tinyMCE лучше подходит для этих целей. Или FCKeditor. А у тебя, получается человек редактировал ворд-документ, пока его ждал Ajax? Или как?
     
  5. mikemilj

    mikemilj Постоялец

    Регистр.:
    31 янв 2009
    Сообщения:
    103
    Симпатии:
    4
    а что можно использовать Word внутри страницы в виде редактора? Первый раз о таком слышу
     
  6. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Не нужно возвращать результат после работы ajax. надо вызывать функцию при получении результатов. Обычно callback передают. Для этого надо перепроектировать скрипт, чтобы он работал не линейно, а событийно.

    function ABC(callback){


    $.ajax({
    type: "POST",
    url: "../print.php",
    data: "a=1",
    success: function(msg){
    alert( "Data Saved: " + msg );
    //вот тут и надо вызывать метод генерации чего там надо
    }
    });
    };
     
  7. andrnag

    andrnag

    Регистр.:
    26 мар 2008
    Сообщения:
    350
    Симпатии:
    124
    А можно в двух словах, в чем отличие? (JavaScript только начинаю изучать.)
     
  8. newd

    newd Создатель

    Регистр.:
    13 ноя 2007
    Сообщения:
    46
    Симпатии:
    4
    если хотите чтобы вам через ajax пришел файл, то отправляйете его через ифрейм.
    Ну а сделать проще через готовый висивиг редактор
     
  9. KilllorD

    KilllorD Создатель

    Регистр.:
    27 мар 2009
    Сообщения:
    36
    Симпатии:
    0
    не ворд, а небольшие редакторы типа указанных выше
     
  10. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Дело в том, что яваскрипт выполняется одним потоком. Но вызов ajax - асинхронная операция, поэтому основной поток выполнения js не ждет ответа, а выполняется дальше. Поэтому чтобы не гадать, когда получен ответ и не устраивать охоту за ним, используется событийная модель.
    Типичная модель написания кода начинающих программистов - линейная. Это - запустил и оно последовательно все выполняется. Это хорошо работает в пхп.
    В яваскрипт используется, так сказать, событийный подход. Любое событие инициирует действие. Поэтому код не выполняется линейно, а только при наступлении события (клик или движении мыши, появление элемента и т.д.). Таким образом ответ от ajax по сути то же событие, поэтому куда удобнее дать ему возможность самому стартовать обработку ответа при его получении. Для этого просто указывается метод, который нужно вызывать, чтобы обработать ответ.
    вот как примерно у тебя
    Код:
    //отсюда начинается выполнение
    var url=....
    //запрашиваем ajsx
    var message=ajaxRequest(url);
    //тут обработка ответа
    //но тут будет пусто, потому что программа не будет ждать
    //пока выполнится ajaxRequest
    //можно конечно сделать синхронный вызов, но это будет держать поток программы
    //пока не придет ответ
    function ajaxRequest(url){
    	//тут посылаем запрос ajax и возвращаем ответ
    }
    
    а лучше будет так
    Код:
    //отсюда начинается выполнение
    var url=....
    //запрашиваем ajax передавая фунцкию обратного вызова
    var message=ajaxRequest(url, callback);
    //ВОТ ТУТ ГЛАВНОЕ. ПОСЛАЛИ И ЗАБЫЛИ. 
    //нужный код обработки сам будет вызван когда нужно
    function ajaxRequest(url, callback){
    	//тут посылаем запрос ajax и получаем ответ
    	//вызываем переданный метод каллбэк, передавая ему ответ
    	//также можно ничего не передавать, а тут же на месте и обработать. Принцип тот же -работа по событию
    }
    // а вот это фукция обратного вызова (оно же callback)
    function callback(message){
    	//тут обработка ответа
    }
    
     
    andrnag нравится это.
Статус темы:
Закрыта.