2012-02-10 263 views
0

我正在創建一個移動應用程序,我打電話給函數getItem傳遞data-trnote val。jQuery多次函數調用

function getTitles() { 
    $(document).ready(function(e){ 
     var list = $('#recent'), 
      items = []; 
     $.mobile.notesdb.transaction(function(t) { 
      t.executeSql('SELECT buildingcode, buildingaddress FROM buildings ORDER BY buildingaddress ASC', [], function(t, result) { 
       var i, 
        len = result.rows.length, 
        row; 
       if (len > 0) { 
        for (i = 0; i < len; i += 1) { 
         row = result.rows.item(i); 
         items.push('<li><a href="#display" data-trnote="' + row.buildingcode + '">' + row.buildingaddress + '........' + row.buildingcode + '</a></li>'); 
        } 
        list.html(items.join('\n')); 
        list.listview('refresh'); 
        $('a', list).live('click', function(e) { 
         getItem($(this).attr('data-trnote')); 
        }); 
        $('#entries').show(); 
       } else { 
        $('#entries').hide(); 
       } 
      }) 
     }); 
    }); 
} 

爲getItem代碼是作爲遵循

function getItem(buildingcode) { 
alert(buildingcode); 
    $(document).ready(function(){ 
     var list = $('#recentflats'), 
      items = []; 
     $.mobile.notesdb.transaction(function(t) { 
      t.executeSql('SELECT buildingaddress, buildingcode FROM buildings WHERE buildingcode = ?',[buildingcode], function(t, resultbuilding) { 
       var myrow; 
       myrow = resultbuilding.rows.item(0); 
       $('#display h1').text(myrow.buildingaddress); 
      }) 
     }); 
     $.mobile.notesdb.transaction(function(t) { 
      t.executeSql('SELECT DISTINCT flatdescription, flatname, buildingcode FROM bill WHERE buildingcode = ?',[buildingcode], function(t, resultflat) { 
       var i, 
        len = resultflat.rows.length, 
        row; 
       if (len > 0) { 
        for (i = 0; i < len; i += 1) { 
         row = resultflat.rows.item(i); 
         items.push('<li><a href="#displayflat" data-flat="' + row.flatname + '" data-description="' + row.flatdescription + '">' + row.flatdescription + '...' + row.flatname + '</a></li>'); 
        } 
        list.html(items.join('\n')); 
        list.listview('refresh'); 
        $('a', list).live('click', function(e) { 
         getItem1($(this).attr('data-flat'), $(this).attr('data-description')); 
        }); 
        $('#entriesflat').show(); 
       } else { 
        $('#entriesflat').hide(); 
       } 
      }) 
     }); 
    }); 
} 

兩種功能創建dynamicaly列表視圖。

getTitles函數顯示公司的建築物,而getItem顯示所選建築物的平房。

我包括警報(buildingcode);找出問題,但我不明白什麼是錯的。

第一次一切正常。當我回到getTitles並轉發到getItem時,警報顯示兩次...當我回退和轉發警報顯示3次,因此繼續4次... 5次...

和所有代碼從這個角度重複警告......

什麼是錯

THX提前爲你的時間

+1

請告訴我那不是在JavaScript的SQL? – Henesnarfel 2012-02-10 21:10:10

+1

請勿將sql放入javascript中。另外,不要把JavaScript放入。真的,不要把JavaScript放入。 – jrummell 2012-02-10 21:11:38

+1

我喜歡關於JavaScript中的SQL的評論。 – 2012-02-10 21:12:57

回答

1

我認爲這是一個使用liveclick處理程序。 livedocumentbody上附加事件處理程序,並偵聽我們傳遞的選擇器。每當你打電話給getTitles它都會附上一個新的處理程序。

看着你的代碼,沒有必要使用live只是使用click處理程序它會正常工作。

更改這裏面getTitles

$('a', list).click(function(e) { 
     getItem($(this).attr('data-trnote')); 
    }); 

相同的內徑getItem方法

$('a', list).click(function(e) { 
     getItem1($(this).attr('data-flat'), $(this).attr('data-description')); 
    }); 
1

您對live調用你的函數的每次調用分配一個新的事件處理程序。安裝新的之前刪除舊的處理程序:

$('a', list).die('click'); 
$('a', list).live('click', …); 

或者,你應該能夠使用click,而不是live

0

我相信你會把你的標籤放在div [data-role =「page」]右邊?由於jQM通過AJAX引入該div中的所有內容,所以只要加載該頁面,您的JS就會重新運行。

即使使用live也無濟於事,如果您連接多個實時事件,解決方案是正確使用jQM的pageinit事件來僅運行一次代碼。封裝事件處理程序是棘手的,我建議使用on事件處理程序。

反正你不能跳進jQuery手機,不瞭解jQM是如何工作的,你正在使用document.ready並使用全局選擇器,當你在一個DOM中加載多個頁面。在這裏看一個類似的問題更詳細的概述:https://stackoverflow.com/a/9085014/737023