当值可能不再存在时检测更改的最佳方法?

时间:2015-05-20 23:28:05

标签: javascript jquery jquery-ui comparison concatenation

我一直在尝试检测网页上多个输入的变化。 为此,我使用了这样的查询:

$(.InputClass).data("InitialValues",$(.InputClass).serialize())

(我不是在我的代码前面,但它应该看起来像这样)

后来我将.data中的值与新值进行了比较,并且它完全正常,但对于一件事,一个GridGiew。

在该GridView中,用户可以动态添加或删除行(添加或删除数据)。如果我将初始值保存在.data中,它将随行一起销毁,并且两者都将是未定义的(初始值和新值)。我需要检查的输入是隐藏的,可以使用$(.myNewClass).val()访问唯一值(因为我试图为这个特定的隐藏输入使用不同的类)

我想知道什么是最好的解决方案。

我尝试使用类似

之类的内容连接myNewClass中的所有val()
var initialValues = $(.myNewClass).map(Function(x){ 
    return x.val()
})

(同样,我不是我的电脑,我是javascript和jquery的新手)。 它不起作用。智能感知无法看到.map(它崩溃了)。

如果没有更好的方法,你能帮助我记录我的val()值的连接方式吗?

如果有更好的方法,请指点我正确的方向?

非常感谢!

1 个答案:

答案 0 :(得分:1)

var initialValues = $(.myNewClass).map(Function(x){ 
    return x.val()
})

.myNewClass应为String,在引号$(".myNewClass")内。

F回调的{p> .map()应为小写f,以防止调用原生Function

第一个x参数的

.map(x)将是元素或对象集合中元素或对象的index - 而不是元素;尝试调整.map()回调函数参数到.map(function(index, elem))以对应循环中的值。

x.val()中的{p> .map()将返回错误,因为x将是DOM元素<input>,而不是jQuery对象$(x);尝试使用x.valueel.value来检索循环中当前元素的值

尝试打开console,在下面的stacksnippets点击两次“运行代码段”。虽然alert消息在error

显示items的内容,但似乎并未在stacksnippets中调用console

// create `items` object , 
// containing `initialValues` , `currentValues` properties,
// set initially to `undefined` ; set to `Array` 
// at `load` , `unload` events   
var items = {
  "initialValues": undefined,
  "currentValues": undefined
};
$(window)
  .on({
    "load": function() {
      // set `items.initialValues` array
      items.initialValues = $(".myNewClass").map(function(index, elem) {
        return elem.value
      }).toArray();
      console.log("load", items);
    },
    "unload": function() {
      // set `items.currentValues` array
      items.currentValues = $(".myNewClass").map(function(index, elem) {
        return elem.value
      }).toArray();
      console.log("unload", items);
      alert(JSON.stringify(items, null, 4));
    }
  });

  $(function() {
    setTimeout(function() {
      // do stuff
      // remove first `.myNewClass` element "row"
      $(".myNewClass").first().remove();
      // change element at index 3 within `.myNewClass` collection
      $(".myNewClass").eq(3).val(123);
    }, 1500);
  });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<input type="hidden" value="1" class="myNewClass" />
<input type="hidden" value="2" class="myNewClass" />
<input type="hidden" value="3" class="myNewClass" />
<input type="hidden" value="4" class="myNewClass" />
<input type="hidden" value="5" class="myNewClass" />

请参阅.map().toArray()