IE7 + Prototype - добавление метода SELECT, за которым следует Element.addMethods () = нет метода SELECT - PullRequest
2 голосов
/ 01 декабря 2011

Я новичок в этом сайте, поэтому я прошу прощения, если форматирование этого вопроса выглядит как мусор.

В 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 добавляется, но не там, где при выполнении кода это происходит.

Любые мысли о том, как предотвратить удаление метода, специфичного для тега,используя приличный браузер?

1 Ответ

1 голос
/ 08 декабря 2011

Element.addMethods очевидно, не должен вызываться без аргументов, см. Документацию Element.addMethods . Кажется, что сам 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);
      }
    });
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...