开发者问题收集

使用 js if/else 和 CSS 值

2018-06-15
1476

我并不是一名真正的程序员,但是我必须根据我们的需求更改一些 html/css/js 代码......我很挣扎。

我们正在使用一款云软件,它是闭源的,但可以更改部分 HTML 前端。

该软件使用 CSS 类“dom-admin”为非管理员隐藏一些设置。

<div class="dom-admin"> hidden for non-admins </div>

如果用户登录,系统会将显示属性设置为 display:none;

.dom-admin {
    display: none;
}

这些隐藏字段大多是输入字段。我们不想为用户隐藏这些字段,我们只想将字段设置为 readonly

我的想法是在 if / else 查询中读取 javascript 中的显示值:

if (dom-admin('display') == 'none') 
{ document.write('<input type="text" id="XX">') }
else
{ document.write('<input readonly type="text" id="XX">') }

我的问题是访问显示值,我尝试了网络上的 x 个示例,但我始终无法读取“dom-admin”的属性,例如:

document.getElementById('dom-admin').style.display

Chrome Javascript 控制台: 未捕获的 TypeError:无法读取 null 的属性“style”

Chrome dev-tools 向我展示了有关“dom-admin”CSS 的以下信息:

image

感谢您的帮助... 谢谢,帕特里克

2个回答

阶段 1:显示所有隐藏字段


具有通用类名的多个元素

.dom-admin 仅用于展示,不是一种安全措施。如果您想要访问 className 为 dom-admin 的多个元素,则必须将它们收集到 NodeList/HTMLCollection 中:

var DOMObjects = document.querySelectorAll('.dom-admin');

var DOMObjects = document.getElementsByClassName('dom-admin');

使用此列表,您必须通过 for 循环或数组方法(如果是后者,则可能需要将列表转换为数组)迭代/循环遍历每个 *.dom-admin

for (let i=0; i < DOMObjects.length; i++) {...

DOMObjects.forEach(function(DOMObj, index) {...

要反转 .dom-admin 的样式,您可以将每个 *.dom-admin style 对象设置为:

DOMObj.style.display = "block"

或删除 .dom-admin class:

DOMObj.classList.remove('dom-admin')

具有 ClassName 的单个元素

最直接的方法是通过 querySelector()getElementsByClassName()[0] 定位 className:

var DOMObj = document.querySelector('.dom-admin');

var DOMObj = document.getElementsByClassName('dom-admin')[0];

第 2 阶段:将所有显示的字段设置为不可编辑


设置/获取/更改元素属性

idclassreadOnly 等称为属性。所需属性具有布尔值(true/false)。 readonly 等属性只需存在于标签上即可为 true。当然,如果实际上不在标签中,则会导致错误。

设置属性 更具体地说,在元素中不存在属性时添加该属性:

DOMObj.setAttribute('readonly', true);

获取属性 查找属性并读取该属性的值:

DOMObj.getAttribute('readonly');

更改属性 如果属性已经存在,并且需要更改值:

DOMObj.removeAttribute('readonly')

请记住,您正在处理的属性具有布尔值,因此处理方式与具有字符串值的属性不同。

DOMObj.setAttribute('name', 'foo'); /*OR*/ DOMObj.name = "foo"

DOMObj.getAttribute('name');

DOMObj.setAttribute('name', 'bar') /*OR*/ DOMObj.name = 'bar'

注释 1

方法的语法 querySelector() / querySelectorAll() :

document.querySelector('.dom-admin')

CSS 选择器 ===========^-----^[类的点]

与方法 getElementsByClassName() 的语法不同:

document.getElementsByClassName('dom-admin')

DOMString======================^------^[不需要点]

document.getElementsByClassName('dom-admin')[0]

DOMString======================^------^===^-^[不需要点]==

[如果只有一个目标,则需要使用索引为零的括号表示法]


注意2

除非您打算销毁页面上的所有内容,否则请勿使用 document.write

如果您在 div.dom-admin 中嵌套了输入,则意味着这些输入已经存在 但用户无法看到它们 。没有必要创建它们,即使您确实需要创建任何元素,也不要使用 document.write 。而是使用 createElement() 或在打算用作容器的元素上使用 innerHTML


演示

// Collect all .dom-admin into NodeList
var das = document.querySelectorAll('.dom-admin');

// forEach() .dom-admin, remove the class .dom-admin
das.forEach(function(da, idx) {
  da.classList.remove('dom-admin');

  // Find all inputs in the div formerly known as .dom-admin
  var inputs = da.querySelectorAll('input');

  /* forEach() input nested within the div formerly known 
  || as .dom-admin, set its attribute readonly to true
  */
  inputs.forEach(function(input, index) {
    input.setAttribute('readonly', true);
  });
});
.dom-admin {
  display: none;
}

input {
  font: inherit;
  width: 40%
}
<div class="dom-admin">
  <input type='text' value='These inputs exist already'>
  <input type='text'>
</div>

<div class="dom-admin">
  <input type='text' value='Do not use document.write'>
  <input type='text' value='it will overwite EVERYTHING'>
  <input type='text' value=''>
</div>

<div class="dom-admin">
  <input value='Fun fact:'>
  <input value='input by default is type="text"'>
  <input>
</div>
zer00ne
2018-06-15

以下是我用来实现您想要的东西。

正如其他人提到的,使用 document.querySelector('.dom-admin') 来访问该类,当您更改 display 样式时,您可以使用 if 语句

let admin = document.querySelector('.dom-admin');
if (admin.style.display === 'none') {
  document.write('<input type="text" id="XX">');
} else {
  document.write('<input readonly type="text" id="XX">');
}
.dom-admin {
  width: 200px;
  display: none;
}
<div class="dom-admin">
  <form action="#">
    <input type="text" id="user" />
    <input type="number" id="user_number" />
    <input type="password" id="user_password" />
    <input type="submit" id="submit" />
  </form>
</div>
Alex
2018-06-15