Yêu cầu POST jQuery không phải AJAX


78

Tôi đang cố gắng sử dụng hàm jQuery POST nhưng nó đang xử lý yêu cầu theo kiểu AJAX. Ý tôi là nó không thực sự chuyển đến trang mà tôi đang nói với nó.

$("#see_comments").click(function() {
    $.post(
        "comments.php", 
        {aid: imgnum}, 
        function (data) {

        }
    );
});

Hàm này sẽ chuyển đến trang comments.php với giá trị hỗ trợ trong tay. Nó đăng tốt nhưng không chuyển hướng đến comment.php .


@Doug Neiner Làm rõ:

  1. Tôi có 15 liên kết (hình ảnh). Tôi nhấp vào một liên kết và nó tải JavaScript của tôi. Kịch bản biết những gì imgnumtôi đã mở. Điều này imgnumtôi muốn trong comment.php . Tôi phải sử dụng JavaScript này và không có phương tiện nào khác có thể làm được. JavaScript là bắt buộc

  2. Phương thức của bạn ĐĂNG thành công giá trị hỗ trợ. Nhưng trong comments.php khi tôi cố gắng lặp lại giá trị đó, nó không hiển thị gì.

  3. Tôi đang sử dụng Firebug. Trong Bảng điều khiển, nó hiển thị YÊU CẦU echo tôi đã thực hiện ở Bước (2) thành công.


2
Ờ? Chuyển hướng? Có lẽ bạn có thể giải thích thêm một chút về những gì bạn đang cố gắng làm.
metrobalderas

Các comments.php có nằm trong cùng thư mục với tệp yêu cầu không?
rahul

bài đăng SO này có thể giúp stackoverflow.com/questions/1149454/…
DC

@metrobalderas: tôi nghĩ nó khá rõ ràng. @pulse: đúng là như vậy.
amit

Câu trả lời:


130

Tôi biết bạn đang cố gắng làm gì, nhưng đó không phải là điều bạn muốn.

Đầu tiên, trừ khi bạn đang thay đổi dữ liệu trên máy chủ, đừng sử dụng một POSTyêu cầu. Chỉ cần có #see_commentsmột bình thường<a href='/comments.php?aid=1'>...

Nếu bạn phải sử dụng POST, hãy thực hiện việc này để trang thực hiện theo lời kêu gọi của bạn:

$("#see_comments").click(function() {
  $('<form action="comments.php" method="POST">' + 
    '<input type="hidden" name="aid" value="' + imgnum + '">' +
    '</form>').submit();
});

Làm thế nào điều này thực sự sẽ hoạt động.

Đầu tiên $.postchỉ một phương pháp AJAX và không thể được sử dụng để làm một truyền thống formnộp như bạn đang mô tả. Vì vậy, để có thể đăng một giá trị điều hướng đến trang mới, chúng ta cần mô phỏng một formbài đăng.

Vì vậy, dòng chảy như sau:

  1. Bạn nhấp vào hình ảnh và mã JS của bạn nhận được imgnum
  2. Tiếp theo, ai đó nhấp vào #see_comments
  3. Chúng tôi tạo một trường tạm thời formvới imgnumgiá trị trong đó dưới dạng một trường ẩn
  4. Chúng tôi gửi biểu mẫu đó, biểu mẫu này sẽ đăng giá trị tải comments.phptrang
  5. comments.phpTrang của bạn sẽ có quyền truy cập vào biến đã đăng (nghĩa là trong PHP sẽ có $_POST['aid'])

giá trị viện trợ đến từ DB. vì vậy tôi thực sự muốn thứ jquery hoạt động. vì tôi cũng cần Javascript của mình.
amit

@amit, trong mã bạn đăng, aidgiá trị không đến từ cơ sở dữ liệu mà nó đang được gửi đến yêu cầu AJAX. Bạn đã không đăng toàn bộ chức năng của bạn?
Doug Neiner

@amit, thì câu hỏi của bạn không rõ ràng. Mã của tôi POST là imgnum tới comments.phptệp VÀ chuyển hướng cùng một lúc. Bạn còn muốn nó làm gì nữa?
Doug Neiner

