`
Odysseus_110
  • 浏览: 120469 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

过滤nextSibling元素

阅读更多

 


// Paging list
// Written so that it can be easily subclassed, with easy access to
// the parent constructor from the subclass.

function PagingList(id, topItem, visibleItems) {
  if (arguments.length > 0)
    this.init(id, topItem, visibleItems);
}

PagingList.prototype.init = function(id, topItem, visibleItems) {
  this.id = id;
  this.idElt = document.getElementById(id);
  if (this.idElt == undefined)  return;

  if (topItem != undefined)  this.topItem = topItem;
  if (visibleItems != undefined)  this.visibleItems = visibleItems;

  // We'll be showing/hiding this.listItemElt elements
  // By contract we can assume the list is the first UL element,
  // containing one LI element per list item.
  this.listElt = this.idElt.getElementsByTagName("ul")[0];
  this.listItemElt = this.listElt.getElementsByTagName("li");
  this.listLength = this.listItemElt.length;

  this.addPagers();

  // Contract between presentation and behaviour states that the
  // list items are initially hidden. The list itself, however, is
  // displayed. This method displays each list item individually.
  this.showList();
}

// Inherited unless overridden.
PagingList.prototype.visibleItems = 9;
PagingList.prototype.topItem = 0;

// Add a pager to the list.
// A pager's purpose is to page a list in a particular direction
// by calling a list's function on receiving a focus event.
// It adds a div element to the document with the appropriate ID
// and class.
// It's up to presentation to display this element appropriately.
PagingList.prototype.addPagers = function() {
  var me = this;
  this.upPager = this.createPagerElt(function() { me.pageUp() },
				     this.id + "-pagerUp",
				     "pager up");
  this.downPager = this.createPagerElt(function() { me.pageDown() },
				       this.id + "-pagerDown",
				       "pager down");

  // Add to document before and after the list
  this.idElt.insertBefore(this.upPager, this.listElt);
  this.idElt.insertBefore(this.downPager, this.listElt.nextSibling);
}

PagingList.prototype.createPagerElt = function(fn, id, className) {
  var pagerElt = document.createElement("div");

  // Assume id is unique.
  pagerElt.id = id;
  pagerElt.className = className;

  pagerElt.addEventListener("focus", fn, false);

  return pagerElt;
}


PagingList.prototype.pageUp = function() {
  // No paging: just refocus first item.
  if (this.topItem == 0) {
    this.moveFocusToItem(0);
    return;
  }

  // Never go above the first list item
  var newTop = Math.max(this.topItem - this.visibleItems, 0);

  // Focus goes to the item above the last CURRENTLY visible item
  // however much is paged.
  var newFocus = this.topItem - 1;

  this.pageTo(newTop, newFocus);
}

PagingList.prototype.pageDown = function() {
  // No paging: just refocus last item.
  if (this.topItem == this.listLength - this.visibleItems) {
    this.moveFocusToItem(this.listLength - 1);
    return;
  }

  // Mustn't show items past the end of the list.
  var newTop = Math.min(this.topItem + this.visibleItems,
			this.listLength - this.visibleItems);

  // Focus goes on the one below the last CURRENTLY visible item
  // however much is paged.
  var newFocus = this.topItem + this.visibleItems;

  this.pageTo(newTop, newFocus);
}

PagingList.prototype.pageTo = function(top, focus) {
  this.hideList();
  this.topItem = top;
  this.showList();

  this.moveFocusToItem(focus);
}

PagingList.prototype.moveFocusToItem = function(pos) {
  this.listItemElt[pos].focus();
}


PagingList.prototype.showList = function() {
  for (var li = this.topItem; li < this.topItem + this.visibleItems; li++) {
    this.listItemElt[li].style.display = "block";
  }
}

PagingList.prototype.hideList = function() {
  for (var li = this.topItem; li < this.topItem + this.visibleItems; li++) {
    this.listItemElt[li].style.display = "none";
  }
}






// Initialise the page.
function initPage() {
  var stateList = new PagingList("state-list");
  //var stateList = new ScrollingList("state-list");
  stateList.moveFocusToItem(0);
}

window.onload = initPage;

css:

/* Style sheet for paging-list.html */

body { 
  margin: 0;
  background-color: #fc6;
}

#state-list { 
  position: absolute;
  top: 100px;
  left: 20%;
}

.list { 
  margin: 0;
}

.list h1 { 
  display: none;
}

.list ul { 
  margin: 0;
  padding: 0;
}
.list li { 
  display: none; /* changed to display: block; by behaviour code */
  background-color: #da4;
  border: 2px solid #b82;
  margin: 0.25em 0;
  padding: 0 0.5em;
  font: bold 16pt sans-serif;
  width: 10em;
  -ant-user-input: enabled;
}

.list li:focus { 
  border: 2px solid #369;
  background-color: #69c;
  -ant-highlight-color: transparent;
}


/* These are created by the behavioural code. */
.pager { 
  -ant-user-input: enabled;
  height: 1px;
  background-color: transparent;
}
.pager:focus { 
  -ant-highlight-color: transparent;
}

/* Nothing extra */
.pager.up { 
}
.pager.down { 
}
 

 

前段时间看老外一个翻页的代码,今天改到这儿,又看了一遍,发现这段代码中有两点需要做下笔记:

 

一:

 

 

 this.idElt.insertBefore(this.downPager, this.listElt.nextSibling);

 

 

这里的nextSibling是js内置的对象,我的理解是紧挨着listELt的元素,但listElt只有一个元素,没有和它并列的元素,所以这里不太明白。

 

insertBefore类似于appendChild的功能,就是在父元素的子元素前面插入一个元素

 

 

parentElement.insertBefore( newElement, referenceElement);

 

 又google一下,发现这里有很多人会遇到问题,大概是firefox(IE不会,没有试验过)会把空格或者换行符当做一个dom对象来处理,所以在使用nextSlibling的时候得不到元素:

 

 

 写道
it's because Firefox considers the whitespace between element nodes to be text nodes (whereas IE does not) and therefore using .nextSibling on an element gets that text node in Firefox.

 

所以都会通过判断元素类型来处理:

 

 

/* 
   Credit to John Resig for this function 
   taken from Pro JavaScript techniques 
*/
function next(elem) {
    do {
        elem = elem.nextSibling;
    } while (elem && elem.nodeType != 1);
    return elem;                
}

var elem = document.getElementById('the_id');
var nextElem = next(elem); 

 或者:

 

Object.prototype.nextObject = function() {
var n = this;
do n = n.nextSibling;
while (n && n.nodeType != 1);
return n;
}

二:

   在js中给一个元素加入css的类,用空格代替样式表中的".":

 

 

  this.upPager = this.createPagerElt(function() { me.pageUp() },
				     this.id + "-pagerUp",
				     "pager up");
 

   这里的pager up 在css中是pager类下面的up类 .pager .up{} (不知道如果想要加以id为标示的css类该怎么加)

 

参考:

http://stackoverflow.com/questions/868407/hide-an-elements-next-sibling-with-javascript

http://roseindia.net/javascript/javascript-insertbefore-method.shtml

http://v3.thewatchmakerproject.com/journal/329/finding-html-elements-using-javascript-nextsibling-and-previoussibling

0
0
分享到:
评论

相关推荐

    课题-js和jquery获取父级元素、子级元素、兄弟元素的方法.pdf

    接下来,我们可以使用`childNodes`来获取所有子节点,`parentNode`获取父节点,`nextSibling`和`previousSibling`分别获取当前元素的下一个和上一个兄弟节点,`firstChild`和`lastChild`则分别获取第一个和最后一个...

    js与jquery获取父级元素,子级元素,兄弟元素的实现方法

    - `nextSibling`和`previousSibling`属性可以获取指定元素的下一个和上一个兄弟节点,同样会考虑文本节点。 ### jQuery获取元素的方法 jQuery提供了更为简洁和强大的方法来获取父级元素、子级元素和兄弟元素。 1...

    jQuery remove()过滤被删除的元素(推荐)

    在本文中,我们将深入探讨`remove()`方法的用法,特别是如何通过传递选择器来过滤要删除的元素。 ### `remove()`方法的基本用法 `remove()`方法的基本语法是`$(selector).remove()`。这里,`selector`是一个jQuery...

    操作Dom中的子元素与兄弟元素的代码

    2. `nextSibling`:返回当前元素的后一个兄弟元素。 在JavaScript中,我们可以利用这些属性来操作兄弟元素。例如,如果我们有一个ID为"s"的`&lt;span&gt;`元素,我们可以这样获取它的前一个兄弟元素: ```javascript var...

    JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法

    - `parents(expr)`:返回所有祖先元素,但可以使用表达式`expr`进行过滤。 例如: ```javascript $('span').parent(); // 获取的直接父元素 $('span').parents(); // 获取所有祖先元素 $('span').parents('.class')...

    05-DOM基础.pptx

    为了实现更复杂的筛选,可以编写函数来处理这些元素集合,根据特定条件过滤出需要的元素。 总的来说,DOM基础是JavaScript中进行动态网页开发的关键技能,通过熟练掌握DOM节点的操作和元素属性的控制,开发者可以...

    js Element Traversal规范中的元素遍历方法

    在没有Element Traversal规范的情况下,开发者可能需要编写复杂的循环来过滤掉文本节点,如下所示: ```javascript var i, len, child = element.firstChild; while (child != element.lastChild) { if (child....

    jsoup获取网页正文

    `Element`类提供了丰富的遍历和操作方法,如`children()`、`parent()`、`nextSibling()`、`prevSibling()`等,用于处理元素树结构。 8. **性能与最佳实践** - 为了提高效率,避免不必要的网络请求,可以缓存响应...

    DOM操作XML,XPATH技术

    2. **遍历节点**:通过`childNodes`、`firstChild`、`lastChild`、`nextSibling`和`previousSibling`属性来访问和遍历节点。 3. **查找节点**:`getElementById`、`getElementsByTagName`、`getElementsByClassName`...

    点击输入框弹出一个选择层js

    为了提高用户体验,我们还可以添加一些额外的功能,比如搜索过滤选项、键盘导航、动画效果等。同时,不要忘记通过CSS来调整选择层的样式,使其与页面设计保持一致。 总结来说,"点击输入框弹出一个选择层"的实现...

    JS操作XMLDOM(遍历和打印)

    `firstChild`和`lastChild`分别返回第一个和最后一个子节点,`nextSibling`和`previousSibling`用于移动到下一个或上一个兄弟节点。 3. **查找特定节点**:使用`getElementsByTagName`,`getElementById`或`...

    JS DOM 操作实现代码

    - `element.nextSibling`:获取元素的下一个兄弟节点。 - `element.previousSibling`:获取元素的上一个兄弟节点。 #### 获得节点信息 - `node.nodeName`:获取节点名称,对于元素节点返回标签名,属性节点返回属性...

    JS获取子节点、父节点和兄弟节点的方法实例总结

    因此,在使用时,可能需要借助正则表达式过滤掉这些非必要节点。 3. children属性提供了一个只包含元素节点的HTMLCollection。使用该属性获取子节点可以避免获取到非元素节点,是较为方便的方式。 4. firstChild和...

    document.documentElement的一些使用技巧

    使用`previousSibling` 和 `nextSibling`属性,可以访问当前元素的前一个或后一个兄弟节点。例如,`obody.previousSibling.nodeName`将返回`&lt;head&gt;`的`nodeName`,`ohead.nextSibling.nodeName`则返回`&lt;body&gt;`的`...

    UIcourse_lecture9:DOM遍历

    4. `nextSibling` 和 `previousSibling`: 返回当前节点的下一个或上一个兄弟节点。 5. `parentNode`: 返回当前节点的父节点。 三、DOM遍历进阶 除了基础方法外,还有一些高级遍历技术: 1. `querySelector` 和 `...

    JavaScript_DOM编程—新版学习笔记.txt

    - **`nextSibling`**: 下一个兄弟节点。 - **`previousSibling`**: 上一个兄弟节点。 - **`childNodes`**: 子节点列表。 - **`attributes`**: 元素的属性集合。 #### 三、浏览器兼容性处理 由于不同浏览器对 ...

    常用DOM整理

    通过过滤 `nodeType` 为1的节点,可以确保得到的是一致的元素节点集合。 例如: ```javascript function getElementChildren(element){ var children = [], oldChildNodes = element.childNodes; for(var i = 0,...

    asp下拉数据窗口

    margin-left:-169px" onchange="this.parentNode.nextSibling.value=this.value"&gt; ("ֶ")%&gt;"&gt;("ʾֶ")%&gt; (value.substring(0,1)=='-')value='';" onblur="if (value=='')value='';" style="width:100px;...

Global site tag (gtag.js) - Google Analytics