양식 버튼을 자바 스크립트로만 호출하는 방법은 무엇입니까?


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

이것을 달성하는 가장 쉬운 방법은 자바 스크립트 코드에서 false를 반환하는 것입니다.

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> 태그 외부에두면 제출되지 않지만 권장되지는 않지만 더 일반적인 방법은 javascript를 사용하는 것입니다. 양식이 여전히 새로 고침 인 경우 다른 자바 스크립트가 오류 또는 이와 유사한 것을 표시하는지 확인하십시오.
너겟

Drupal.Behaviors 코드를 어디에 두어야합니까? 자바 스크립트 파일에서?


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) 기능을 추가하기위한 것입니다. 빌드 후 자바 스크립트를 지정하기위한 것이 아닙니다. api.drupal.org/api/drupal/…
Christian

3

return false버튼 양식 요소의 속성 줄 안에 함수 호출 후 명령문을 추가 할 수 있습니다 .

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

더 나은 옵션은 인라인 onclick 이벤트에 모두 넣지 않고 외부 이벤트 리스너를 추가하는 것입니다.
Christian

0

이상적으로 Drupal의 자체 AJAX (또는 AHAH) 양식 기능을 읽어보십시오. 정말 기본적인 소개는 여기 http://drupal.org/node/752056

그렇지 않으면 제출이나 다른 것이 아닌 '버튼'이므로 페이지를 새로 고치는 것이 놀랍습니다.

링크가 페이지 맨 위로 이동하는 것을 막는 것처럼 자바 스크립트가 false를 반환해야합니까?


실제로 나는 AJAX를 사용하지 않으려 고 노력했다. 왜냐하면 내가하려는 것은 주로 클라이언트쪽에 있기 때문이다. 서버에 데이터가 필요하다는 양식이 제출 될 때까지는 없습니다. JavaScript로 물건을 반환하는 한, 아무런 차이없이 true, false 및 null을 반환하려고 시도했습니다.
Sathariel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.