2013-07-31 34 views
7

Possible solutionJavaScript: chức năng không hoạt động mà không cần cảnh báo()

Xin chào, đồng nghiệp!

Tôi viết thư cho bạn để yêu cầu trợ giúp về một vấn đề mà tôi gặp phải gần đây. Vấn đề chính là như sau:

1) Tôi có yêu cầu ajax, được triển khai với jQuery.

2) Sau khi trả lời thành công, tập lệnh sẽ tải lại trang với các thay đổi tương ứng và nếu có bất kỳ lỗi xác thực nào, hãy chèn chúng sau trường ẩn, được sử dụng để lưu trữ dữ liệu không quan trọng. Nếu có bất kỳ lỗi xác thực nào, các thay đổi sẽ không được lưu và trang sẽ được tải lại với các thông báo lỗi xác thực. Việc xác nhận chính nó được thực hiện bởi một servlet.

3) Tôi nhận thấy mọi thứ hoạt động tốt, khi bất kỳ loại cảnh báo nào() được trình bày trước khi thực sự thêm thông báo lỗi, nhưng tôi không muốn có cảnh báo như vậy.

Đây là đoạn mã JavaScript:

$('#randomFormElement').submit(function() { 
     $(this).ajaxSubmit({ 
      success: function (data, status) { 
       randomFunctionToReloadThePage(arg1, arg2, arg3); 
       var errors = $(data).find('.classNameOfTheErrors').xml(); 
       //alert(something); 
       $(errors).insertAfter('#idOfTheHiddenField'); 
      }, 
      error: function (jqXHR, textStatus, thrownError) { 
      //Error handling if the ajax response fails. 
      } 
     }); 
}); 

Vì vậy, câu hỏi chính là: thỏa thuận với alert() làm cho nó hoạt động là gì?

==========================

Trên Chrome, nó cũng không hoạt động.

Trên FF, nó chỉ hoạt động khi một số cảnh báo() hiện diện.

Cảm ơn trước!

+4

'randomFunctionToReloadThePage' làm gì? Nếu bất kỳ phần nào của nó là không đồng bộ, sự chậm trễ do cảnh báo giới thiệu có thể tạo ra sự khác biệt. – Thilo

+3

Cũng giống như một lưu ý phụ. Nếu bạn tải lại trang của mình sau yêu cầu ajax? Tại sao sau đó bạn thực hiện một yêu cầu ajax ở nơi đầu tiên. Tại sao không gửi toàn bộ trang và sau đó bạn không phải tải lại nó. – roel

+0

trang của bạn có được làm mới trước khi cuộc gọi ajax hoàn tất không? bạn đang cố gửi biểu mẫu bằng ajax? –

Trả lời

2

Nhờ câu trả lời của mọi người và câu trả lời của gvee nói riêng, tôi đã cố gắng giải quyết nó. Rõ ràng, thực sự có điều gì đó không đồng bộ xảy ra trong randomFunctionToReloadThePage() và tôi đã cố khắc phục sự cố bằng cách sử dụng số

Chỉnh sửa: lỗi thứ hai được tìm thấy trong khi sử dụng ajaxStop().Các giải pháp tôi thấy hoạt động bình thường là như sau:

1) Thêm một tham số bổ sung cho các randomFunctionToReloadThePage

2) Gọi chức năng với tham số thêm vào trang tương ứng.

+2

bạn nên +1 mọi người đã đề cập rằng randomFunctionToReloadThePage() có lẽ không đồng bộ và bạn nhận xét về nó nói rằng nó không phải là :) – roel

5

Chức năng alert() chặn việc thực thi mã và trì hoãn việc xử lý mã javascript ở dưới cùng của nó. Điều này có thể dành thời gian cho yêu cầu ajax để hoàn thành.

+0

It's in the 'success 'chức năng của cuộc gọi ajax, điều này có nghĩa là cuộc gọi đã hoàn thành tại thời điểm này chắc chắn. – UweB

+1

@UweB: Cuộc gọi đầu tiên được thực hiện, nhưng có thể 'randomFunctionToReloadThePage' cũng thực hiện điều gì đó trong nền. – Thilo

+1

Tôi đồng ý @Thilo, và tôi cũng đồng ý với phần đầu tiên của những gì mà người mới bắt đầu, nhưng tôi không đồng ý rằng 'alert()' sẽ yêu cầu * ajax * thời gian để hoàn thành. Nó sẽ cho bất kỳ hoạt động không đồng bộ nào có thể xảy ra trong * randomFunc * ... thời gian để hoàn thành. :-) – UweB

1

cố gắng thêm: cache: false

$('#randomFormElement').submit(function() { 
    $(this).ajaxSubmit({ 
     cache: false, 
     success: function (data, status) { 
      randomFunctionToReloadThePage(arg1, arg2, arg3); 
      var errors = $(data).find('.classNameOfTheErrors').xml(); 
      //alert(something); 
      $(errors).insertAfter('#idOfTheHiddenField'); 
     }, 
     error: function (jqXHR, textStatus, thrownError) { 
     //Error handling if the ajax response fails. 
     } 
    }); 

});

+0

Không thay đổi gì. –

3

Đây không phải là câu trả lời mà là mẹo gỡ lỗi (không thể định dạng mã đúng trong nhận xét).

Thêm hai cuộc gọi này sau khi alert():

console.log("errors:", errors); 
console.log("hidden:", $('#idOfTheHiddenField')[0]); 

Để cảnh báo nhận xét ra và chạy nó. Nó hiển thị gì trong bảng điều khiển dành cho nhà phát triển?

Sau đó, để so sánh, bỏ ghi chú cảnh báo, vì vậy nó chạy trước hai cuộc gọi đó và chạy nó trong Firefox. Bây giờ có gì trong giao diện điều khiển?

+0

Tôi nhận được chính xác cùng một nhật ký trong bảng điều khiển. –

Các vấn đề liên quan