2011-09-16 36 views
1

我正在做一個網頁,在它的中間有一個ID的DIV「devices_div,」就像這樣:jQuery函數發生不止一次,爲什麼?

<div id="devices_div"></div> 

當加載頁面時,或當表單提交的resource_table內容.PHP裝入DIV:

<script> 
    jQuery(document).ready(function() 
    { 
     jQuery("#devices_div").load("resource_table.php"); 

     jQuery("#form").submit(function(event) 
     { 
      event.preventDefault(); 

      var form = jQuery(this); 

      jQuery.ajax({ 
       type: "POST", 
       data: form.serialize(), 
       url: form.attr("action"), 
       success: function(data) 
       { 
        jQuery("#devices_div").load("resource_table.php"); 
       } 
      }); 
     }); 
    }); 
</script> 

resource_table.php的內容是:

<script> 
    jQuery("a#add_device").live('click', function() 
    { 
     jQuery("table#devices tr:last").after("<tr><td>Test</td><td>Test</td></tr>"); 
    }); 
</script> 

<table id="devices"> 
    <tr> 
     <th> 
      Name 
     </th> 
     <th> 
      Xml Name 
     </th> 
    </tr> 
</table> 

<a id="add_device" href="#">Click here to add a device</a> 

當我點擊了 「add_device」 杉的ID鏈接一次,它增加了一行表「設備」就好了。

下面是問題:當我提交表單並第二次單擊鏈接時,它會添加兩行。如果我提交表單並單擊第三次鏈接,它會添加三行等,所以jQuery函數會發生多次。每次點擊只能發生一次。有任何想法嗎?

回答

4

您正在多次綁定直播活動。嘗試將活動事件移至父頁面,而不是多次加載的頁面。

編輯:

另一種方法是修改腳本塊使用.bind

<script> 
    jQuery("a#add_device").bind('click', function() 
    { 
     jQuery("table#devices tr:last").after("<tr><td>Test</td><td>Test</td></tr>"); 
    }); 
</script> 

,然後將其移動到它是在文件的底部,下方

<a id="add_device" href="#">Click here to add a device</a> 
+0

將活動事件處理程序更改爲綁定修復它。謝謝! 事件處理程序不在父頁面中的原因是因爲我需要after()的內容根據正在加載的資源動態更改。 – David

0

我想這是因爲每次你這樣做,你都會再次運行這一行代碼:

jQuery("a#add_device").live('click', function() 

其中添加了事件處理程序的新副本。所以,你最終得到了每個執行的事件處理程序的多個副本。

爲了解決這個問題,你可以將代碼移到你的主JS中,這樣它就不是檢索到的html的一部分,或者你可以把它保留在檢索的HTML中,並用一個變量來保護它,已經運行或沒有運行。

而且,這種選擇"#add_device""a#add_device"更高效,只要給你同樣的結果,你是不是要避免對不是<a>標籤以外的東西#add_device。一般來說,沒有理由在標識前放置標籤類型。 ID在頁面中是唯一的。如果您只使用ID,那麼jQuery可以使用document.getElementById()優化搜索。如果您將標籤類型置於其前面,則無法優化。

相關問題