ফর্ম বোতাম কীভাবে কেবল জাভাস্ক্রিপ্ট কল করবেন?


9

আমি জাভাস্ক্রিপ্ট এবং ড্রুপাল ফর্ম নিয়ে পরীক্ষা করছি। বর্তমানে আমি প্রশাসনের আকারে একটি মডিউলের একটি বোতাম তৈরি করার চেষ্টা করছি যা একটি নির্বাচিত তালিকার বিকল্পগুলিকে যুক্ত করতে জাভাস্ক্রিপ্ট ব্যবহার করবে। আমি যে সমস্যাটি চালাচ্ছি তা হ'ল আমি যখন বোতামটি ক্লিক করি তখন আমার জাভাস্ক্রিপ্ট কল হয়ে যায় তবে পুরো ফর্মটি রিফ্রেশ হয়। আমি ফর্মগুলির এপিআই রেফারেন্সটি দেখে ভেবেছিলাম যে এটিকে বন্ধ করার জন্য আমি বোতামটিতে সেট করতে পারি এমন কোনও বৈশিষ্ট্য ছিল তবে কিছুই পাওয়া যায় নি। পৃষ্ঠাটি রিফ্রেশ করা থেকে বোতামটি থামাতে কোনও উপায় আছে বা এটিই একটি শেষ অবধি?

$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
আমাকে আচরণের দিকে ইশারা করার জন্য ধন্যবাদ, আমি এখন এটি বাস্তবতার সাথে পড়ছি। এবং কোনও কারণে মিথ্যা ফিরিয়ে দেওয়া আমার পক্ষে কাজ করে না; পৃষ্ঠাটি এখনও রিফ্রেশ করছে = /। ফলোআপ প্রশ্নের জন্য, জাভাস্ক্রিপ্টটি নিষ্ক্রিয় / অক্ষম করা ব্যবহারকারীদের কীভাবে আপনার পরিচালনা করা উচিত?
সাথারিয়েল

যদি আপনি <for> </for> ট্যাগের বাইরে বোতামটি রেখে দেন তবে এটি জমা দেওয়া হবে না তবে এটি প্রস্তাবিত নয়, এটি করার আরও প্রচলিত উপায় জাভাস্ক্রিপ্ট সহ। যদি আপনি ফর্ম করেন তবে এখনও অন্য কোনও জাভাস্ক্রিপ্ট ত্রুটি বা এর মতো কিছু প্রদর্শন করছে কিনা তা যাচাই করে দেখুন।
Gnuget

দ্রুপাল.বিহাইওয়ের কোড কোথায় রাখবেন? জাভাস্ক্রিপ্ট ফাইল?

হ্যাঁ, এটি একবার দেখুন: 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 () এ কল করুন। আমি যদি [মডিউল_নাম] _ডি_বিল্ড () খালি শরীরের সাথে পদ্ধতিটি সংজ্ঞায়িত করি তবে ফর্ম রেন্ডার হয় না। কীভাবে এটি ব্যবহার করবেন আপনি আরও কিছুটা পরিষ্কার করতে পারেন?
সুমনচালকি

দুঃখিত, আমি এই প্রশ্নটি দেখিনি ... আমি ধরে নিয়েছি আপনি [মডিউল_নাম] আপনার মডিউলটির প্রকৃত নাম দিয়ে প্রতিস্থাপন করছেন?
21:58

$ ফর্ম ['# after_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",
),

আমি মনে করি এর চেয়ে ভাল বিকল্প হ'ল এটিকে সমস্ত ইনলাইন অনক্লিক ইভেন্টে না রেখে বাইরের ইভেন্ট শ্রোতাদের যুক্ত করা।
খ্রিস্টান

0

আদর্শভাবে, দ্রুপালের নিজস্ব এজেএক্স (বা এএএএএচএইচ) ফর্মের ক্ষমতাগুলি পড়ুন। সত্যিই এখানে বেসিক পরিচিতি http://drupal.org/node/752056

অন্যথায়, আমি অবাক হয়েছি এটি পৃষ্ঠাটিকে রিফ্রেশ করছে কারণ এটি কেবল একটি 'বোতাম' জমা বা কিছুই নয়।

পৃষ্ঠার শীর্ষে ফিরে ঝাঁপানো থামানোর জন্য কোনও লিঙ্কের মতো মিথ্যা ফিরতে জাভাস্ক্রিপ্টের দরকার আছে কি?


আসলে আমি এজ্যাক্স এড়ানোর চেষ্টা করছিলাম যেহেতু আমি যা করার চেষ্টা করছি তা মূলত ক্লায়েন্ট-এন্ডে। এটি ফর্মটি জমা না দেওয়া পর্যন্ত নয় যে সার্ভারের ডেটার প্রয়োজন। জাভাস্ক্রিপ্টে জিনিস ফিরিয়ে দেওয়া পর্যন্ত, আমি সত্য, মিথ্যা এবং কোনও পার্থক্য ছাড়াই নালার চেষ্টা করেছি।
সাথারিয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.