Làm cách nào tôi có thể chạy AJAX trên một sự kiện nhấn nút?


7

Cập nhật: Tôi đã quản lý để AJAX hoạt động, nhưng không phải trong sự kiện nhấp chuột. Tôi đã cập nhật câu hỏi để phù hợp với điều này.

Tôi đang thử một số mã tôi tìm thấy trên trang: 'AJAX in Plugins' .

Tuy nhiên tôi không thể làm cho nó hoạt động được và tôi thực sự không biết bắt đầu tìm kiếm ở đâu. Nó hoạt động khi tôi loại bỏ chức năng nhấp và chỉ chạy mã trên pageload.

Tôi có một tệp Javascript trông ike này:

jQuery(document).ready(function(){
    jQuery("#createremotesafe").click(function(){
        alert ('test');
        var data = {
            action: 'my_action',
            whatever: 1234
        };

        // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php

        jQuery.post(ajaxurl, data, function(response) {
            alert('Got this from the server: ' + response);
        });
    });    
});

và ở đâu đó trong tập lệnh PHP của tôi tạo nút nên thực thi Javascript (tức là trang quản trị) và cả phần còn lại của trang:

add_action('wp_ajax_my_action', 'my_action_callback');
echo 'test2';
function my_action_callback() {
  global $wpdb; // this is how you get access to the database
  $whatever = $_POST['whatever'];
  $whatever += 10;
  echo $whatever;
  die(); // this is required to return a proper result
}

Tôi nhận được cả Alert ('test')echo 'test2', nhưng không có cảnh báo phản hồi. Không có lỗi Javascript hay bất cứ điều gì. Mã của tôi chắc chắn đang chạy, vì tôi có thể thấy cả hai 'thử nghiệm', nhưng tại sao AJAX không nhận được bất kỳ phản hồi nào? Hàm php của tôi có biến mất sau khi tải trang không? Có lẽ tôi không thể / không nên sử dụng các hàm AJAX tích hợp trong wp?

Nó cũng không hiển thị một hộp cảnh báo trống, chỉ là không có gì xảy ra.


Hai điều: 1) Được ajaxurlđịnh nghĩa và đúng? 2) Bạn đang thấy điều echo 'test2'gì xảy ra?
Ryan Kinal

1) có (tôi đã kiểm tra), 2) trước bất kỳ nội dung nào của trang quản trị, ngay trên đầu trang.
joon

2
Bạn đang trộn các vars jQuery, bạn nên sử dụng trình bao bọc không xung đột ..
Mark Duncan

Mark, cảm ơn, tôi đã không biết về điều này. Tuy nhiên điều này không thay đổi nhiều, kết quả vẫn như vậy
joon

Trả lời thêm, xin vui lòng bình luận liên quan đến câu hỏi tôi nêu trong câu trả lời của tôi.
t31os

Câu trả lời:


10

Bắt đầu từ một cơ sở mã làm việc ..

add_action('in_admin_header', 'my_ajax_button');

function my_ajax_button() {
    echo '<a href="#ajaxthing" class="myajax">Test</a>';
}

add_action('admin_head', 'my_action_javascript');

function my_action_javascript() {
?>
<script type="text/javascript" >
jQuery(document).ready(function($) {

    $('.myajax').click(function(){
        var data = {
            action: 'my_action',
            whatever: 1234
        };

        // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
        $.post(ajaxurl, data, function(response) {
            alert('Got this from the server: ' + response);
        });
    });


});
</script>
<?php
}

add_action('wp_ajax_my_action', 'my_action_callback');

function my_action_callback() {
     global $wpdb; // this is how you get access to the database

     $whatever = $_POST['whatever'];

     $whatever += 10;

             echo $whatever;

     exit(); // this is required to return a proper result & exit is faster than die();
}

Đó là mã (với một điều chỉnh nhỏ) từ trang codex và điều đó hoàn toàn tốt đối với tôi, vì vậy tôi khuyên bạn nên sử dụng nó làm điểm bắt đầu .. nếu đó là những gì ban đầu bạn đã làm, tại thời điểm nào thì nó bị hỏng hoặc ngừng hoạt động ?

LƯU Ý: Đánh dấu là tôi, tôi sử dụng tài khoản phụ khi truy cập trang web từ một PC khác (không phải của tôi).


nó hoạt động cho đến khi tôi cố gắng thêm Javascript vào một sự kiện nút bấm chứ không phải tải trang. Mã được chạy, bởi vì tôi nhận được cảnh báo, nhưng hàm Ajax có thể biến mất sau khi tải trang.
joon

Bạn đã trộn các vars trước đó, nó hoạt động tốt với chức năng nhấp chuột, xem mã cập nhật của tôi ở trên (mẫu làm việc).
t31os

Có vẻ như tôi đã bỏ lỡ một số mã trong ví dụ cập nhật, nó bị thiếu add_action( 'in_admin_header', 'my_ajax_button' );ở đầu mã, fyi.
Đánh dấu Duncan

Tôi đã làm cho nó hoạt động bằng cách làm theo lời khuyên của bạn, cảm ơn. Mặc dù thật lạ khi tôi nhận được cả hai tin nhắn 'thử nghiệm' của mình và mã không hoạt động, vì tôi thực sự không thể tưởng tượng được mình đang làm gì khác.
joon

Giống như đã nói ban đầu, tôi nghĩ rằng đó chỉ là một trường hợp trộn các vars jQuery, bạn sẽ ổn khi sử dụng cách tiếp cận không xung đột mà tôi đã đăng ở trên (mọi thứ bên trong chức năng sẵn sàng tài liệu đó đều có thể sử dụng một cách an toàn $). Rất vui vì đã giúp đỡ ..;)
t31os
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.