【问题标题】:Scriptaculous Autocomplete list closes on scroll bar clickScriptaculous 自动完成列表在滚动条单击时关闭
【发布时间】:2012-01-18 20:15:22
【问题描述】:

我在使用 Prototype 1.6 自动完成时遇到了一个非常烦人的问题。我用一个包含自动完成的表单设置了对话框样式的 div。一切正常,直到我单击滚动条或拖动它;它关闭建议列表。我检查了这个solution,但现在我收到了一个 javascript 错误

event.srcElement 未定义

我正在检查 controls.js 并试图在 onBlur 事件中捕获事件对象,但它是空的。打印了 offsetX 属性并且未定义。看来这个事件已经不存在了。无论哪种方式,它都会阻止列表关闭,但是,如果我在该区域之外单击,则列表现在不会关闭。这也是个问题

有人遇到同样的问题吗?有什么想法吗?

提前致谢

【问题讨论】:

    标签: events autocomplete prototypejs scriptaculous


    【解决方案1】:

    我昨天遇到了确切的问题,但经过一些研发后,我得到了一个非常方便的解决方案。
    默认情况下,此脚本在搜索文本框上的模糊事件中隐藏结果 div(建议列表),因此只要我们单击结果 div 的滚动条焦点就会从输入元素中丢失,结果 div 会关闭。所以我在 controls.js 中做了一个小的编辑来改变脚本的行为,所以现在结果 div close 方法不会从输入元素调用模糊(聚焦),而是在单击除文本输入元素之外的文档时触发。

    为方便起见,我将编辑后的 ​​controls.js 放入 here

    如果你想知道 JS 文件发生了什么变化,这里就是;

    1. 为文档添加了一个事件监听器。就在这条线的下方
      "Event.observe(this.update, "keypress", this.onKeyPress.bindAsEventListener(this));"

      Event.observe($(document), "mouseup", this.onMouseup.bindAsEventListener(this));
      
    2. 添加了新的 onMouseup 方法。

      onMouseup: function(event) {    
      if(!this.hasFocus) {  
          this.hideTimeout = setTimeout(this.hide.bind(this), 250);   
              this.hasFocus = false;  
              this.active = false;  
          }  
      },
      
    3. 修改onBlur方法(注释掉块中的两行)

      onBlur: function(event) { 
      
          //this.hideTimeout = setTimeout(this.hide.bind(this), 250);   
          //this.active = false;  
          this.hasFocus = false;       
      } 
      

    我希望这能解决您的问题。

    谢谢
    Vinod Kumar

    【讨论】:

    • 感谢@Vinod Kumar。但是当鼠标在其外部单击时,它仍然会阻止带有建议的 div 关闭。不过谢谢!
    • 我也将这个解决方案用于 IE,感谢@Vinod Kumar,在 Chrome 和 IE 上进行了测试。它确实为我关闭了 div。
    • hm,但问题是 clickEvent 停止工作。我使用自动完成值作为服务调用的输入参数。如果我在 OnBlur() 中注释掉两行,它就会停止工作,所以情况会更糟。如何解决?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多