@amit, tôi không đồng ý với bạn imgnumnguồn gốc từ đâu, chỉ là câu trả lời của tôi tương đồng chính xác với mã của bạn ngoại trừ nó với chuyển hướng. Chỉ cần thử hoán đổi $('form... .submit();cuộc gọi với của bạn $.postvà xem liệu nó có không thực hiện chính xác những gì bạn muốn hay không.
Doug Neiner

15
Bạn nên nối biểu mẫu vào DOM vì IE và Firefox nếu không sẽ bỏ qua quá trình gửi (nếu bạn muốn thêm nhiều trường khác, các trường không ẩn - ví dụ: đầu vào văn bản - thì cũng cần gọi .hide () trước .appendTo () để tránh bất kỳ bước nhảy nào trong nội dung)
Gábor Nagy

55
$("#see_comments").click(function () {
    $('<form action="comments.php" method="POST"/>')
        .append($('<input type="hidden" name="aid">').val(imgnum))
        .appendTo($(document.body)) //it has to be added somewhere into the <body>
        .submit();
});

6
Điều này nên được kết hợp thành câu trả lời được chấp nhận. Nếu không có biểu mẫu trong DOM, nó sẽ không gửi trong Firefox và có thể là các trình duyệt khác.
JadedCore

Nó cũng đưa ra lỗi không có mã này trong Edge, giống như "Gửi biểu mẫu bị hủy vì biểu mẫu không được kết nối". Các giải pháp nêu trên hoạt động.
Hoàn tác

10

Mặc dù giải pháp của Doug Neiner không chỉ đúng mà còn là giải pháp được giải thích toàn diện nhất, nhưng nó có một vấn đề lớn: nó dường như chỉ hoạt động trên Chrome.

Tôi loay hoay một lúc để cố gắng xác định cách giải quyết, và sau đó tình cờ gặp câu trả lời thứ hai của nopnop77. Sự khác biệt duy nhất là mã phụ appendTo($(document.body)). Sau đó, tôi thử nghiệm nó trong firefox và nó hoạt động như một sự quyến rũ. Rõ ràng, Firefox và IE cần phải có biểu mẫu tạm thời được đính kèm ở đâu đó trong DOM Body.

Tôi đã phải thực hiện việc triển khai này cho một dự án Symfony2, vì trình tạo đường dẫn bên trong các .twigmẫu sẽ chỉ hoạt động với GETcác tham số và việc gây rối với chuỗi truy vấn đang phá vỡ tính bảo mật của ứng dụng. (BTW, nếu ai biết cách lấy mẫu .twig để gọi các trang có tham số POST, vui lòng cho tôi biết trong phần bình luận).


3
Đây phải là một bình luận, không phải là một câu trả lời, nó chỉ cung cấp thêm thông tin và làm rõ, không phải là một câu trả lời mới được cung cấp.
Leandro

4

tôi nghĩ những gì bạn đang yêu cầu là truy cập vào 'comments.php' và đăng bài aidcó giá trịimgnum . Cách duy nhất để làm điều này là gửi giá trị này với một biểu mẫu.

Tuy nhiên, bạn có thể ẩn biểu mẫu này và gửi biểu mẫu này bằng một cú nhấp chuột tùy ý ở đâu đó bằng jquery.

html cần thiết (đặt ở bất kỳ đâu trên trang):

<form id='see_comments_form' action='comments.php' action='POST'>
    <input id='see_comments_aid' type='hidden' name='aid' value=''>
</form>

js cần thiết:

$("#see_comments").click(function(){
    $('#see_comments_aid').val(imgnum);
    $('#see_comments_form').submit();
);

điều này sẽ chuyển hướng đến 'comments.php' và gửi giá trị thích hợp imgnum (mà tôi cho rằng bạn đang nhận được từ một nơi khác).


-1

Trên thực tế, $.post()gửi một số dữ liệu đến máy chủ. Nó không gây ra bất kỳ chuyển hướng nào trừ khi bạn làm điều đó trong mã phía máy chủ xử lý yêu cầu POST. Tôi có thể đề xuất hai giải pháp:

  1. Để chuyển đến trang nhận xét, thay vì sử dụng bài đăng JQuery, bạn có thể chỉ cần sử dụng thẻ 'neo' - <a href="comments.php?aid=1">Show Comments</a> .
  2. Hoặc nếu bạn muốn xem qua JQuery, bạn có thể sử dụng đoạn mã này: $(location).attr("href", "comments.php?aid=1");

-2

đã không giải quyết chính xác vấn đề. nhưng đã xoay sở để làm việc xung quanh nó. tôi đã phải sửa đổi rất nhiều đối với JS để làm cho nó hoạt động, nhưng vấn đề cốt lõi của câu hỏi này đã được giải quyết bằng cách thực hiện điều này:

    $("#see_comments").attr({href: "comments.php?aid='"+imgnum+"'"});

điều này đã thêm giá trị trợ giúp vào URL như @Doug Neiner ban đầu đề xuất tôi làm. Cảm ơn Doug rất nhiều vì tất cả những nỗ lực. Tôi thực sự đánh giá cao. +1 và chấp nhận câu trả lời của bạn cho nỗ lực.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.