ユーザーがタグのリストにタグを追加できるようにするフォーム入力フィールドのオートコンプリートを作成しました。ユーザーが提案のいずれかを選択した場合、ページを使用して、ページをリロードせずにすでに存在するタグのセクションに新しいタグを追加します。
これを3つのシナリオで実現したいと思います。
- ユーザーはタグを入力し、オートコンプリートの提案を無視して、Enterキーを押します。
- クエリの任意の部分を入力した後、ユーザーは矢印キーを使用してオートコンプリート候補の1つを選択し、Enterキーを押します。
- クエリの任意の部分を入力した後、ユーザーはオートコンプリート候補の1つをマウスでクリックします。
シナリオ1を完璧に機能させることができました。ただし、シナリオ1と2ではページがリロードされますが、それでもタグはリストに追加されません。
シナリオ1と2は、どちらも同じ関数によって呼び出されます。
$j("#addTag").autocomplete({
serviceUrl:'/ac',
onSelect: function(val, data){
addTag(data);
}
});
そして、これがaddTag()のコードです:
function addTag(tag){
var url = '/addTag/' + tag;
//Call the server to add the tag/
$j.ajax({
async: true,
type: 'GET',
url: url,
success:function(data){
//Add the tag to the displayed list of already added tags
reloadTagBox(data);
},
dataType: "json"
});
//Hide the messages that have been displayed to the user
hideMessageBox();
}
シナリオ1コード:
function addTagByLookup(e, tag){
if(e && e.keyCode == 13)
{
/*This stops the page from reloading (when the page thinks
the form is submitted I assume).
*/
e.preventDefault();
//If a message is currently being displayed to the user, hide it
if ($j("#messageBox").is(":visible") && $j("#okayButton").is(":visible")){
hideMessageBox();
}
else{
//Give a message to the user that their tag is being loaded
showMessageBox("Adding the tag <strong>"+tag+"</strong> to your station...",'load');
//Check if the tag is valid
setTimeout(function(){
var url = '/checkTag/' + tag;
var isTagValid = checkTag(tag);
//If the tag is not vaid, tell the user.
if (isTagValid == false){
var message = "<strong>"+tag+"</strong>"+
" was not recognized as a valid tag or artist. Try something else.";
//Prompt the user for a different tag
showMessageBox(message, 'okay');
}
//If the tag is valid
else{
addTag(tag);
}
}, 1000);
}
}
}
シナリオ1の通常のフォーム送信にe.preventDefault機能を使用したことは知っていますが、他のシナリオで機能させることができないようで、それが本当の問題であるかどうかさえわかりません。
私はMVCとしてパイロンを使用しており、オートコンプリートにはこのチュートリアルを使用しています。