如何实现IE8的node.localName等效< =?

时间:2012-11-21 08:34:46

标签: javascript jquery internet-explorer local-storage

我想为我的lib garlicjs.org添加一些旧的浏览器支持。

我发现我的一个主要功能getPath依赖于IE8上不支持的localName< =

在该函数中,我需要为我的lib绑定的每个DOM元素获取唯一的标识符字符串,更重要的是,不依赖于id,类或名称。

我可以管理:为旧IE浏览器支持此属性,或者,使用所有浏览器支持的其他属性,可以管理的功能与此功能相同。

谢谢!

以下是代码:

/* retuns an unique identifier for form elements, depending on their behaviors:
   * radio buttons: domain > pathname > form.<attr.name>[:eq(x)] > input.<attr.name>
      no eq(); must be all stored under the same field name inside the same form

   * checkbokes: domain > pathname > form.<attr.name>[:eq(x)] > [fieldset, div, span..] > input.<attr.name>[:eq(y)]
      cuz' they have the same name, must detect their exact position in the form. detect the exact hierarchy in DOM elements

   * other inputs: domain > pathname > form.<attr.name>[:eq(x)] > input.<attr.name>[:eq(y)]
      we just need the element name / eq() inside a given form
*/
, getPath: function () {

  // Requires one element.
  if ( this.$element.length != 1 ) {
    return false;
  }

  var path = ''
    , fullPath = this.$element.is( 'input[type=checkbox]')
    , node = this.$element;

  while ( node.length ) {
    var realNode = node[0]
      , name = realNode.localName;

    if ( !name ) {
      break;
    }

    name = name.toLowerCase();

    var parent = node.parent()
      , siblings = parent.children( name );

    // don't need to pollute path with select, fieldsets, divs and other noisy elements,
    // exept for checkboxes that need exact path, cuz have same name and sometimes same eq()!
    if ( !$( realNode ).is( 'form, input, select, textarea' ) && !fullPath ) {
      node = parent;
      continue;
    }

    // set input type as name + name attr if exists
    name += $( realNode ).attr( 'name' ) ? '.' + $( realNode ).attr( 'name' ) : '';

    // if has sibilings, get eq(), exept for radio buttons
    if ( siblings.length > 1 && !$( realNode ).is( 'input[type=radio]' ) ) {
      name += ':eq(' + siblings.index( realNode ) + ')';
    }

    path = name + ( path ? '>' + path : '' );

    // break once we came up to form:eq(x), no need to go further
    if ( 'form' == realNode.localName ) {
      break;
    }

    node = parent;
  }

  return 'garlic:' + document.domain + ( this.options.domain ? '*' : window.location.pathname ) + '>' + path;
}

1 个答案:

答案 0 :(得分:0)

好的,我使用了nodeName属性,而且它正在运行。