2010-12-17 5 views
4

간단한 질문처럼 들립니다.이중 제출을 방지하기 위해 클릭 할 때 Drupal 양식 제출 단추를 사용 불가능하게 할 수 있습니까?

$("#edit-save").click(function(event) { 
    $(this).attr("disabled", "true"); 
}); 

그러나이 작업이 완료되면 내 양식 제출 처리기가 호출되지 않습니다.

사용자 정의 hook_menu에 정의 된 내 자신의 경로 형태 : 양식에서

$items['my_form'] = array(
    'title' => 'My form', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('mymod_myform'), 
    'type' => MENU_CALLBACK, 
); 

, 나는 버튼을 입력하고 버튼 취소가 :

$form['cancel'] = array(
    '#type' => 'submit', 
    '#value' => t('Cancel'), 
); 

$form['save'] = array(
    '#type' => 'submit', 
    '#value' => t('Save'), 
); 

나는 내 자신을 정의 제출 핸들러 :

$form['#submit'][] = 'mymod_myform_submit'; 

나는 냄새에 drupal_get_form() 함수에서 추적 코드의 비트를 넣었습니다 양식을 제출할 때 $ _POST 변수 JQuery와 마법을 사용할 때, $ _POST 변수는 "OP"매개 변수를 포함

Array 
    (
    [op] = Save 
    [form_build_id] => form-6e74c87390e3fc48d0bebd2f5193315b 
    [form_token] => 33db6e34c0350e33c48861a63a38d45f 
    [form_id] => dh_seo_workload_item_form 
) 

을하지만 난하지 않으려면 jQuery를 마법을 사용하는 경우는 클릭 됐어요 후 조건 "OP"매개 변수가 더 이상 버튼을 제출하지 $ _POST 배열에 포함되어 있으므로 Drupal은 양식이 제출되지 않았다고 생각합니다.

나는이 질문을 Prevent double submission of forms in jQuery에 보았지만 이것이 정말로 해키 한 수정처럼 보인다고 우려하고 있으며 더 좋은 방법이 있어야합니다.

+0

나도 덜 해킹 된 해결책으로 링크 된 질문에 대한 답변을 추가했습니다. –

+0

클릭시 버튼이 비활성화되어 가능하지 않을 수 있습니다. 아래의 내 솔루션은이 문제를 해결하기 위해 1ms에서 setTimeout을 사용합니다. – Nick

답변

1

버튼의 클릭 이벤트에 바인딩한다는 사실은 클릭 이벤트가 양식에 거품을 일으키고 제출을 유발하기 전에 버튼이 비활성화됨을 의미한다고 생각합니다.

Google 팀은 제출 버튼을 사용 중지하면 거의 항상 Internet Explorer에 문제가 발생한다는 사실을 발견했습니다. 우리는이 문제를 해결할 수있는 작은 플러그인을 만들었습니다. 여기에 코드를 참조하십시오 https://stackoverflow.com/a/4473801/4376

+0

해결책 주셔서 감사합니다. 라이브가 더 이상 사용되지 않으므로 live 대신 bind를 사용하는 것이 좋습니다. – Roger

+0

@Roger - 실제로'on()'은 업데이트 된 버전입니다. 'bind'도 역시 사용되지 않으며'live' 나'on'과 달리 호출 할 때 페이지의 요소들에 대해서만 작동합니다. 그에 따라 수정 됨. –

+0

아, 알겠습니다. 네이슨 감사합니다! – Roger

0

을 나는 오늘 오후에 이런 식으로 고정 아웃 문제와 함께 제출 양식에 정보를 얻을 수있었습니다 다음에 한 줄 추가로,

$("#id_of_button").click(function() { 
    var submit = $(this); 
    setTimeout(function(){ 
    submit.attr('disabled','disabled') 
    },1); 
}); 
2

또는 당신은이 작업을 수행 할 수 있습니다 PHP 폼 배열 수준 ...

$form['submit'] = array(
    '#type' => 'submit', 
    '#value' => t('Save'), 
    '#attributes' => array(
    'onclick' => 'javascript:var s=this;setTimeout(function(){s.value="Saving...";s.disabled=true;},1);', 
), 
); 
0

제출 버튼 (display:none)을 숨기고 이미 비활성화 된 다른 버튼을 표시하십시오. 나는이 문제에 대한 해결책의 나머지 부분보다 덜 해킹 같다고 생각한다. 나는 보통 내 페이지에 2 개의 버튼을 가지고 있는데, 하나는 보이고 다른 하나는 onClick이고, onClick은 그냥 스위치를 켠다.

비활성화 된 단추가 포스트 백을 트리거하지 않기 때문에 문제가 발생합니다.

관련 문제