Javascript на странице не выполняется до вызова события AJAX onComplete - PullRequest
0 голосов
/ 03 февраля 2009

У меня есть форма, которая делает запрос Ajax POST для вставки виджета в мою базу данных. В форме у меня есть поле выбора, где вы можете выбрать из виджетов. После того, как вставка БД сделана, я должен обновить поле выбора. Я на самом деле просто заменить всю форму на данный момент.

Поскольку в окне выбора есть виджеты, у меня должна быть копия объектов в javascript. Я называю это var widget_objects. Когда форма заменяется во время события обновления, я печатаю переменную ruby ​​<% = @widget_objects%> и вижу вновь созданный объект. Однако, когда я пытаюсь получить доступ к javascript var "widget_objects" в событии onComplete, новый объект не существует. Я создаю javascript widget_objects с этой строкой кода на странице: widget_objects = <% = @widget_objects%>;

Так что кажется, что строка кода выше не выполняется перед событием onComplete Ajax-запроса. Тем не менее, я думал, что событие onComplete происходит после загрузки страницы, и я предполагаю, что после того, как скрипты будут eval'd .... какие-нибудь идеи?

<%= submit_to_remote( 
                    "save_widget", 
                    "Save Widget & Generate Embed Code", 
                    {
                        :url => widgets_url(:user_id => @user.id),
                        :update => "widget_form",
                        :method => :POST,
                        :html => {  :id => "save_widget_button", 
                                    :onclick => "this.value='Saving...'; this.disabled = 'true';",
                                    :style => "width: 220px;"
                                 }, 
                        :complete =>"
                            $('save_widget_button').disabled=''; 
                            $('save_widget_button').value='Save Widget & Generate Embed Code';
                            var last_id = $j('select#widget_id').children(':last').attr('value');
                            alert( widget_objects[last_id] );
                            ",
                        :success => "reportMessage('success', request.headerJSON.success, 'save_widget_status'); $('band_form').reset();",
                        :failure => "reportMessage('failure', request.headerJSON.errors, 'save_widget_status');"
                    }) %>

Ответы [ 3 ]

1 голос
/ 16 февраля 2009

У меня было нечто похожее на то, что происходило в моих PHP-скриптах, где время выполнения скриптов казалось несинхронным. Это было больше о том, как код, который появился ПОСЛЕ того, как ajax-вызов будет выполняться перед кодом в событии onSuccess, и решением было обернуть весь код ответа на событие в анонимную функцию, например так:

onSuccess: function(reply)
{
    resp = reply.reponseText();
    pieces = resp.split('|');
    (...etc...)
}

Вы можете попробовать нечто подобное после: полного идентификатора. Надеюсь, это поможет!

1 голос
/ 16 февраля 2009

При решении подобных проблем используйте отладчик JS Firefox (установите надстройку Firebug), включите автоматическое прерывание по исключению (на вкладке «Сценарии») и перезагрузите страницу. Если Firefox перехватывает исключение (например, происходящее из ответа rjs), тогда исправьте исключение. Вы также можете просто окружить свои rjs и: полный код JS-оболочкой 'try {...} catch (e) {alert (e)}'.

Далее, используйте отладчик JS для установки точек останова внутри метода responseToReadyState файла prototype.js, где вы сможете проверить ответ rjs из вашего приложения и пройти через метод evalResponse (). Вы сузите это довольно быстро.

1 голос
/ 07 февраля 2009

Настройка EvalScripts на true должна работать.

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

> <script> function window.onload(){
> alert('I am loaded as the page
> completes loading') } </script>

если это не помогает, вы можете вызвать функцию: при загрузке в ajax-вызовах при получении ответа будет вызвана функция.

...