【问题标题】:make input tag toggle between edit and readOnly使输入标签在编辑和只读之间切换
【发布时间】:2020-01-26 04:36:58
【问题描述】:

我有一个问题,如何在不使用其他按钮的情况下将输入标签从编辑切换为只读。我在这里有我的codepen。如果您注意到我在 div 上添加了一个事件。这有点愚蠢,因为当他们想要编辑时,他们单击输入,然后下一次单击将禁用它。我在某处看到了一些东西。他们实施了同样的事情。我可以阅读的任何链接?谢谢。

HTML

<div id='wasa'>
  <input id="date" type="date" value="2018-07-22" >
</div>

JS

const test = document.querySelector('#wasa');
const date = document.querySelector('#date');
let foo = false; 
test.addEventListener('click', function() {
  foo = !foo
  date.readOnly = foo;
  console.log(foo)
})

【问题讨论】:

  • 你希望它在什么条件下只读?您似乎已经知道如何将其设为只读。
  • @DeclanMcKelvey-Hembree 希望在用户不编辑它的情况下将其设为只读。如果他们想编辑它,他们可以完全控制。但我的问题是 onload 它将是只读的,如果我单击编辑并单击下拉编辑日期,它将再次变为只读。那是我的问题。希望有意义
  • “但不使用其他按钮” — 正如 Declan 所要求的,而不是使用按钮,如何(当,在什么条件下)你希望它改变吗?您当前的代码可以做到这一点,尽管 Nidhin 的回答是一种更好的方法。但是什么时候应该运行该代码?您说您不希望它在(按钮)单击时运行,所以当 do 您希望切换只读状态时?如果没有这些信息,就不清楚您在问什么。
  • @StephenP 所以 onload 我可以看到日期值,当我第一次单击输入字段时,我可以编辑它或删除只读,所以条件是输入字段为只读和用户点击,那是readOnly 将被删除的那一刻,因为只读被删除,他们可以编辑日期,用户可以点击下拉菜单并寻找一个日期,在他们选择一个日期后,它将返回只读。在玩了之后,我认为这是不可行的。我需要另一个按钮来切换只读。如果他们点击下拉菜单,那么它将返回只读
  • 所以取消切换 - 以只读方式启动 &lt;input id="date" type="date" value="2018-07-22" readonly&gt; 然后,当单击 div 时,使用 date.removeAttribute('readonly') 删除只读属性,如 Nidhin 所示。当挑选新日期时(或以任何方式键入或更改)change事件如果触发;附加一个更改侦听器date.addEventListener('change', function(){...}) — 在 that 侦听器中(当字段为 changed 时)然后将 readonly 属性添加回date.setAttribute('readonly','');

标签: javascript jquery html css


【解决方案1】:

您可以使用setAttributeremoveAttribute 属性函数来切换禁用状态。

const test = document.querySelector('#wasa');
const date = document.querySelector('#date');
test.addEventListener('click', function() {
  if (date.hasAttribute('readonly')) {
    date.removeAttribute('readonly')
  } else {
    date.setAttribute('readonly', 'readonly');
  }
})
#wasa {
  padding: 1em;
}
<div id='wasa'>
  <input id="date" type="date" value="2018-07-22">
</div>

【讨论】:

  • disabledreadonlynot the same thing
  • @StephenP 已更改。
  • 这和我的一样。如何更改日期?如果您单击下拉按钮,它将设置为只读
【解决方案2】:

如果您对 jQuery 答案感兴趣,我会这样做。 它比纯 javascript 答案更干净一点,并且实现了同样的目标。

// remove readonly when clicking on the input
$("body").on("click", "#wasa input", function(){  
  $(this).prop("readonly", "");
  
  // EDIT: this was the prevoius answer
  //$(this).prop("readonly", !$(this).prop("readonly"));// unlock by clicking on the input
});

/* NEW */
// lock input when click/tab away
$("body").on("focusout", "#wasa input", function(){  
  $(this).prop("readonly", "readonly");  
});
#wasa input:read-only {
  background: crimson;
  color: white;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id='wasa'><input id="date" type="date" value="2018-07-22" readonly></div>

【讨论】:

  • 但是如何更改日期呢?如果您尝试单击下拉菜单,它将被设置为只读。和我一样的问题。
  • @aRtoo 抱歉,我以为这就是你想要的。我已经编辑了答案,当你点击输入时,它会删除只读,当你点击离开或失去焦点时,它会添加只读属性。祝你好运!
  • 不要抱歉,先生。这行得通。太感谢了。感谢答案。我会接受的。
【解决方案3】:

您可以使用 change 事件来恢复字段的readonly 状态。

根据我的评论...

取消切换 - 通过在字段中包含 readonly 属性以只读方式开始

<input type="date" value="2018-07-22" readonly>

然后,当单击 div 时,使用 date.removeAttribute('readonly') 删除只读属性,如 Nidhin 所示。

挑选新日期时,会触发更改事件;将更改侦听器附加到日期字段。在该侦听器中(当字段更改时),然后添加 readonly 属性。

请注意,change 并不总是在值更改时触发,它可能在您离开字段(模糊)之前不会触发,因此您可能需要进一步调整代码下面,但是当您通过日期选择器更改值时,它触发。

const dateDiv = document.getElementById('wasa');
const date = document.querySelector('input[type=date]', dateDiv);

dateDiv.addEventListener('click', function() {
    date.removeAttribute('readonly');
});

date.addEventListener('change', function() {
    date.setAttribute('readonly','');
});
#date  {
  background: transparent;
  border: none;
}

#date[readonly] {
  background-color: lightblue;
}
<div id='wasa'>
  <input id="date" type="date" value="2018-07-22" readonly>
</div>

【讨论】:

  • 谢谢你。这行得通,我必须在模糊上实现。我必须接受上面的答案,因为它是完整的。谢谢你给我一个想法。 :)
猜你喜欢
  • 2012-10-15
  • 2021-01-15
  • 2018-11-09
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 2011-11-05
相关资源
最近更新 更多