jquery不止一次调用函数
我正在创建一个移动应用程序,我正在调用函数getItem传递data-trnote val。
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('' + row.buildingaddress + '........' + row.buildingcode + ' '); } 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('' + row.flatdescription + '...' + row.flatname + ' '); } 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(); } }) }); }); }
这两个函数都创建了动态列表视图。
getTitles函数显示公司的建筑物,而getItem显示所选建筑物的平面。
我包括警报(buildingcode); 找出问题但我无法理解什么是错的。
一切都好的第一次。 当我回到getTitles并转发到getItem时,警报显示两次……当我返回并向前转发警报显示3次然后继续4次… 5次……
并且从这一点开始的所有代码都作为警报重复…
有什么不对
提前为你的时间
我认为这是使用live
的click
处理程序。 在document
或body
上live
附加事件处理程序并侦听我们传递的选择器。 每当你调用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')); });
您的live
调用会在每次调用函数时分配一个新的事件处理程序。 在添加新处理程序之前删除旧处理程序:
$('a', list).die('click'); $('a', list).live('click', …);
或者,您应该能够使用click
而不是live
。
我相信你把你的标签放在div [data-role =“page”]里面吧? 由于jQM通过AJAX引入该div中的所有内容,因此无论何时加载页面,JS都将重新运行。
如果您正在附加多个直播事件,即使使用直播也无济于事,解决方案是正确使用jQM的pageinit事件来运行您的代码一次。 封装事件处理程序很棘手,我建议使用on事件处理程序。
无论如何你不能只是跳进jQuery mobile而不了解jQM是如何工作的,你正在使用document.ready并使用全局选择器,你可以想象当你在一个DOM中加载了几个页面时会爆炸。 在这里查看类似的问题以获得更详细的概述: https : //stackoverflow.com/a/9085014/737023