8

我有以下问题:

我有一个 HTML 文本框 ( <input type="text">),其内容由我无法触摸的脚本修改(它是我的页面,但我正在使用外部组件)。

每次该文本框的值发生更改时,我都希望在我的脚本中得到通知,以便我可以对其做出反应。

我试过这个:

txtStartDate.observe('change', function() { alert('change' +  txtStartDate.value) });

哪个(可以预见)不起作用。仅当我自己使用键盘更改文本框值然后将焦点移至其他位置时才会执行它,但如果脚本更改值则不会执行它。

还有其他我不知道的事件我可以听吗?



我正在使用 Prototype 库,如果相关,修改文本框值的外部组件是 Basic Date Picker (www.basicdatepicker.com)

4

6 回答 6

5

正如您所暗示的,更改(和其他事件)仅在用户采取某些操作时触发。修改事物的脚本不会触发任何事件。您唯一的解决方案是在控件中找到一些可以连接到侦听器的挂钩。

这是我的做法:

basicDatePicker.selectDate = basicDatePicker.selectDate.wrap(function(orig,year,month,day,hide) {
  myListener(year,month,day);
  return orig(year,month,day,hide);
});

这是基于对 Firebug 的粗略了解(我不熟悉该组件)。如果还有其他选择日期的方法,那么您还需要包装这些方法。

于 2008-09-28T22:44:41.663 回答
4

addEventListener(" DOMControlValueChanged " 将在控件的值更改时触发,即使它是由脚本执行的。

addEventListener(" input " 是用户直接发起的 DOMControlValueChanged 过滤版本。

不幸的是,目前只有 Opera 支持 DOMControlValueChanged,并且 webkit 中的输入事件支持被破坏了。input 事件在 Firefox 和 Opera 中也有各种错误。

这些东西可能很快就会在 HTML5 中被清除,fwiw。

更新:

截至 2012 年 9 月 8 日,DOMControlValueChanged 支持已从 Opera 中删除(因为它已从 HTML5 中删除),并且现在浏览器中的“输入”事件支持要好得多(包括更少的错误)。

于 2008-09-29T00:43:21.957 回答
2

IE 有一个可用于此目的的onpropertychange事件。

对于真正的网络浏览器 (;)),有一个DOMAttrModified 突变事件,但是在 Firefox 中进行了几分钟的实验后,当值以编程方式更改时,我无法让它在文本输入上触发(或通过常规键盘输入),但如果我以编程方式更改输入的名称,它将触发。越来越好奇...

如果你不能让它可靠地工作,你总是可以定期轮询输入的值:

var value = someInput.value;

setInterval(function()
{
    if (someInput.value != value)
    {
        alert("Changed from " + value + " to " + someInput.value);
        value = someInput.value;
    }
}, 250);
于 2008-09-28T23:37:37.403 回答
1

根据外部 javascript 的编写方式,您始终可以在脚本中重新编写外部脚本的相关部分,并让它覆盖外部定义,以便触发更改事件。

以前我不得不用我无法控制的脚本来做这件事。

您只需要找到外部函数,将其全部复制为具有相同名称的新函数,然后重新编写脚本以执行您想要的操作。

当然,如果脚本是使用闭包正确编写的,您将无法轻易更改它......

于 2008-09-28T23:23:30.730 回答
0

除了像 noah 解释的那样解决问题之外,您还可以创建一个每隔几百毫秒检查一次值的计时器。

于 2008-09-28T23:49:04.567 回答
0

我不得不按照 Dan 建议的方式修改一次 YUI 数据分页器控件。这是蛮力,但它可以解决我的问题。也就是说,找到写入该字段的方法,复制其代码并添加触发更改事件的语句,然后在您的代码中处理该更改事件。你只需要用它的新版本覆盖原来的函数。轮询,虽然工作正常,但在我看来是一个更消耗资源的解决方案。

于 2008-09-29T00:22:20.993 回答