Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在jquery中,从同一对象的属性设置输入字段和标签的正确方法是什么?_Javascript_Jquery - Fatal编程技术网

Javascript 在jquery中,从同一对象的属性设置输入字段和标签的正确方法是什么?

Javascript 在jquery中,从同一对象的属性设置输入字段和标签的正确方法是什么?,javascript,jquery,Javascript,Jquery,我有一个对象,它有很多属性。有些属性将显示在输入元素中,有些属性将显示在标签中 因此,我的代码如下所示: var data = getMyData(); var propNames = Object.keys(data); var i, propName, elem; for (i = 0; i < propNames.length; ++i) { propName = propNames[i]; elem = $("#" + propName);

我有一个对象,它有很多属性。有些属性将显示在输入元素中,有些属性将显示在标签中

因此,我的代码如下所示:

  var data = getMyData();
  var propNames = Object.keys(data);
  var i, propName, elem;
  for (i = 0; i < propNames.length; ++i) {
    propName = propNames[i];
    elem = $("#" + propName);
    if (elem.is('input')) {
      elem.val(data[propName]);
    } else {
      elem.html(data[propName]);
    }
  }
var data=getMyData();
var propNames=Object.keys(数据);
变量i,propName,elem;
对于(i=0;i
在jquery中这样做正确吗?因为它看起来有点难看


谢谢。

我认为可以用jQuery.each()函数重写for循环,它可以迭代任何数组或对象。它接受一个回调函数,该函数被赋予索引(或键)和每个项的值

在您的示例中,它类似于:

jQuery.each(data, function(key, value) {
   elem = jQuery("#" + value);
   if (elem.is('input')) {...

查看文档中的

假设您正在尝试填写一个
输入
或一个
文本区域
,您应该能够将其替换为:

var data = getMyData();
var propNames = Object.keys(data);

for (i = 0; i < propNames.length; ++i) {
  $("input#"+propNames[i]).val(data[propNames[i]);
  $("textarea#"+propNames[i]).html(data[propNames[i]);
}

由于
input
元素没有
innerHTML
textarea
元素没有
val
,因此应该按原样工作。有点粗俗,但很简洁。

我觉得一切都很好,马克。我强烈建议不要使用新的对象原型方法,比如
Object.keys
,它只在IE9+和其他更新的浏览器中可用。取而代之的是在所有JS之前为它创建原型(我实际上不喜欢这样做),或者使用一个复制的全局函数/命名空间方法来处理它,就像底部的
function getkeys()


我不明白这看起来有多难看,但我不明白为什么需要
对象。键
。。。您可以在
中为…使用常规的

var data = getMyData(), 
    d, $el;
for (d in data) {
  $el = $('#'+ d);
  if ($el.is('input')) {
    $el.val(data[d]);
  } else {
    $el.html(data[d]);
  }
}

我发现将方法名存储在变量(
text
/
val
)中更容易,这样我们就不会有太多的代码重复(代码中的条件会导致不必要的重复)

另外,由于您无论如何都在使用jQuery,所以您最好使用。它将所有内容简化为:

$.each(getMyData(), function (key, val)
{
    var el = $("#" + key),
        method = el.is('input') ? 'val' : 'text';

    el[method](val);
});
这是小提琴:


如果不喜欢将方法名称存储在变量中,请改用以下方法:

$.each(getMyData(), function (key, val)
{
    var el = $("#" + key);

    el.is('input') ? el.val(val) : el.text(val);
});
这是小提琴:


如果您担心,您可以自己运行检查:

var data = getMyData();

$.each(data, function (key, val)
{
    if ( ! data.hasOwnProperty(key) ) return;

    var el = $("#" + key);

    el.is('input') ? el.val(val) : el.text(val);
});

问题是:

这不是应该贴上去吗?我不知道。如果你能把它移到那里,我会同意的。不幸的是,
$。在调用给定的回调之前,每个
都不会调用属性名上的
对象。hasOwnProperty
。另一方面,我想使用类似于forEach的东西。有更安全的选择吗?@mark-您可以运行
hasOwnProperty
检查您自己。请参阅我答案的更新。
$.each(getMyData(), function (key, val)
{
    var el = $("#" + key),
        method = el.is('input') ? 'val' : 'text';

    el[method](val);
});
$.each(getMyData(), function (key, val)
{
    var el = $("#" + key);

    el.is('input') ? el.val(val) : el.text(val);
});
var data = getMyData();

$.each(data, function (key, val)
{
    if ( ! data.hasOwnProperty(key) ) return;

    var el = $("#" + key);

    el.is('input') ? el.val(val) : el.text(val);
});