2011-07-26 31 views
8

Tôi đang cố gắng thêm một bài đăng jQuery vào một số JavaScript trên một trang web. Toàn bộ trang được tạo thành từ một số mẫu Velocity. Tất cả mọi thứ đã tốt đẹp cho đến khi tôi đã cố gắng để thêm bài jQuery, bây giờ tôi nhận được:Vận tốc - Làm thế nào để tránh ParseErrorException khi sử dụng jQuery?

org.apache.velocity.exception.ParseErrorException: Encountered "," at line 282, column 24 of /WEB-INF/velocity/www/comments.vm 
Was expecting one of: 
    "(" ... 
    <RPAREN> ... 
    <ESCAPE_DIRECTIVE> ... 
~~~snip~~~ 

Đường dây 282 là $.post(... và cột 24 dường như là người đầu tiên "" nhân vật. Ban đầu tôi đã có JSON trên dòng này, nhưng tôi đã chuyển nó lên (đến dòng var myJSONObject ...) vì tôi nghĩ rằng lỗi liên quan đến JSON không hợp lệ (các tab ở đầu dòng đã đưa ra một số cột gây hiểu lầm).

var myJSONObject = {"body": "", "action": "postcomment", "submitted": "true", "ajax": "true"}; 
myJSONObject.body = $("body").val(); 
$.post("$!{articleurl}", myJSONObject, function(result){    
    btn.textContent='Comment sent successfully.'; 
}); 

nhỏ Cập nhật

Tôi đã thay đổi dòng sau:

var url = "$articleurl"; 

$.post(url, myJSONObject, function(result){ 
~~~snip~~~ 

Ngoại lệ phân tích vẫn tập trung vào ngày đầu tiên ",". Tôi giả định vấn đề là Velocity nghĩ rằng nó sẽ có thể giải quyết $ .post - khi thực tế, đó là jQuery. Tôi đã sử dụng jQuery trong các mẫu VM Velocity khác mà không có bất kỳ vấn đề gì. Có cách nào để có được Velocity để bỏ qua một số dòng/báo cáo khi phân tích cú pháp?


Cập nhật 2

tôi thấy this link về thoát tài liệu tham khảo trong Velocity, nhưng nó không giải quyết được vấn đề của tôi. Thêm "\" trước $.post mang lại cho tôi cùng một lỗi chính xác, nhưng cột là một phụ, vì ký tự được thêm ở đầu dòng.

Trả lời

13

Bạn có thể quấn javascript của bạn với #[[ ... ]]# mà nói với Velocity không phân tích khối kèm (mới trong Velocity 1,7)

#[[ 
<script> 
    ... 
</script> 
]]# 
+0

+1 Cảm ơn. :) Bây giờ tôi cần kiểm tra phiên bản tôi đang sử dụng. – Mikaveli

+0

Nhược điểm khác của điều này là bạn sẽ nhận thấy tôi sử dụng một vài biến Velocity trong kịch bản. – Mikaveli

+1

@Mikaveli Tôi thường khởi tạo tất cả các biến js đến từ vận tốc trong một khối tập lệnh được tách riêng ở trên. – serg

9

Ok, dường như có hai giải pháp cho việc này:

Thứ nhất, với jQuery chúng tôi chỉ có thể tránh được bằng cách sử dụng bí danh $ toàn cầu và thay vào đó sử dụng đối tượng jQuery trực tiếp:

jQuery.post(url, myJSONObject, function(result){ 
~~~snip~~~ 

Trong trường hợp của tôi , các công trình trên tuyệt vời. Nhưng tôi nghi ngờ trong các kịch bản khác (không phải jQuery) điều này có thể không được. Trong trường hợp này, chúng ta có thể 'giấu' nhân vật của chúng ta trong một tham chiếu Velocity hợp lệ như thế này:

#set($D = '$') 
${D} 

Nguồn: http://velocity.apache.org/engine/devel/user-guide.html#escapinginvalidvtlreferences

tôi vẫn muốn biết lý do tại sao thoát xuyệc ngược không làm việc, nhưng ở trên sẽ ít nhất làm cho tôi di chuyển một lần nữa. :)

+2

dấu chéo ngược là cho thoát khỏi các tham chiếu thực tế, không phải những thứ gây ra lỗi phân tích cú pháp. nghĩ về dấu gạch chéo ngược làm thứ gì đó chỉ áp dụng sau khi phân tích cú pháp. –

1

Tôi nghĩ rằng đây là một lỗi trong phiên bản 1.6.x, bởi vì nó hoạt động tốt trong 1,7 (Nếu nó không, xin vui lòng cho tôi biết, tôi kiểm tra nó nhiều lần ..), theo các tài liệu tham khảo, các $ chỉ có hiệu lực khi nó được theo sau bởi a-zA-Z. Tôi muốn thử gỡ lỗi những gì đã xảy ra thực sự, nhưng mã dịch được tạo ra bởi công cụ Java CC, nó là quá khó để nhận ra logic ...

-1

Tôi không thể làm cho nó hoạt động với bất kỳ bản sửa lỗi nào khác như thoát "$" trong vận tốc không may. Tôi nhận được nó làm việc bằng cách tải một tập tin js bên ngoài với jQuery thay vì viết jQuery trực tiếp trong vận tốc. Làm việc ra cho tôi ít nhất, hy vọng nó sẽ giúp người :)

/Björn

0

bạn phải tạo một tập tin js với mã javascript của bạn và nhập js bạn nộp vào mã vm của bạn

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