2009-09-21 2 views
1

나는 클릭 이벤트에서 트리거 된 Prototype을 사용하여 레이아웃에 대한 검색 결과의 기본 집합으로 검색 상자를 배치하는 프로젝트에서 작업하고 있습니다.요소가 업데이트 된 후 이벤트 관찰을 유지하는 방법

출력이 설정되면 해당 새 페이지에는 자체 JavaScript가 사용되어 동적으로 결과를 필터링합니다.

이제 새로운 세트의 결과가 이전에 설정된 자바 스크립트에서 작동하지 않습니다.

매번 새로운 이벤트를 호출하여 지속적인 이벤트를 유지 관리하려면 어떻게해야합니까? 그게 내가해야 할 일입니다. 당신은에

<div id="search_overlay"> 
    <div id="form_box"> 
     <a href="javascript:void(null);"><img src="/images/closebox2.png" class="closebox" /></a> 
     <form method="post" id="search_form" class="pageopt_left"> 
      <input type="text" name="search_box" id="search_box" value="search" /> 
     </form> 
    </div> 
    <div id="table_overlay"> 
     <table class="sortable" id="nf_table" cellpadding="0" border="0" cellspacing="0"> 
<tr> 
<th id="name_th">Name</th><th id="amount_th">Amount</th><th id="tax_letter_th">Tax Letter</th><th id="date_th">Date</th><th id="add_th">Add</th></tr> 
<tr> 
<td>Abramowitz Foundation (The Kenneth & Nira)</td><td><input type="text" name="amount" value="" id="amount_111" /></td><td><input type="checkbox" name="tax_letter" value="1" id="tax_letter_111" /></td><td><input type="text" name="date" value="" id="date_111" /></td><td><a href="http://compass.krd.webhop.net/sponsors/add/111" class="add_button"><img src="/images/icons/add.png" title="add contact" /></a></td></tr> 
... more rows 
</table> 
    </div> 
</div>  
<script language="javascript"> 
    var c = new Compass_Search('contacts', 'table_overlay'); 
    c.set_url('/sponsors/sponsor_search'); 
    $$('.add_button').each(function(s, index) { 
     $(s).observe('click', function(e) { 
      $(e).stop(); 

      var params = $(s).href.split("/"); 
      var userid = params[5]; 
      var amount = 'amount_'+params[5]; 
      var date = 'date_'+params[5]; 
      var tax  = 'tax_letter_'+params[5]; 
      if(!Form.Element.present(amount) || !Form.Element.present(date)) { 
       alert('your amount or date field is empty '); 
      } else { 
       var add_params = {'amount':$F(amount), 'date':$F(date), 'tax':$F(tax), 'id':userid}; 
       if(isNaN (add_params.amount)) { 
        alert('amount needs to be a number'); 
        return false; 
       } else { 
        new Ajax.Request('/sponsors/add', { 
         method: 'post', 
         parameters: add_params, 
         onComplete: function(e) { 
          var post = e.responseText; 
          var line = 'amount_'+add_params.id; 
          $(line).up(1).remove(); 
         } 
        }) 
       } 
      } 
     }); 
    }); 

    this.close = $$('.closebox').each(function(s, index) { 
     $(s).observe('click', o.unloader.bindAsEventListener(this)); 
}) 
</script> 

알 수 있습니다 : 여기

은 'loaded_page.php'자바 스크립트를 통해 삽입되는 포함 페이지에서 다음

<script language="javascript"> 
    var o = new Compass_Modal('add_button', 'history'); 
    var placetabs = new Tabs('tabs', { 
     className: 'tab', 
     tabStyle: 'tab' 
    }); 
    $$('.add_button').each(function(s, index){ 
     $(s).observe('click', function(f) { 
      loadData(); 
     }); 
    }); 

    function loadData() { 
     new Ajax.Request('/sponsors/search', { 
      onComplete: function(r) { 
       $('overlay').insert({ 
        top:'<div id="search_table">'+r.responseText+'</div>' 
       }); 
      } 
     }) 
    } 
</script> 

에로드되는 코드의 비트가 삽입 된 부분, 새로운 Javascript 또한 새로운 관찰자로 자신의 컨텐츠를 업데이트했습니다. 내용이 업데이트되면 관찰자는 작동하지 않습니다. 당신이 요소 번호 삽입을 전화하는거야으로

은 어쩌면 당신은 (일부 CONSOLE.LOG을 수행하려고 할 수 있습니다) (이러한 방법의 구현에보고 한 것으로)

답변

0

, 나는 문자열 #의 인 evalScripts이 자동으로 호출해야 가정/엘리먼트 #가 호출하기 전에 alert() 메시지를 보내어 잘못되었는지 확인하십시오. Javascript가 전혀 평가되지 않았거나 코드에 문제가 있거나 뭔가있을 수 있기 때문일 수 있습니다.

팁으로

이에

$$('.add_button').each(function(s, index){ 
    $(s).observe('click', function(f) { 
     loadData(); 
    }); 
}); 

:

$$('.add_button').invoke('observe', 'click', function(event){ 
    loadData(); 
}); 
// $$('.add_button').invoke('observe', 'click', loadData); 
1

사용 이벤트 위임을 배열 번호에 대한 설명서를 확인 당신이 뭔가를 다시 쓸 수있는 방법으로 호출합니다.

가능 "관찰"요소를 교체 할 수있게 외에도,이 방법은빠른더 많은 메모리를 효율적입니다.

document.observe('click', function(e){ 
    var el = e.findElement('.add_button'); 
    if (el) { 
    // stop event, optionally 
    e.stop(); 
    // do stuff... `el` now references clicked element 
    loadData(); 
    } 
}); 
관련 문제