2013-07-26 6 views
0

이것은 이전에 질문되었던 문제 (Modal windows and binding/unbinding)의 버전입니다.페이드에서 모달 바인딩 해제

양식이 있고 "새로 추가"를 선택하면 텍스트를 필드에 입력하여 드롭 다운에 추가 할 수있는 모달 창이 나타납니다. 이것은 8 개 또는 9 개의 필드에 대해 발생할 수 있습니다. 버그는 사용자가 "X"를 클릭하거나 상자 주위의 어두운 공간을 클릭하여 모달을 해제 한 다음 "새로 추가"를 다시 선택하고 "추가"버튼을 클릭하면 모달이 여전히 이벤트에 바인딩됩니다 (나는 짐작한다) 그래서 두 배 항목이 있고 모달은 결코 해산되지 않으며 사람은 페이지를 새로 고침하고 다시 시작해야한다.

그래서 "X"를 사용하거나 상자 외부를 클릭하여 모달을 해제 할 때 모달을 바인딩 해제하려면 어떻게해야합니까? 저는 태양 아래에서 생각할 수있는 모든 것을 시도했습니다 (몇 가지 예가 아래에 설명되어 있습니다). 여기에 제안 된대로 클릭 해제를 시도했지만 Why does jQuery ajax post twice here?, 작동하지 않거나 올바르게 구현하는 방법을 모르겠습니다. 이 시간이 좀있어. 이견있는 사람?

<div class="container"> 
<div class="row"> 
    <div class="span12"> 

     <h3>Upload your experimental data</h3> 
     <form class="form-horizontal well" action="<?php echo site_url(); ?>main/upload_data" method="post" enctype="multipart/form-data" id="upload_form"> 

       <fieldset> 
        <legend>Animal Info</legend> 

        <!-- Animal Species --> 
        <div class="control-group <?php if (form_error('animal_species')) { echo 'error'; } ?>"> 
         <label class="control-label">Species</label>    
         <div class="controls"> 

          <?php 

          # Add "Add New" 
          $options = $species + array('addnew' => 'Add New'); 
          //var_dump($options); 
          echo form_dropdown('animal_species', $options 
               , set_value('animal_species', (isset($my_data->animal_species)) ? $my_data->animal_species: '') 
               , 'id = "animal_species"' 
               , 'class="animal_species"', 'addnew' 
               ); 
          echo form_error('animal_species', '<span class="help-inline">', '</span>');         
          # var_dump($options); 

          //unset($species[0]); // remove first (blank) element 
          //$options_keys = $species; 
          //var_dump($options_keys); 

          ?> 

         </div> 
        </div>        


        <!-- Animal Condition --> 
        <div class="control-group <?php if (form_error('animal_condition')) { echo 'error'; } ?>"> 
         <label class="control-label">Animal Condition</label>    
         <div class="controls"> 

          <?php 
          # Add "Add New" 
          $options = $condition + array('addnew' => 'Add New'); 
          //var_dump($options); 
          echo form_dropdown('animal_condition', $options 
               , set_value('animal_condition', (isset($my_data->animal_condition)) ? $my_data->animal_condition: '') 
               , 'id = "animal_condition"' 
               , 'class="animal_condition"', 'addnew' 
               ); 
          echo form_error('animal_condition', '<span class="help-inline">', '</span>');         
          ?> 

         </div> 
        </div>        

        <!-- Brain Area --> 
        <div class="control-group <?php if (form_error('brain_area')) { echo 'error'; } ?>"> 
         <label class="control-label">Brain Region</label>    
         <div class="controls"> 

          <?php 
          # Add "Add New" 
          $options = $area + array('addnew' => 'Add New'); 
          //var_dump($options); 
          echo form_dropdown('brain_area', $options 
               , set_value('brain_area', (isset($my_data->brain_area)) ? $my_data->brain_area: '') 
               , 'id = "brain_area"' 
               , 'class="brain_area"', 'addnew' 
               ); 
          echo form_error('brain_area', '<span class="help-inline">', '</span>');         
          ?> 

         </div> 
        </div>        

       </fieldset> 

       <!-- submit --> 
       <div class="form-actions"> 
        <button type="submit" class="btn btn-primary">Upload &raquo;</button> 
       </div> 
     </form> 
    </div> 
    </div><!-- end row --> 

    <script type="text/javascript"> 

    var Classofentry = ''; 

     $('#upload_form option[value="addnew"]').click(function(event){ 

      var Classofentry = $(this).attr("class"); 

      $('#add-new-text').val(''); // Set input text field to blank 

      // Show modal window 
      $('#add-new').modal('show'); 

      $('#add-new-submit').click(function(){ 

       var value = $('#add-new-text').val(); 

       $.ajax({ 
        type: "POST", 
        url: "<?php echo site_url(); ?>main/change_options", 
        data: {new_option: value, new_option_class: Classofentry}, 
        //dataType: "html", 
        dataType: "json", 
        error: errorHandler, 
        success: success 
        }); 

       function success(data) 
       { 
        if (data[1]) 
        { 
        // Add new entry 
        $('#'+Classofentry).append("<option value='" + data[0] + "'selected=\"selected\">" + data[0] + "</option>"); 
        //alert(data[1]); 
        } 
        else 
        { 
        // Select the nonunique value by emptying it and appending 
        $('#'+Classofentry).empty("<option value=''selected=\"selected\">" + data[0] + "</option>").append("<option value='" + data[0] + "'selected=\"selected\">" + data[0] + "</option>");               
        //alert(data[0]);        
        } 

       } 

       function errorHandler() 
       { 
        //alert('Error with AJAX!'); 
        alert(data[0]); 
       } 

       $('#add-new-submit').unbind('click'); // This fixes the problem for multiple entries 
       $('#add-new').modal('hide'); 

      }); 

     }); 


    </script> 

    <!-- add-new field --> 
    <div class="modal small hide fade" id="add-new" tabindex="-1" role="dialog" aria-labelledby="add-new-fieldLabel" aria-hidden="true"> 
     <div class="modal-header"> 
     <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> 
     <h3 id="add-new-fieldLabel">Add New Field</h3> 
     </div> 
     <div id="modal-body" class="modal-body"> 

      <p>Would you like to add a new <span1></span1> option?</p> 
      <input type="text" id="add-new-text" name="add-new-text" placeholder="Type the new option"> 

     </div> 

     <div class="modal-footer"> 
     <button type="button" class="btn btn-success" id="add-new-submit" name="add-new-submit"/>Add</button> 
     </div> 
