4

IndexedDb objectStore からの値でオートコンプリートしたい入力ボックスを備えたフォームがあります。これは、2 つの上に配置された入力ボックスで機能します。私は単純な配列で問題なく動作しますが、objectStore の値で動作するようにしたいと考えています。このために、オートコンプリート機能で値をループできるように、トランザクションから使用可能な値を配置する必要があります。

1- トランザクションの結果を残りのコードで使用できるオブジェクトに取得するにはどうすればよいですか?

2- 私のループ構文は "results.value.name.length" (名前は私の objectStore インデックスです) で結果オブジェクトを操作できますか?

カーソルを介して IndexedDb オブジェクトを取得します。

var results = [];

var openDbRequest = indexedDB.open(DB_NAME);

openDbRequest.onsuccess = function (e) {
    var db = e.target.result;
    var tran2 = db.transaction("store");
    tran2.objectStore("store").openCursor().onsuccess = function(e) {
        var cursor = e.target.result;
        if (cursor) {
            results = cursor;
            cursor.continue();  
        };
    };                                      
};

オートコンプリート機能

var auto = "";
var auto_disp = "";

function getName(results) {
    var input = document.forms['myform'].name.value;
    var len = input.length;
    if (input.length) {
        for (i=0; i<results.value.name.length; i++){            
            if (results.value.name[i].substr(0,len).toLowerCase() == input.toLowerCase()){
                auto_disp = input + results.value.name[i].substr(len);
                auto = results.value.name[i];
                break;
            }
        }
    }
document.forms['myform'].auto_name.value = auto_disp;
}

function setName() {
 document.forms['myform'].name.value = auto;
 hideAuto();
}

function hideAuto() {
 document.forms['myform'].auto_name.value = "";
}

HTML フォーム:

<div style="position: absolute; top: 0; left: 0; width: 200px; z-index: 1;">
 <input type="text" name="name" style="background-color: #fff; border: 1px solid #999; width: 200px; padding: 2px" disabled />
</div>

<div style="position: absolute; top: 0; left: 0; width: 200px; z-index: 2;">
 <input autocomplete="off" type="text" name="auto_name" style="background: none; color:#39f; border: 1px solid #999; width: 200px; padding: 2px" onfocus="getName()"onkeyup="getName()" onkeydown="if (event.keyCode == 13) {setName();};"/>
</div>

更新:別のチェーンを試してみましたが、カーソルが表示されるようになりましたが、ループに問題があり、オートコンプリートが取得されません。

openDbRequest.onsuccess = function (e) {
    var db = e.target.result;

    var tran2 = db.transaction("store");
    tran2.objectStore("store").openCursor().onsuccess = function(e) {

        var cursor = e.target.result;
        if (cursor) { 
            var input = document.forms['myform'].country.value; //the inputted value
            var len = input.length;
            if (input.length) {
                for (i=0; i<cursor.length; i++){            
                    if (cursor.value.nome[i].substr(0,len).toLowerCase() == input.toLowerCase()){
                        auto_disp = input + cursor.value.nome[i].substr(len);
                        auto = cursor.value.nome[i];
                        break;                              
                    }
                }   
            }
            document.forms['myform'].auto_name.value = auto_disp;
            cursor.continue();  
        }   
    };
};
4

1 に答える 1

5

トランザクションスコープ外で使用したい場合は、変数に追加するだけです

var results = [];
var openDbRequest = indexedDB.open(DB_NAME);
openDbRequest.onsuccess = function (e) {
    var db = e.target.result;
    var tran2 = db.transaction("store");
    tran2.objectStore("store").openCursor().onsuccess = function(e) {
         var cursor = e.target.result;
         if (cursor) {
              results.push(cursor.value) 
              cursor.continue();
         };
    };
}; 

この後、結果オブジェクトを繰り返し処理し、すべてのデータが取得されるとトランザクション スコープが閉じます。

于 2012-10-09T05:14:47.263 に答える