IE7 + Prototype - 添加SELECT方法,后跟Element.addMethods()= no SELECT方法

时间:2011-12-01 17:35:03

标签: javascript internet-explorer prototypejs

我是这个网站的新用户,所以如果这个问题的格式看起来像垃圾,我道歉。

在IE7中,当我使用Prototype的SELECT添加Element.addMethods方法,然后再次调用Element.addMethods时,我添加的方法就消失了。

示例:

<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js"></script>
<script type="text/javascript">
Element.addMethods(
  'SELECT', 
  {
    getSelected : function(elem){
      elem = $(elem);
      if(!elem.multiple){
        return elem.options[elem.selectedIndex] ? $(elem.options[elem.selectedIndex]) : null;
      }
      return $A(elem.options).findAll(function(option){return option.selected;}).map(Element.extend);
    }
  } 
);
Element.addMethods();
function displayResult(elem){
  var selected = $(elem).getSelected();
  if(Object.isArray(selected)){
    var ret = '';
    selected.each(function(optionElem){
        ret += (ret ? ', ' : '') + option.innerHTML;
    })
    alert('['+ret+']');
  }
  else {
    alert(selected.innerHTML);
  }
}
</script>
</head>
<body>

<form>
Select your favorite fruit:
<select id="mySelect">
  <option>Apple</option>
  <option>Orange</option>
  <option>Pineapple</option>
</select>
</form>
<input type='button' value='Display' onclick='displayResult("mySelect")'>
</body>
</html>

我意识到在这个例子中,对Element.addMethods()的调用是多余的,但是它来自一个我无法访问更新的库。但是,我确实可以控制SELECT方法的添加方式,而不是执行代码执行的位置。

有关如何防止这种方法删除特定于标签的方法的任何想法,其他使用体面的浏览器?

1 个答案:

答案 0 :(得分:1)

显然不应该在没有参数的情况下调用{p> Element.addMethods,请参阅Element.addMethods documentation。 Prototype本身似乎在内部使用它来初始添加Prototype扩展,但再次调用它似乎在IE中恢复了一个新的原型,从而删除了所有自己的扩展。

我看到两种可能的解决方法:

  1. 如果您有权访问Element.addMethods();行,请将其删除或替换为

    Element.addMethods({});
    
  2. 在您的代码中修补Element.addMethods以阻止空来电话,例如在getSelected定义之前或之后(但在Element.addMethods();之前)行插入以下重新定义:

    Element.addMethods = Element.addMethods.wrap(function(callOriginal) {
      if (arguments.length == 1) {
        callOriginal.call(Element, {});
      } else {
        var args = $A(arguments);
        args.shift();
        callOriginal.apply(Element, args);
      }
    });