Skip to content

Commit adeeb5c

Browse files
committed
Рефакторинг блока i-metrika
1 parent a5fc75a commit adeeb5c

File tree

14 files changed

+320
-74
lines changed

14 files changed

+320
-74
lines changed

blocks/i-metrika/i-metrika.bemhtml

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
block i-metrika {
2+
content: '<script type="text/javascript">(function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter13851124 = new Ya.Metrika({id:13851124, enableAll: true, ut:"noindex", webvisor:true}); } catch(e) {} }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f); } else { f(); } })(document, window, "yandex_metrika_callbacks");</script><noscript><div><img src="//mc.yandex.ru/watch/13851124?ut=noindex" style="position:absolute; left:-9999px;" alt="" /></div></noscript>'
3+
}

pages-fb/index/_index.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pages-fb/index/index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<!DOCTYPE html><html class="i-ua_js_no i-ua_css_standard"><head><meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7, IE=edge"/><title>Фото дня на Яндекс.Фотках</title><script>;(function(d,e,c,r){e=d.documentElement;c="className";r="replace";e[c]=e[c][r]("i-ua_js_no","i-ua_js_yes");if(d.compatMode!="CSS1Compat")e[c]=e[c][r]("i-ua_css_standart","i-ua_css_quirks")})(document);</script><link rel="stylesheet" href="_index.css"/><script src="//yandex.st/jquery/1.7.2/jquery.min.js"></script><script src="_index.js"></script></head><body class="b-page__body b-page"><div class="b-gallery i-bem" onclick="return {&quot;b-gallery&quot;:{&quot;gWidth&quot;:&quot;760&quot;,&quot;gHeight&quot;:&quot;520&quot;}}"><div class="b-fotorama__preloader">Загрузка данных...</div></div><div class="b-social__like"></div><div class="i-metrica"><script type="text/javascript">(function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter13851124 = new Ya.Metrika({id:13851124, enableAll: true, ut:"noindex", webvisor:true}); } catch(e) {} }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f); } else { f(); } })(document, window, "yandex_metrika_callbacks");</script><noscript><div><img src="//mc.yandex.ru/watch/13851124?ut=noindex" style="position:absolute; left:-9999px;" alt="" /></div></noscript></div></body></html>
1+
<!DOCTYPE html><html class="i-ua_js_no i-ua_css_standard"><head><meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7, IE=edge"/><title>Фото дня на Яндекс.Фотках</title><script>;(function(d,e,c,r){e=d.documentElement;c="className";r="replace";e[c]=e[c][r]("i-ua_js_no","i-ua_js_yes");if(d.compatMode!="CSS1Compat")e[c]=e[c][r]("i-ua_css_standart","i-ua_css_quirks")})(document);</script><link rel="stylesheet" href="_index.css"/><script src="//yandex.st/jquery/1.7.2/jquery.min.js"></script><script src="_index.js"></script></head><body class="b-page__body b-page"><div class="b-gallery i-bem" onclick="return {&quot;b-gallery&quot;:{&quot;gWidth&quot;:&quot;760&quot;,&quot;gHeight&quot;:&quot;520&quot;}}"><div class="b-fotorama__preloader">Загрузка данных...</div></div><div class="b-social__like"></div><div class="i-metrika"><script type="text/javascript">(function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter13851124 = new Ya.Metrika({id:13851124, enableAll: true, ut:"noindex", webvisor:true}); } catch(e) {} }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f); } else { f(); } })(document, window, "yandex_metrika_callbacks");</script><noscript><div><img src="//mc.yandex.ru/watch/13851124?ut=noindex" style="position:absolute; left:-9999px;" alt="" /></div></noscript></div></body></html>

pages-fb/index/index.js

+76-15
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,26 @@ function modFnsToProps(modFns, props, elemName) {
506506

507507
}
508508

