วิธีการกระตุ้นให้เกิดการคลิกบนปุ่มส่งแบบฟอร์มที่เปิดใช้งาน AJAX โดยทางโปรแกรม


25

ฉันพยายามเขียนโปรแกรม (ด้วย jQuery) เรียกใช้การคลิกบนปุ่มที่มีพฤติกรรม AJAX ในรูปแบบ Drupal แต่จนถึงขณะjQuery('#edit-submit').click()นี้ไม่ได้ทำอะไรเลย

การคลิกเมาส์จริงบนปุ่มนั้นจะทำงานตามที่ต้องการ ความคิดใด ๆ ที่จะทำให้มันทำงานอย่างไร


หากเป็นปุ่ม # edit-submit คุณจะไม่เพียงแค่ทำ $ ('ฟอร์ม') ส่ง ()?
— cam8001

ที่ไม่ทำงานสำหรับฉันอย่างใดอย่างหนึ่ง มันโพสต์แบบฟอร์มในลักษณะที่ไม่ใช่ AJAX หรือไม่ทำอะไรเลยขึ้นอยู่กับการตั้งค่าบางอย่างในตัวสร้างแบบฟอร์ม
— Daniel

คำตอบ:


40

jQuery('#edit-submit').mousedown() - เห็นได้ชัดว่ามีความแตกต่างใหญ่


3
ไม่ได้ผลสำหรับฉัน
— ram4nd

วิธีนี้ใช้ได้ผลสำหรับฉัน การคลิกที่ปุ่มดำเนินการโทร ajax แต่ .click () หรือรูปแบบต่างๆไม่ได้อย่างไรก็ตาม .mousedown () ทำงานได้อย่างสมบูรณ์
— Eric Goodwin

ฉันจะหลีกเลี่ยงการใช้ตัวเลือก ID ในองค์ประกอบของแบบฟอร์ม หากฟอร์มถูกสร้างใหม่ในระหว่างการโทรกลับ AJAX รหัสขององค์ประกอบทั้งหมดจะเปลี่ยนไปและตัวเลือก jQuery ของคุณจะไม่ทำงานอีกต่อไป
— Yuriy Babenko

สิ่งที่ Eric พูด ฉันต้องการทราบว่าทำไมถึงมีความแตกต่าง ... อย่างจริงจังนี่ดูเหมือนจะไม่สมเหตุสมผล
— Johnathan Elmore

@JohnathanElmore mousedown()เป็นเพียง "ส่วนแรก" ของclick()เหตุการณ์ซึ่งจะสมบูรณ์เมื่อmouseup()เกิดขึ้น เมื่อคุณคลิกที่ลิงก์จากนั้นคุณปล่อยเมาส์ออกไปนอกพื้นที่ของลิงก์สิ่งที่click()มักจะไม่ได้ถูกเรียกใช้และลิงก์จะไม่ถูกติดตาม อาจจะมีสายเรียกอาแจ็กซ์จะช่วยป้องกันmouseup()การถูกไล่ออก แต่นี้เป็นเพียงการคาดเดา ...
— pamatt

7

ที่จริงแล้วไม่จำเป็นต้องเดา

คุณควรใช้พฤติกรรมของ Drupal

Drupal.behaviors.yourFunctionName = {
    attach:function (context, settings) {

       // Your code goes here....

    }
}

สิ่งนี้จะทำให้คุณสามารถเข้าถึงคุณสมบัติ ajax ของการตั้งค่า

Drupal.behaviors.yourFunctionName = {
    attach:function (context, settings) {

       console.log(settings.ajax);

    }
}

ขึ้นอยู่กับการกำหนดค่าของคุณคุณจะเห็นรายการองค์ประกอบที่มีการทริกเกอร์ด้วยคุณสมบัติต่าง ๆ เช่นชื่อของฟังก์ชั่นการโทรกลับ id ของตัวเลือกเช่นเดียวกับชื่อของเหตุการณ์ทริกเกอร์

จากนั้นคุณสามารถใช้ข้อมูลที่เกี่ยวข้องเพื่อเริ่มกิจกรรมของคุณ

// $(selector).trigger(eventName);
// for example...
$('#edit-product-id-15', context ).trigger('change');

2
ฉันชอบคำตอบนี้เพราะมันมีเทคนิคที่น่าสนใจในการค้นหาวิธีการเชื่อมต่อกับองค์ประกอบที่สร้างขึ้นสำหรับนักพัฒนาส่วนหน้าที่ไม่ใช่ Drupal ที่อาจทำงานกับโครงการ Drupal +1
— Lester Peabody

6

สร้าง ajax submit เหมือนดังต่อไปนี้

 $form['button'] = array(
    '#type' => 'button',
    '#value' => 'Click',
    '#ajax' => array(
      'callback' => '_kf_reading_user_points',
      'wrapper' => 'reading-user-points',
      'method' => 'replace',
      'event' => 'click',
    ),
  );

function _kf_reading_user_points(&$form, &$form_state) {
  // Something within the callback function.
}

จากนั้นเหตุการณ์ jquery .click () จะทำงานในรูปแบบ drupal ajax


คุณสามารถโพสต์ฟังก์ชั่นการโทรกลับตัวอย่างเช่นกันเมื่อฉันพยายามมันจะไม่ไปฟังก์ชั่นการโทรกลับ
— Crazyrubixfan

1
เพิ่มฟังก์ชั่นการโทรกลับ :)
— Leopathu


3

ในกรณีของฉันการแก้ปัญหาที่แนะนำข้างต้นไม่ได้ผลสำหรับฉัน แต่การกล่าวถึง. mousedown () ทำให้เกิดแนวคิดต่อไปนี้ที่เหมาะกับฉัน (Drupal 7):

$('#custom-submit-button').click(function() {
  $('#ajax-submit-button').trigger('mousedown');
});

มีข้อมูลพื้นฐานที่เป็นประโยชน์เกี่ยวกับ "สาเหตุ" ในกรณีนี้ในการอ้างอิงแบบฟอร์ม API ภายใต้#ajax_prevent


ฉันไม่ต้องการตัวห่อคลิก () แต่ลิงก์ไปยังการป้องกัน Ajax นั้นเป็นกุญแจสำคัญ!
— Ryan Hartman

2

ดูที่โมดูลตัวกรองการเปิดเผยที่ดีกว่าพวกเขาส่งแบบฟอร์ม AJAX โดยค้นหา $ (. ctools-auto-submit-click ') และเปิดการคลิก

<?php
// ... near line 190 of better_exposed_filters.js

// Click the auto submit button.
$(this).parents('form').find('.ctools-auto-submit-click').click();
?>

เหตุการณ์คลิกทำงานได้สำหรับฉันในขณะที่เหตุการณ์ mousedown ไม่ได้
— aross

0

คุณต้องทริกเกอร์submitเหตุการณ์ในแบบฟอร์ม Clickและmousedownกิจกรรมบนปุ่มไม่ทำงาน


นั่นคือสิ่งที่ฉันพยายามในตอนแรกและดูเหมือนว่าจะทำงานไม่ถูกต้อง ฉันมาถึงที่นี่ได้อย่างไร
— aross
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.