我是这个网站的新手,如果这个问题的格式看起来像垃圾,我深表歉意。

在IE7中,当我用原型的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方法的添加方式,而不是在执行代码的位置进行控制。

关于如何防止这种方法删除标记特定的方法(是否使用其他不错的浏览器),您有何想法?

最佳答案

显然,不应在没有参数的情况下调用Element.addMethods,请参见Element.addMethods documentation。 Prototype本身似乎在内部使用它来最初添加Prototype扩展,但是再次调用它似乎可以在IE中恢复新的原型,从而删除您自己的所有扩展。

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


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

Element.addMethods({});

在您的代码中修补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);
  }
});

07-24 09:44