วิธีสร้างปุ่มแบบฟอร์มเรียกว่าจาวาสคริปต์เท่านั้น?


9

ฉันกำลังทดลองกับ JavaScript และฟอร์ม Drupal ขณะนี้ฉันกำลังพยายามสร้างปุ่มในรูปแบบการบริหารของโมดูลที่จะใช้ JavaScript เพื่อผนวกตัวเลือกในรายการที่เลือก ปัญหาที่ฉันพบคือเมื่อฉันคลิกปุ่ม JavaScript ของฉันถูกเรียกใช้ แต่การรีเฟรชฟอร์มทั้งหมด ฉันดูที่การอ้างอิง Forms API คิดว่ามีคุณลักษณะบางอย่างที่ฉันสามารถตั้งค่าบนปุ่มเพื่อหยุดการทำงาน แต่ไม่พบสิ่งใด มีวิธีใดที่ฉันสามารถหยุดปุ่มไม่ให้รีเฟรชหน้าเว็บหรือนี่เป็นจุดสิ้นสุดหรือไม่

$form['#attached']['js'] = array(
  drupal_get_path('module', 'test').'/js/test.js',
);

$form['list'] = array(
  '#type' => 'select',
  '#options' => array(),
  '#attributes' => array(
    'name' => 'sellist',
  ),
  '#size' => 4,
);

$form['add_button'] = array(
  '#type' => 'button',
  '#value' => 'Add',
  '#attributes' => array(
    'onclick' => "add_to_list(this.form.sellist, 'Append' + this.form.sellist.length);",
  ),
);

//JavaScript
function add_to_list(list, text) {
  try {
    list.add(new Option(text, list.length), null) //add new option to end of "sample"
  }
  catch(e) {
    list.add(new Option(text, list.length));
  }
}

รหัสสุดท้ายของฉัน:

<?php
function jstest_menu() {
  $items['admin/config/content/jstest'] = array(
    'title' => 'JavaScript Test',
      'description' => 'Configuration for Administration Test',
      'page callback' => 'drupal_get_form',
      'page arguments' => array('_jstest_form'),
      'access arguments' => array('access administration pages'),
      'type' => MENU_NORMAL_ITEM,
  );

  return $items;
}

function _jstest_form($form, &$form_state) {
  $form['list'] = array(
    '#type' => 'select',
    '#options' => array(),
    '#size' => 4,
  );

  $form['text'] = array(
    '#type' => 'textfield',
  );

  $form['add_button'] = array (
    '#type' => 'button',
    '#value' => t("Add"),
    '#after_build' => array('_jstest_after_build'),
  );
  return $form;
}

function _jstest_after_build($form, &$form_state) {
  drupal_add_js(drupal_get_path('module', 'jstest').'/js/jstest.js');
  return $form;
}

JavaScript
(function ($) {
  Drupal.behaviors.snmpModule = {
    attach: function (context, settings) {
      $('#edit-add-button', context).click(function () {
        var list = document.getElementById('edit-list');
        var text = document.getElementById('edit-text');

        if (text.value != '')
        {
          try {
            list.add(new Option(text.value, list.length), null);
          }
          catch(e) {
            list.add(new Option(text.value, list.length));
          }

          text.value = '';
        }

        return false;
      });
      $('#edit-list', context).click(function () {
        var list = document.getElementById('edit-list');

        if (list.selectedIndex != -1)
          list.remove(list.selectedIndex);

        return false;
      });
    }
  };
}(jQuery));

คำตอบ:


4

วิธีที่ง่ายที่สุดที่จะทำให้สำเร็จคือการคืนค่าเท็จในจาวาสคริปต์ของคุณ:

function add_to_list(list, text) {
  try {
    list.add(new Option(text, list.length), null);
    return false;
  } catch(e) {
    list.add(new Option(text, list.length));   
    return false;
  }
}

หรือวิธีที่ดีกว่าคือการใช้พฤติกรรม:

Drupal.behaviors.some_action = function(context) {
  $('#id-button:not(.button-processed)',context)
  .addClass('button-processed').each(function() {

    //whatever you want here
    return false;
  });
}

