Form düğmelerini sadece javascript çağırmak nasıl yapılır?


9

JavaScript ve Drupal formlarını deniyorum. Şu anda bir seçim listesine seçenekler eklemek için JavaScript kullanacak bir modülün yönetim formunda bir düğme yapmaya çalışıyorum. Karşılaştığım sorun, düğmeyi tıkladığımda JavaScript'imin çağrılması ancak tüm formun yenilenmesi. Ben onu durdurmak için düğmeye ayarlayabilirsiniz öznitelik bir tür olduğunu düşündüm Forms API başvuru baktım ama hiçbir şey bulunamadı. Düğmenin sayfayı yenilemesini durdurabileceğim bir yol var mı veya bu bir çıkmaz yol mu?

$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));
  }
}

Son kodum:

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

Yanıtlar:


4

Bunu yapmanın en kolay yolu sadece javascript kodunuzda false döndürmektir:

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;
  }
}

ya da daha iyi bir yol davranışları kullanmaktır:

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

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

1
Beni davranışlara yönlendirdiğin için teşekkürler, şu an bunu okuyorum. Ve bir sebepten dolayı yanlış döndürmek benim için işe yaramıyor; sayfa hala yenileniyor = /. Takip eden bir soru için, javascript'i engelleyen / devre dışı bırakan kullanıcıları nasıl ele almalısınız?
Sathariel

Düğmeyi dışarıda bir <form> </form> etiketine koyarsanız bu gönderilmez ancak bu önerilmez, bunu yapmanın daha geleneksel yolu javascript'tir. Formunuz hala yenileniyorsa, başka bir javascript olup olmadığını kontrol edin.
Gnuget

Drupal.Behaviors kodunu nereye koymalı? javascript dosyasında?


7

aşağıdaki form düğmesi tanımı benim için çalışıyor, #after_build, tıklama işleyicisini ekleyebilecek javascript'e yüklemek için kullanışlıdır.

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

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

Sonra after build işlevi tarafından ayrı bir dosyaya yüklenen benim javascript, şuna benzer:

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

After_build benim için çalışmıyor. Bana Önemli bir hata veriyor: Tanımlanmamış işleve [module_name] _after_build () çağırın. Boş modül ile [module_name] _after_build () yöntemini tanımlarsam, form işlenmez. Nasıl kullanılacağını biraz daha açıklayabilir misiniz?
sumanchalki

Maalesef, bu soruyu görmedim ... [modül_adı] yerine modülünüzün gerçek adını koyduğunuzu varsayıyorum?
Malks

$ form ['# after_build'] bir sunucu tarafı (PHP) işlevi eklemek içindir - post build javascript belirtmek için değildir. api.drupal.org/api/drupal/…
Christian

3

İfadeyi, return falseişlev çağrınızdan sonra, düğme form öğesinin öznitelik satırının içine ekleyebilirsiniz :

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

Bence daha iyi bir seçenek, hepsini satır içi onclick olayına koymak yerine harici bir olay dinleyicisi eklemek.
Christian

0

İdeal olarak, Drupal'ın kendi AJAX (veya AHAH) form yeteneklerini okuyun. Burada gerçekten basit bir giriş http://drupal.org/node/752056

Aksi takdirde, bir gönderme veya herhangi bir şey değil sadece bir 'düğme' olduğu için sayfayı yenilediğine şaşırdım.

Bir bağlantıda olduğu gibi sayfanın üst kısmına geri atlamayı durdurmak için yanlış mı döndürmek için javascript gerekiyor mu?


Aslında AJAX kullanmaktan kaçınmaya çalışıyordum, çünkü yapmaya çalıştığım şey genellikle müşteri tarafında. Form gönderilinceye kadar sunucunun verilere ihtiyacı yoktur. JavaScript'te bir şeyler döndürdüğüm kadarıyla, hiçbir fark olmadan doğru, yanlış ve null döndürmeyi denedim.
Sathariel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.