2012-02-10 2 views
0

Я создаю мобильное приложение, и я вызываю функцию getItem, передавая данные-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 ListViews.

Функция getTitles отображает здания компании, а getItem отображает квартиры выбранного здания.

i include alert (buildingcode); чтобы выяснить проблему, но я не могу понять, что случилось.

В первый раз все в порядке. Когда я вернусь к getTitles и перейду на getItem, предупреждение отобразится дважды ... когда я возвращаюсь и пересылаю дисплей предупреждения 3 раза и так продолжаю 4 раза ... 512 ...

и весь код с этой точки неоднократного как предупреждение ...

что неправильный

ТНХ заранее за время

+1

Пожалуйста, скажите мне, что это не sql в javascript ??? – Henesnarfel

+1

Не помещайте sql в javascript. Кроме того, не помещайте sql в javascript. Действительно, не помещайте sql в javascript. – jrummell

+1

Мне нравится комментарий о SQL в Javascript. –

ответ

1

Я думаю, что это click обработчик с помощью live. live присоединяет обработчик событий на document или body и прослушивает селектор, который мы передаем. Всякий раз, когда вы вызываете 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 извлекает все в этом div через AJAX, ваш JS будет повторно запускаться всякий раз, когда страница загружается.

Даже использование live не поможет, если вы подключаете несколько живых событий, решение заключается в правильном использовании события jQM для показа страницы, чтобы запустить ваш код только один раз. Инкапсулирующие обработчики событий сложны, я предлагаю использовать обработчик событий on.

В любом случае вы не можете просто перейти на jQuery mobile, не понимая, как работает jQM, вы используете document.ready и используете глобальные селекторные устройства, которые, как вы можете себе представить, взорвут, когда у вас есть несколько страниц, загруженных в один DOM ,посмотрите на аналогичный вопрос здесь для более подробного обзора: https://stackoverflow.com/a/9085014/737023

Смежные вопросы