Dojo从节点获取元素属性ID

时间:2014-07-25 01:23:28

标签: dojo

嘿,以下所有代码都搜索内部文本为“Ex:Bob”的范围,并返回一个元素(即输入元素)。

<input 
  dojoattachpoint="textbox,focusNode,_aroundNode" 
  dojoattachevent="onblur:onBlur,onfocus:onFocus,onkeyup:onKeyUp" 
  id="2c6af1dc-80cb-44f2-864d-1fb00216895dF_SingleLine-widget" 
  name="" 
  class="dijitReset dijitTextBox notDojoDndHandle" 
  type="text" 
  tabindex="0" 
  aria-label="text" 
  width="auto" 
  value="" 
  aria-describedby="2c6af1dc-80cb-44f2-864d-1fb00216895dF_SingleLine-widget-placeholder"
  style="max-width: 2.5em; width: 90%;">

<span 
  class="dijitPlaceHolder dijitInputField" 
  id="2c6af1dc-80cb-44f2-864d-1fb00216895dF_SingleLine-widget-placeholder" 
  style="max-width: 2.5em; width: 90%;">
  Ex: Bob
</span>

和JS:

dojo.query("span.dijitPlaceHolder.dijitInputField").forEach(function(node, index, arr){
      if (node.innerHTML === 'Ex: Bob') {
          var foundIt = dojo.query(node).prev();

          dojo.addClass(foundIt, "testClass");
      }
});

而不是我需要做的事情:

class =“dijitReset dijitTextBox notDojoDndHandle testClass” 它仍然有这个:

class =“dijitReset dijitTextBox notDojoDndHandle”

问题是:如何从节点获取该输入的 ID ? (foundIt)因为我需要一个ID才能使 .addClass 工作。

2 个答案:

答案 0 :(得分:0)

你所做的一定必须在w.r.t. addClass方法。因为dojo.addClass将一个DOM节点或其节点id(作为字符串)作为其第一个参数。请参阅this。 Dojo.query返回dom节点,这是第二个参数。如果它不适合您,我建议您使用console.log检查dojo.query方法,以检查您是否正在获取要修改的正确节点。可能那是不对的。

答案 1 :(得分:0)

这里有几点需要注意:

确保已加载DOM

为此,请将代码包装在dojo.addOnLoad()函数中,例如:

dojo.addOnLoad(function() {
    // Your code
});

修剪文字

您正在验证内部HTML是否为"Ex: Bob",但是,目前您的内部HTML还包含一些换行符,也可能包含一些标签(因为您将其放在新行上)。要解决这个问题,您应该在比较之前修剪内容,例如:

if (node.innerHTML.trim() === 'Ex: Bob') {
    // Your code
}

dojo.query返回dojo.NodeList

dojo.query模块返回dojo.NodeList,它与需要ID或DOM节点的dojo.addClass()函数不兼容。

dojo.NodeList实际上是一个DOM节点数组,所以你可以写一些东西:

var foundIt = dojo.query(node).prev();
dojo.addClass(foundIt[0], "testClass"); // Retrieve the element at index 0

甚至更好,dojo.NodeList还有一个名为addClass()的函数,适用于这些列表,例如:

dojo.query(node).prev().addClass("testClass"); // Short and easy

请务必包含适当的模块

dojo.NodeList::prev()功能需要加载dojo.NodeList-traverse,而dojo.NodeList::addClass()功能需要加载dojo.NodeList-dom。我不知道你实际需要列出哪些模块,但我从1.7开始自己开始使用Dojo,我习惯列出所有模块,例如:

dojo.require("dojo.query");
dojo.require("dojo.NodeList-traverse");
dojo.require("dojo.NodeList-dom");

如果你做了所有这些,你的代码应该可以正常工作,正如你在下面的小提琴中看到的那样:http://jsfiddle.net/69TDn/