2009-02-03 79 views
0

我有一个表单,它使得一个Ajax POST请求插入一个小部件到我的数据库中。在表单中,我有一个选择框,您可以从小部件中进行选择。数据库插入后,我必须更新选择框。我现在只是替换整个表单。在AJAX onComplete事件被调用之前,页面上的Javascript没有执行

因为选择框有小部件,所以我必须在javascript中有一个对象的副本。我称这个var widget_objects。在更新事件期间替换表单时,我打印ruby变量<%= @widget_objects%>,我可以看到新创建的对象。但是,当我尝试访问onComplete事件中的javascript var“widget_objects”时,新对象不存在。我在页面上用这行代码创建javascript widget_objects: widget_objects = <%= @widget_objects%>;

因此,似乎上面的代码行不会在Ajax请求的onComplete事件之前执行。然而,我认为onComplete事件发生在页面加载后,我会假设在脚本被评估之后......任何想法?

<%= 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');" 
        }) %> 

回答

1

在处理这些问题时,请使用Firefox的JS调试器(安装Firebug插件),启用自动中断异常(从脚本选项卡)并重新加载页面。如果Firefox截获异常(例如源自响应rjs内),则修复异常。您可能还想围绕您的rjs,并使用'try {...} catch(e){alert(e)}'JS包装器完成代码。

接下来,使用JS调试器在prototype.js的respondToReadyState方法中设置断点,您可以在其中检查应用程序的rjs回复,并逐步执行evalResponse()方法。你会很快缩小它的范围。

1

将EvalScripts设置为true必须工作。

其他你可以尝试加载使用

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

脚本,如果这没有帮助,那么你可以调用函数:在接收到响应的功能将被称为装载在Ajax调用。

1

我的PHP脚本中发生了类似的情况,脚本的时间似乎不同步。这是更多关于如何代码出现在AJAX调用之后将在的onSuccess事件中的代码之前执行,并将溶液包裹整个事件响应代码匿名函数里面,像这样:

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

你可能在完成标识符后尝试类似的方法。希望这可以帮助!

相关问题