फॉर्म बटन को केवल जावास्क्रिप्ट कैसे बनाते हैं?


9

मैं जावास्क्रिप्ट और Drupal रूपों के साथ प्रयोग कर रहा हूं। वर्तमान में मैं एक मॉड्यूल के प्रशासन के रूप में एक बटन बनाने की कोशिश कर रहा हूं जो चयन सूची में विकल्पों को जोड़ने के लिए जावास्क्रिप्ट का उपयोग करेगा। मेरे द्वारा चलाए जा रहे समस्या यह है कि जब मैं बटन पर क्लिक करता हूं, तो मेरे जावास्क्रिप्ट को कॉल किया जाता है लेकिन पूरे फॉर्म को रिफ्रेश किया जाता है। मैंने फॉर्म एपीआई संदर्भ को देखा है, जिसमें किसी प्रकार की विशेषता है जिसे मैं बटन पर सेट कर सकता हूं इसे रोकने के लिए, लेकिन कुछ भी नहीं मिला। क्या कोई ऐसा तरीका है जिससे मैं पृष्ठ को ताज़ा करने से बटन को रोक सकता हूं या क्या यह एक मृत अंत है?

$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
व्यवहारों की ओर इशारा करने के लिए धन्यवाद, मैं इस समय इसे पढ़ रहा हूं। और किसी कारण से असत्य लौटना मेरे लिए काम नहीं कर रहा है; पृष्ठ अभी भी ताज़ा है = /। अनुवर्ती प्रश्न के लिए, आपको उन उपयोगकर्ताओं को कैसे संभालना चाहिए जो जावास्क्रिप्ट को ब्लॉक / अक्षम करते हैं?
सतरैल

यदि आप बटन को <फॉर्म> </ फॉर्म> टैग के बाहर रखते हैं, तो इसे सबमिट नहीं किया जाएगा, लेकिन यह अनुशंसित नहीं है, इसे करने का अधिक पारंपरिक तरीका जावास्क्रिप्ट के साथ है। यदि आप फॉर्म अभी भी रिफ्रेशिंग चेक कर रहे हैं तो कोई अन्य जावास्क्रिप्ट त्रुटि या कुछ ऐसा प्रदर्शित कर रहा है।
ग्नुगेट

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');

फिर मेरी जावास्क्रिप्ट जिसे बिल्ड फ़ंक्शन द्वारा एक अलग फ़ाइल में लोड किया जाता है, कुछ इस तरह दिखता है:

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

After_build मेरे लिए काम नहीं कर रहा है। यह मुझे एक घातक त्रुटि फेंकता है: अपरिभाषित समारोह में कॉल करें [मॉड्यूल_नाम] _after_build ()। यदि मैं खाली बॉडी के साथ विधि [mod_name] _after_build () को परिभाषित करता हूं, तो फॉर्म रेंडर नहीं करता है। क्या आप इसे उपयोग करने के तरीके के बारे में थोड़ा और स्पष्ट कर सकते हैं?
सुमांचलकी

क्षमा करें, मैंने यह प्रश्न नहीं देखा है ... मुझे लगता है कि आप अपने मॉड्यूल के वास्तविक नाम के साथ [मॉड्यूल_नाम] बदल रहे हैं?
22

$ फॉर्म ['# after_build'] सर्वर साइड (PHP) फ़ंक्शन को जोड़ने के लिए है - यह पोस्ट बिल्ड जावास्क्रिप्ट को निर्दिष्ट करने के लिए नहीं है। api.drupal.org/api/drupal/…
ईसाई

3

आप return falseअपने फ़ंक्शन कॉल के बाद, बटन फ़ॉर्म तत्व की विशेषता पंक्ति के अंदर केवल विवरण जोड़ सकते हैं :

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

मुझे लगता है कि एक बेहतर विकल्प यह है कि सभी इनलाइन ऑनक्लिक ईवेंट में डालने के बजाय एक बाहरी ईवेंट श्रोता को जोड़ा जाए।
क्रिश्चियन

0

आदर्श रूप में, ड्रुपल के अपने AJAX (या AHAH) फॉर्म क्षमताओं में एक रीडिंग है। यहाँ वास्तव में बुनियादी परिचय http://drupal.org/node/752056

अन्यथा, मुझे आश्चर्य है कि यह पृष्ठ को ताज़ा कर रहा है क्योंकि यह केवल एक 'बटन' है जो सबमिट या कुछ भी नहीं है।

क्या इसे झूठी वापस करने के लिए जावास्क्रिप्ट की आवश्यकता होती है, जैसे किसी लिंक पर पेज के शीर्ष पर वापस कूदने से रोकने के लिए?


वास्तव में मैं AJAX का उपयोग करने से बचने की कोशिश कर रहा था क्योंकि मैं जो करने की कोशिश कर रहा हूं वह मुख्य रूप से क्लाइंट-एंड पर है। यह तब तक नहीं है जब तक कि फॉर्म सबमिट न हो जाए कि सर्वर को डेटा की जरूरत है। जहां तक ​​जावास्क्रिप्ट में चीजों को वापस करने की बात है, मैंने बिना किसी अंतर के सही, गलत और अशक्त वापसी की कोशिश की है।
सतरैल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.