1
ขอบคุณที่ชี้นำฉันไปสู่พฤติกรรมฉันกำลังอ่านมันตอนนี้ตามความเป็นจริง และด้วยเหตุผลบางอย่างที่ส่งคืนเท็จไม่ได้ผลสำหรับฉัน หน้าเว็บยังคงรีเฟรช = / สำหรับคำถามติดตามคุณควรจัดการกับผู้ใช้ที่บล็อก / ปิดการใช้งานจาวาสคริปต์อย่างไร
Sathariel

หากคุณวางปุ่มไว้ด้านนอกไปยังแท็ก <form> </form> สิ่งนี้จะไม่ถูกส่ง แต่ไม่แนะนำให้ใช้วิธีการทั่วไปที่มากขึ้นคือการใช้จาวาสคริปต์ หากคุณยังคงตรวจสอบการรีเฟรชหากมีจาวาสคริปต์อื่นแสดงข้อผิดพลาดหรืออะไรทำนองนั้น
Gnuget

จะใส่รหัส Drupal.Behaviors ได้ที่ไหน ในไฟล์จาวาสคริปต์หรือไม่

ใช่ลองดูสิ่งนี้: amazeelabs.com/en/blog/drupal-behaviors-quick-how
Gnuget

7

นิยามปุ่มแบบฟอร์มด้านล่างใช้งานได้สำหรับฉัน #after_build มีประโยชน์สำหรับการโหลดในจาวาสคริปต์ที่สามารถแนบตัวจัดการการคลิก

$form['add_button'] = array (
  '#type' => 'button',
  '#attributes' => array('onclick' => 'return (false);'),
  '#value' => t("Add"),
);

$form['#after_build'] = array('[module_name]_after_build');

จากนั้นจาวาสคริปต์ของฉันที่โหลดในไฟล์แยกต่างหากโดยฟังก์ชั่น after build ดูเหมือนว่า:

Drupal.behaviors.[module_name] = function(context) {
  $('#edit-add-button').click(function() {
   ...Do something here
  });
};

After_build ไม่ทำงานสำหรับฉัน มันทำให้ฉันเกิดข้อผิดพลาดร้ายแรง: โทรไปยังฟังก์ชันที่ไม่ได้กำหนด [module_name] _after_build () ถ้าฉันกำหนดวิธีการ [module_name] _after_build () ด้วยเนื้อหาที่ว่างเปล่าแบบฟอร์มจะไม่แสดงผล คุณช่วยอธิบายวิธีการใช้งานให้มากขึ้นได้ไหม?
sumanchalki

ขออภัยฉันไม่เห็นคำถามนี้ ... ฉันคิดว่าคุณกำลังแทนที่ [module_name] ด้วยชื่อจริงของโมดูลของคุณหรือไม่
Malks

$ form ['# after_build'] ใช้สำหรับเพิ่มฟังก์ชั่นฝั่งเซิร์ฟเวอร์ (PHP) - ไม่ใช่เพื่อระบุจาวาสคริปต์ post build api.drupal.org/api/drupal/ …
นับถือศาสนาคริสต์

3

คุณสามารถเพิ่มreturn falseคำสั่งหลังการเรียกใช้ฟังก์ชันของคุณภายในบรรทัดคุณลักษณะขององค์ประกอบแบบฟอร์มปุ่ม:

'#attributes' => array(
   'onclick' => "add_to_list(this.form.sellist, 'Append' + this.form.sellist.length); return false",
),

ฉันคิดว่าตัวเลือกที่ดีกว่าคือการเพิ่มผู้ฟังเหตุการณ์ภายนอกแทนที่จะใส่ทุกอย่างไว้ในเหตุการณ์ onclick แบบอินไลน์
คริสเตียน

0

เป็นการดีที่ได้อ่านความสามารถในรูปแบบ AJAX (หรือ AHAH) ของ Drupal คำแนะนำพื้นฐานจริงๆที่นี่ http://drupal.org/node/752056

มิฉะนั้นฉันก็ประหลาดใจที่มันกำลังรีเฟรชหน้าเว็บเพราะมันเป็นเพียงปุ่ม 'ไม่ใช่การส่งหรืออะไรก็ตาม

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


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