509+
function buildCheckMod(modName, modVal) {
510+
511+
return modVal?
512+
Array.isArray(modVal)?
513+
function(block) {
514+
var i = 0, len = modVal.length;
515+
while(i < len)
516+
if(block.hasMod(modName, modVal[i++]))
517+
return true;
518+
return false;
519+
} :
520+
function(block) {
521+
return block.hasMod(modName, modVal);
522+
} :
523+
function(block) {
524+
return block.hasMod(modName);
525+
};
526+
527+
}
528+
509529
/** @namespace */
510530
this.BEM = $.inherit($.observable, /** @lends BEM.prototype */ {
511531

@@ -734,16 +754,16 @@ this.BEM = $.inherit($.observable, /** @lends BEM.prototype */ {
734754
if(this._processingMods[modId]) return _this;
735755

736756
var elemName,
737-
currentModVal = elem?
757+
curModVal = elem?
738758
_this._getElemMod(modName, elem, elemName = _this.__self._extractElemNameFrom(elem)) :
739759
_this.getMod(modName);
740760

741-
if(currentModVal === modVal) return _this;
761+
if(curModVal === modVal) return _this;
742762

743763
this._processingMods[modId] = true;
744764

745765
var needSetMod = true,
746-
modFnParams = [modName, modVal, currentModVal];
766+
modFnParams = [modName, modVal, curModVal];
747767

748768
elem && modFnParams.unshift(elem);
749769

@@ -753,7 +773,7 @@ this.BEM = $.inherit($.observable, /** @lends BEM.prototype */ {
753773

754774
!elem && needSetMod && (_this._modCache[modName] = modVal);
755775

756-
needSetMod && _this._afterSetMod(modName, modVal, elem, elemName);
776+
needSetMod && _this._afterSetMod(modName, modVal, curModVal, elem, elemName);
757777

758778
delete this._processingMods[modId];
759779
}
@@ -767,9 +787,11 @@ this.BEM = $.inherit($.observable, /** @lends BEM.prototype */ {
767787
* @protected
768788
* @param {String} modName имя модификатора
769789
* @param {String} modVal значение модификатора
790+
* @param {String} oldModVal старое значение модификатора
770791
* @param {Object} [elem] вложенный элемент
792+
* @param {String} [elemName] имя элемента
771793
*/
772-
_afterSetMod : function(modName, modVal, elem) {},
794+
_afterSetMod : function(modName, modVal, oldModVal, elem, elemName) {},
773795

774796
/**
775797
* Устанавливает модификатор у блока/вложенного элемента в зависимости от условия.
@@ -965,11 +987,12 @@ this.BEM = $.inherit($.observable, /** @lends BEM.prototype */ {
965987
var baseBlock = blocks[decl.baseBlock || decl.block] || this;
966988

967989
if(decl.modName) {
990+
var checkMod = buildCheckMod(decl.modName, decl.modVal);
968991
$.each(props, function(name, prop) {
969992
$.isFunction(prop) &&
970993
(props[name] = function() {
971994
var method;
972-
if(this.hasMod(decl.modName, decl.modVal)) {
995+
if(checkMod(this)) {
973996
method = prop;
974997
} else {
975998
var baseMethod = baseBlock.prototype[name];
@@ -1530,8 +1553,10 @@ function init(domElem, uniqInitId) {
15301553
processParams(params, domNode, blockName, uniqInitId);
15311554
var block = uniqIdToBlock[params.uniqId];
15321555
if(block) {
1533-
block.domElem = block.domElem.add(domElem);
1534-
$.extend(block.params, params);
1556+
if(block.domElem.index(domNode) < 0) {
1557+
block.domElem = block.domElem.add(domElem);
1558+
$.extend(block.params, params);
1559+
}
15351560
} else {
15361561
initBlock(blockName, domElem, params);
15371562
}
@@ -2162,10 +2187,11 @@ var DOM = BEM.DOM = BEM.decl('i-bem__dom',/** @lends BEM.DOM.prototype */{
21622187
* @private
21632188
* @param {String} modName имя модификатора
21642189
* @param {String} modVal значение модификатора
2165-
* @param {jQuery} [elem] DOM-элемент
2190+
* @param {String} oldModVal старое значение модификатора
2191+
* @param {jQuery} [elem] элемент
21662192
* @param {String} [elemName] имя элемента
21672193
*/
2168-
_afterSetMod : function(modName, modVal, elem, elemName) {
2194+
_afterSetMod : function(modName, modVal, oldModVal, elem, elemName) {
21692195

21702196
var _self = this.__self,
21712197
classPrefix = _self._buildModClassPrefix(modName, elemName),
@@ -2180,7 +2206,10 @@ var DOM = BEM.DOM = BEM.decl('i-bem__dom',/** @lends BEM.DOM.prototype */{
21802206
(needDel? '' : '$1' + classPrefix + modVal) + '$3') :
21812207
needDel || $(this).addClass(classPrefix + modVal);
21822208
});
2183-
elemName && this.dropElemCache(elemName, modName, modVal);
2209+
2210+
elemName && this
2211+
.dropElemCache(elemName, modName, oldModVal)
2212+
.dropElemCache(elemName, modName, modVal);
21842213

21852214
},
21862215

@@ -2726,14 +2755,16 @@ var DOM = BEM.DOM = BEM.decl('i-bem__dom',/** @lends BEM.DOM.prototype */{
27262755
* Хелпер для live-инициализации по инициализации другого блока
27272756
* @static
27282757
* @private
2758+
* @param {String} event имя события
27292759
* @param {String} blockName имя блока, на инициализацию которого нужно реагировать
27302760
* @param {Function} callback обработчик, вызываемый после успешной инициализации в контексте нового блока
27312761
* @param {String} findFnName имя метода для поиска
27322762
*/
2733-
_liveInitOnBlockInit : function(blockName, callback, findFnName) {
2763+
_liveInitOnBlockEvent : function(event, blockName, callback, findFnName) {
27342764

27352765
var name = this._name;
2736-
blocks[blockName].on('init', function(e) {
2766+
2767+
blocks[blockName].on(event, function(e) {
27372768
var blocks = e.block[findFnName](name);
27382769
callback && blocks.forEach(function(block) {
27392770
callback.call(block);
@@ -2743,29 +2774,59 @@ var DOM = BEM.DOM = BEM.decl('i-bem__dom',/** @lends BEM.DOM.prototype */{
27432774

27442775
},
27452776

2777+
/**
2778+
* Хелпер для live-инициализации по событию другого блока на DOM-элементе текущего
2779+
* @static
2780+
* @protected
2781+
* @param {String} event имя события
2782+
* @param {String} blockName имя блока, на инициализацию которого нужно реагировать
2783+
* @param {Function} callback обработчик, вызываемый после успешной инициализации в контексте нового блока
2784+
*/
2785+
liveInitOnBlockEvent : function(event, blockName, callback) {
2786+
2787+
return this._liveInitOnBlockEvent(event, blockName, callback, 'findBlocksOn');
2788+
2789+
},
2790+
2791+
/**
2792+
* Хелпер для live-инициализации по событию другого блока внутри текущего
2793+
* @static
2794+
* @protected
2795+
* @param {String} event имя события
2796+
* @param {String} blockName имя блока, на инициализацию которого нужно реагировать
2797+
* @param {Function} [callback] обработчик, вызываемый после успешной инициализации в контексте нового блока
2798+
*/
2799+
liveInitOnBlockInsideEvent : function(event, blockName, callback) {
2800+
2801+
return this._liveInitOnBlockEvent(event, blockName, callback, 'findBlocksOutside');
2802+
2803+
},
2804+
27462805
/**
27472806
* Хелпер для live-инициализации по инициализации другого блока на DOM-элементе текущего
2807+
* @deprecated использовать liveInitOnBlockEvent
27482808
* @static
27492809
* @protected
27502810
* @param {String} blockName имя блока, на инициализацию которого нужно реагировать
27512811
* @param {Function} callback обработчик, вызываемый после успешной инициализации в контексте нового блока
27522812
*/
27532813
liveInitOnBlockInit : function(blockName, callback) {
27542814

2755-
return this._liveInitOnBlockInit(blockName, callback, 'findBlocksOn');
2815+
return this.liveInitOnBlockEvent('init', blockName, callback);
27562816

27572817
},
27582818

27592819
/**
27602820
* Хелпер для live-инициализации по инициализации другого блока внутри текущего
2821+
* @deprecated использовать liveInitOnBlockInsideEvent
27612822
* @static
27622823
* @protected
27632824
* @param {String} blockName имя блока, на инициализацию которого нужно реагировать
27642825
* @param {Function} [callback] обработчик, вызываемый после успешной инициализации в контексте нового блока
27652826
*/
27662827
liveInitOnBlockInsideInit : function(blockName, callback) {
27672828

2768-
return this._liveInitOnBlockInit(blockName, callback, 'findBlocksOutside');
2829+
return this.liveInitOnBlockInsideEvent('init', blockName, callback);
27692830

27702831
},
27712832

pages-mr/index/_index.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pages-mr/index/index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<!DOCTYPE html><html class="i-ua_js_no i-ua_css_standard"><head><meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7, IE=edge"/><title>Фото дня на Яндекс.Фотках</title><script>;(function(d,e,c,r){e=d.documentElement;c="className";r="replace";e[c]=e[c][r]("i-ua_js_no","i-ua_js_yes");if(d.compatMode!="CSS1Compat")e[c]=e[c][r]("i-ua_css_standart","i-ua_css_quirks")})(document);</script><link rel="stylesheet" href="_index.css"/><script src="//yandex.st/jquery/1.7.2/jquery.min.js"></script><script src="//cdn.connect.mail.ru/js/loader.js"></script><script src="_index.js"></script></head><body class="b-page__body b-page"><div class="b-gallery i-bem" onclick="return {&quot;b-gallery&quot;:{&quot;gWidth&quot;:&quot;760&quot;,&quot;gHeight&quot;:&quot;520&quot;}}"><div class="b-fotorama__preloader">Загрузка данных...</div></div><div class="b-social"><div class="b-social__like"></div></div><div class="i-metrica"><script type="text/javascript">(function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter13851124 = new Ya.Metrika({id:13851124, enableAll: true, ut:"noindex", webvisor:true}); } catch(e) {} }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f); } else { f(); } })(document, window, "yandex_metrika_callbacks");</script><noscript><div><img src="//mc.yandex.ru/watch/13851124?ut=noindex" style="position:absolute; left:-9999px;" alt="" /></div></noscript></div></body></html>
1+
<!DOCTYPE html><html class="i-ua_js_no i-ua_css_standard"><head><meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7, IE=edge"/><title>Фото дня на Яндекс.Фотках</title><script>;(function(d,e,c,r){e=d.documentElement;c="className";r="replace";e[c]=e[c][r]("i-ua_js_no","i-ua_js_yes");if(d.compatMode!="CSS1Compat")e[c]=e[c][r]("i-ua_css_standart","i-ua_css_quirks")})(document);</script><link rel="stylesheet" href="_index.css"/><script src="//yandex.st/jquery/1.7.2/jquery.min.js"></script><script src="//cdn.connect.mail.ru/js/loader.js"></script><script src="_index.js"></script></head><body class="b-page__body b-page"><div class="b-gallery i-bem" onclick="return {&quot;b-gallery&quot;:{&quot;gWidth&quot;:&quot;760&quot;,&quot;gHeight&quot;:&quot;520&quot;}}"><div class="b-fotorama__preloader">Загрузка данных...</div></div><div class="b-social"><div class="b-social__like"></div></div><div class="i-metrika"><script type="text/javascript">(function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter13851124 = new Ya.Metrika({id:13851124, enableAll: true, ut:"noindex", webvisor:true}); } catch(e) {} }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f); } else { f(); } })(document, window, "yandex_metrika_callbacks");</script><noscript><div><img src="//mc.yandex.ru/watch/13851124?ut=noindex" style="position:absolute; left:-9999px;" alt="" /></div></noscript></div></body></html>

0 commit comments

Comments
 (0)