</div><!-- /add-new field --> 

더 많은 코드를 포함하도록 수정했습니다. 모두 한 눈에 볼 수 있지만 양식 상단 부분을 포함 시켰습니다. 문제는 새로운

$('#upload_form option[value="addnew"]').click(function(event){ 

에서 선택 추가 할 때 그것이 너무

$('#add-new-submit').click(function(){ 

에서 미래의 모든 클릭에 바인딩 있다는 것을 사용자가 새로 추가를 선택하고 다음 오프를 클릭하여 모달 창을 일축 경우 그것은 여전히 ​​바인딩되어 있고 새로 추가를 다시 선택하면 텍스트가 실제로 입력되고 추가 단추를 클릭하면 해당 텍스트가 해당 필드와 이전 필드에 모두 입력됩니다.

그래서 제 질문은 여전히 ​​약자 모달는 x를 클릭하거나 창을 클릭하여 해제 할 때 내가 클릭 이벤트

$('#upload_form option[value="addnew"]').click(function(event){ 

바인딩을 해제 어떻게?

나는 클릭 수를 중첩하지 말라고 들었지만 첫 번째 클릭 이벤트가 두 번째 클릭 이벤트를 발생시키기 때문에 중첩 클릭없이이를 수행하는 방법을 알지 못합니다. 두 번째 클릭 이벤트는 추가 버튼이기 때문에 클릭이 아니어도 되겠지만 제출으로 작동 할 수는 없습니다.)

도움말!

+0

당신이 내가 일하고 있어요 최소한의 테스트 케이스 –

+0

을 만들 수 .. 작업 예제없이 말을하기가 어렵다 최소의 테스트 케이스에서. 모달 중 한 요소가 외부의 모달 클릭에 대한 해고를 담당하는 모달 요소가 무엇인지 알아두면 좋을 것입니다. – MysticalTautologist

+1

이것은'data-dismiss = "모달"속성입니다. –

답변

1

우선, 저는 HTML에서 모든 PHP 항목을 제거하는 것이 허용되었으므로 중요하지 않습니다.

<div class="container"> 
    <div class="row"> 
    <div class="span12"> 

     <h3>Upload your experimental data</h3> 
     <form class="form-horizontal well" action="/" method="post" enctype="multipart/form-data" id="upload_form"> 

     <fieldset> 
      <legend>Animal Info</legend> 

      <!-- Animal Species --> 
      <div class="control-group"> 
      <label class="control-label">Species</label>    
      <div class="controls"> 
       <select> 
       <option>&lt;choose&gt;</option> 
       <option value="addnew">Add new</option> 
       </select> 
      </div> 
      </div> 

      <!-- Animal Condition --> 
      <div class="control-group"> 
      <label class="control-label">Animal Condition</label>    
      <div class="controls"> 
       <select> 
       <option>&lt;choose&gt;</option> 
       <option value="addnew">Add new</option> 
       </select> 
      </div> 
      </div> 

      <!-- Brain Area --> 
      <div class="control-group"> 
      <label class="control-label">Brain Area</label>    
      <div class="controls"> 
       <select> 
       <option>&lt;choose&gt;</option> 
       <option value="addnew">Add new</option> 
       </select> 
      </div> 
      </div> 

     </fieldset> 

     <!-- submit --> 
     <div class="form-actions"> 
      <button type="submit" class="btn btn-primary">Upload &raquo;</button> 
     </div> 

     </form> 
    </div> 
    </div><!-- end row --> 

    <!-- add-new field --> 
    <div class="modal small hide fade" id="add-new" tabindex="-1" role="dialog" aria-labelledby="add-new-fieldLabel" aria-hidden="true"> 
    <div class="modal-header"> 
     <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> 
     <h3 id="add-new-fieldLabel">Add New Field</h3> 
    </div> 

    <div id="modal-body" class="modal-body"> 
     <p>Would you like to add a new <!-- wtf? <span1></span1> --> option?</p> 
     <input type="text" id="add-new-text" name="add-new-text" placeholder="Type the new option" /> 
    </div> 

    <div class="modal-footer"> 
     <button type="button" class="btn btn-success" id="add-new-submit" name="add-new-submit">Add</button> 
    </div> 
    </div><!-- /add-new field --> 
</div> 

.

$('#upload_form select').change(function(event){ 
    var $select = $(this); 
    // abort if selected option is not the addnew one 
    if ($select.val() !== 'addnew') return; 

    // Get all elements we'll need later on once and put them in a variable, 
    // so jquery don't has to search them all over again everytime we need them 
    // http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-jquery-newbs-stop-jumping-in-the-pool/ 
    var $add_new  = $('#add-new') 
    , $add_new_text = $('#add-new-text') 
    , $add_new_submit = $('#add-new-submit') 
    , addNewOption; // This variable will get assigned our click handler, we'll need this later on 

    // Show the modal 
    $add_new.modal('show'); 

    // You want this event handle to get called only once, .one() will do exactly that 
    // http://api.jquery.com/one/ 
    $add_new_submit.one('click', addNewOption = function() { // Like i said above 
    var new_option_value = $add_new_text.val() 

     // Create a new option element 
     , $new_option = $('<option/>'); 

    // Set it's value and text to the user input 
    // Note: in your application you should escape this before using it in any way, never trust user input 
    $new_option.val(new_option_value).text(new_option_value); 

    // Assuming the "Add New" option should always be the last one, 
    // add the new option in before it. 
    $select.children().last().before($new_option); 

    // Select it 
    $new_option.prop('selected', true); 

    $add_new_text.val(''); 
    $add_new.modal('hide'); 
    }); 

그리고 나는 또한 자바 스크립트 코드를 refacrtored, 내가 모든 중요한 변경 주석, 내가 그것을 혼란 에없는 희망 (이 무슨 일이 일어나고 있는지 표시 할 필요 이후 나는 또한 실제 Ajax 호출을 제거)

나는 이것이 실제 문제를 해결할 것입니다 생각 : source

주 (그들은 표시됩니다 때뿐만 아니라) 그들이 숨길 것이다 때 이벤트를 트리거합니다 부트 스트랩 조동사를 : 경우 이미 보을 사용하고 otstrap 3 당신은이 코드와 기능 jsFiddle을 찾을 수 있습니다 hide.bs.modalsource

$add_new.one('hide', function() { 
    // This will unbind explicitly the handler we attached above 
    $add_new_submit.unbind('click', addNewOption); 
    }); 
}); 

Here에 이벤트 이름을 변경해야합니다. 난 당신이 질문이있는 경우, 물어 주시기이에 당신을 도울 수

희망 :

+0

이 게시물을 보내 주셔서 감사합니다. 나는 지금 그것을보고있다. jsFiddle은 잘 작동하지만 코드에서 $ ('# upload_form select') change (function (event) {}는 아무 것도하지 않는 것 같습니다.) consol.log ("Hello")를 넣었습니다. 콘솔에서 무엇이든 볼 수 있습니다 – MysticalTautologist

+0

선택기는 무엇이든지'''console.log ($ ('# upload_form select'));'''또는 javascript를 통해 선택 또는 전체 양식을 동적으로 추가합니까? –

+0

위의 사항을 무시하십시오. 작동 했어요. 테스트. 작동 방식을 알려 드리겠습니다 .... – MysticalTautologist