Добавление функции в объект NodeList не работает в Firefox - PullRequest
2 голосов
/ 01 марта 2012

Я пытаюсь определить функцию для объекта NodeList. Это код:

if (!NodeList.prototype.filter){
  NodeList.prototype.filter = function(fun /*, thisp*/){
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();
    var res = new Array();
    var thisp = arguments[1];
    for (var i = 0; i < len; i++){
      if (i in this){
        var val = this[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, this))
        res.push(val);
    }
  }
  return res;
 };  
}

Это работает в Chrome, но не в Firefox. Firebug говорит, что «current_node.childNodes.filter не является функцией», когда я вызываю функцию:

nodes = current_node.childNodes.filter(filterByClass);

Странно то, что этот код:

if(typeof NodeList.prototype.filter == 'function')
    alert(NodeList.prototype.filter);

отображает код функции в обоих браузерах.

Он используется в HTML и включается так:

<script type="text/javascript" src="textselection.js"></script>

EDIT: Версия Firefox - 10.0.2 и S.O. Ubuntu 11.04

EDIT2: Я забыл один важный фактор ... он используется в iframe

Ответы [ 3 ]

0 голосов
/ 24 февраля 2013

Это очень странная причуда, с которой я столкнулся сегодня. Кажется, что Firefox и Chrome не любят функции с именем filter в HTMLCollection и NodeList, хотя эти прототипы, похоже, в любом случае не используют это имя. Я переименовал свои пользовательские функции в «Filter», и все заработало как шарм. Кстати, с Safari все в порядке с «фильтром».

0 голосов
/ 08 января 2016

Это работает в Firefox и Chrome , и это проще:

NodeList.prototype.myfilter = Array.prototype.filter;

Пример: , чтобы получить все divs с атрибутом id:

document.querySelectorAll("div").myfilter(function(el){return el.id || 0;})

Однако вам нужно определить myfilter для каждого кадра, где вы его используете.

0 голосов
/ 01 марта 2012

Изменения, внесенные в прототип объекта в одном кадре, не отражаются в других кадрах.Вам нужно будет включить ваш сценарий в каждый кадр, где вы хотите расширить NodeList.prototype.

Помните, что NodeList === window.NodeList и, во фрейме, window !== top.Таким образом, во фрейме window.NodeList !== top.NodeList.

Интересно, что для таких экземпляров, как Date, вы все равно можете воспользоваться преимуществами прототипа, если вы создаете экземпляр объекта, сначала ссылаясь на фрейм с расширенным прототипом,Например, если ваш родительский фрейм расширился Date, чтобы иметь метод .format(), вы можете сделать что-то подобное из дочернего фрейма:

var nowString = new parent.Date().format("MM/dd/yyyy h:mm:ss.fff TT");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...