-1

我目前正在开发一个greasemonkey 脚本。该脚本的一部分将需要检测没有用户交互的输入框的变化。有一段时间,我使用了几个事件触发器,例如 mousemove 或 keyup/down 并比较旧值和新值并相应地更新。出于某种原因,这在我的场景中可能会失败。

该场景是一个系统,其中页面的部分动态更改,输入框自动更改以反映当前访问的部分。

我已经尝试 setInterval 来尝试检测变化,但我相信这些天必须有更好的解决方案。

这是我一直在使用的一个示例,它似乎在大多数情况下都有效,但我确实需要一个更可靠的解决方案。

$(document).mousemove(function(event){
    if(savedId !== $('.only_class_element').val()){

除了 setInterval 之外,还有什么方法可以在没有用户交互的情况下检测输入框的值更改?

这当然需要 dom ready

4

1 回答 1

1

通常,对于<input>或类似的,您将使用change事件。例如:

$('.only_class_element').on ("change", function (zEvent) {
    // DO WHATEVER HERE.
} );


但是,如果元素实际上不是输入类型,或者元素本身是通过 AJAX 添加/删除/重新创建的,那么您必须使用间隔(或 Mutation Observers,但我不建议这样做)。顺便说一句,与未过滤的监视相比,时间间隔的侵入性/资源密集度要小得多mousemove

在破坏性 AJAX 情况下,使用waitForKeyElements(),如下所示:

// ==UserScript==
// @name     _Monitor Cheshire-cat element for changes
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/
waitForKeyElements (".only_class_element", fireOnChangedValue);

function fireOnChangedValue (jNode) {
    var nodeVal     = $.trim (jNode.val () );
    var lastVal     = jNode.data ("lastVal")  ||  "";

    if (nodeVal != lastVal) {
       //  DO WHATEVER WITH nodeVal HERE.
    }

    jNode.data ("lastVal", lastVal);
    return true;
}
于 2013-05-30T09:30:46.670 回答