2014-02-14 22 views
0

Я хочу построить прокладку. У меня есть следующая прокладка, которая исключает только один раз и должна давать возвращаемое значение другим функциям. Это немного похоже на то, что http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/.возвращаемое значение анонимной функции

// WAY 1 
matches: function(){ 
     return Element.prototype.matchesSelector 
     || Element.prototype.webkitMatchesSelector 
     || Element.prototype.mozMatchesSelector 
     || Element.prototype.msMatchesSelector 
     || Element.prototype.oMatchesSelector 
     || Element.prototype.matches 
     || Element.prototype.webkitMatches 
     || Element.prototype.mozMatches 
     || Element.prototype.msMatches 
     || Element.prototype.oMatches; 
    }(), 

Теперь я хочу, чтобы использовать возвращаемое значение других функций:

Однако я не могу получить возвращаемое значение спичек, потому что он с анонимной функцией.

Это будет работать только, если я не Выполнение выражений функции сразу:

// WAY 2 
matches: function(){ 
    return Element.prototype.matchesSelector 
    || Element.prototype.webkitMatchesSelector 
    || Element.prototype.mozMatchesSelector 
    || Element.prototype.msMatchesSelector 
    || Element.prototype.oMatchesSelector 
    || Element.prototype.matches 
    || Element.prototype.webkitMatches 
    || Element.prototype.mozMatches 
    || Element.prototype.msMatches 
    || Element.prototype.oMatches; 
}, 

// Now it works, but the method is executed every time. 
if(matches('ul')){ 
... 
} 

Как я могу сделать «WAY 1» работу?

+0

Что-то неясно, особенно в отношении 'if (matches ('ul')) {': как вы справляетесь с вызовом функции с соответствующим контекстом? –

+0

Я завернул «согласованную» -функцию внутри объекта DomUtil {matches: function()); ...}. Вызов if (DomUtil.matches ('ul')) выполняется в обработчике щелчка после загрузки dom. Тем не менее, он работает только, если я использую WAY 2 вместо WAY 1. Однако WAY 2, excecutes функция каждый раз, когда она вызывается, что бесполезно, потому что возвращаемое значение не отличается после выполнения. Следовательно, я хочу сделать «ПУТЬ 1» для работы. – nimo23

ответ

1

как вы уже упоминали, у вас есть глобальный объект с именем DOM, используя его, вы можете сделать это нравится:

matches: (DOM._getMatches = function(){ 
    return Element.prototype.matchesSelector 
    || Element.prototype.webkitMatchesSelector 
    || Element.prototype.mozMatchesSelector 
    || Element.prototype.msMatchesSelector 
    || Element.prototype.oMatchesSelector 
    || Element.prototype.matches 
    || Element.prototype.webkitMatches 
    || Element.prototype.mozMatches 
    || Element.prototype.msMatches 
    || Element.prototype.oMatches; 
})(), 

затем вызвать _getMatches всякий раз, когда вы хочу:

DOM._getMatches() 

Если у вас есть другие глобальные ob ject в вашем коде, вы можете использовать его вместо DOM.

+0

Проблема заключается в том, что метод не работает как метод 'window'. – Quentin

+0

Вышеупомянутое решение работает, однако оно имеет некоторые недостатки. У меня есть что-то вроде этого: var DOM = {}; DOM.util = function () {}; DOM.util.prototype = {matchesNode: ...}. У вас есть функция matchNode в прототипе моего Dom.util. Использование чего-то вроде этого не работает: matches: (Dom.util.prototype ._getMatches = function() {..} ... Я не хочу использовать другой объект (окно) только для хранения возвращаемого значения совпадений, совпадения должны оставаться в Dom.util. – nimo23

+0

Это работает: соответствует: "matches = (DOM._getMatches = function() {.. "Это не работает:" matches = (DOM.util._getMatches = function() {.. ", Это также не работает" matches = (DOM.util.prot otype._getMatches = function() {.. "Почему это не работает? – nimo23

2

Вы делаете это слишком сложным. Просто выполните это:

matches: Element.prototype.matchesSelector 
    || Element.prototype.webkitMatchesSelector 
    || Element.prototype.mozMatchesSelector 
    || Element.prototype.msMatchesSelector 
    || Element.prototype.oMatchesSelector 
    || Element.prototype.matches 
    || Element.prototype.webkitMatches 
    || Element.prototype.mozMatches 
    || Element.prototype.msMatches 
    || Element.prototype.oMatches; 
+0

Это упрощает исходный код, но на самом деле это не решает проблему. То же самое значение применяется к 'match', поэтому, когда он вызывается, вы получите ту же ошибку. – Quentin

0

Анонимная функция - это функция, которая возвращает другую функцию.

В первом случае вы вызываете его и сохраняете возвращаемую функцию на matches. Затем вы вызываете эту возвращенную функцию позже.

Проблема заключается в том, что целью этой функции является сравнение HTML-элемента, хранящегося в this, с селектором, который вы передаете в качестве аргумента.

При вызове matches('ul') значение this является window (или undefined в строгом режиме). Это не элемент HTML.

Вам нужно что-то подобное:

matches.apply(document.getElementById('something_that_might_be_a_list', 'ul'); 
+0

Архитектура слоя прокладки в http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ такая же, как у меня. Что отличает то, что я не сохраняю соответствия() для окна или документа-объекта. Но я думаю, это не причина для того, чтобы не работать. – nimo23

+0

@ nimo23 - Как я объяснил в этом ответе, сохранение совпадений на другом виде объекта именно поэтому не работает. – Quentin

+0

Решение Mehran действительно работает, но только если этот объект создан до вызова функции-матчей. Это работает: var test = {}; matches: (test._getMatches = function() {... Однако я хочу сохранить этот метод в функции прототипов: DOM.util.prototype._getMatches = function() {.. "Это, к сожалению, не работает. – nimo23

Смежные вопросы