如何在选择自动填充建议后停止页面重新加载

时间:2012-06-21 19:05:33

标签: javascript jquery ajax autocomplete pylons

我为表单输入字段进行了自动填充,允许用户将标记添加到它们的列表中。如果用户选择任何建议,我希望页面使用将新标记添加到已经存在但没有重新加载页面的标记部分。

我希望在3种情况下实现这一点:

  1. 用户键入标签,忽略自动填充建议并按Enter键。
  2. 在输入查询的任何部分后,用户使用箭头键选择一个自动完成建议,然后按Enter键。
  3. 在输入查询的任何部分后,用户使用鼠标单击其中一个自动完成建议。
  4. 我已经能够使场景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功能进行正常表单提交,但我似乎无法使其与其他方案一起工作,我甚至不确定这是真正的问题。

    我使用pylons作为MVC并使用this tutorial进行自动完成。

1 个答案:

答案 0 :(得分:0)

所以,如果有人想知道,我的问题是一个简单的解决方案,我应该从来没有过。

我的输入标记嵌入在每次激活输入标记时提交的表单中。

我在方案1中通过阻止用户按Enter键时发生默认事件来解决此问题。但由于我无法在jQuery事件.autocomplete()中访问此事件,因此我无法阻止它。