Skip to content

Commit 7a18b43

Browse files
committed
One delegated event listener on the body
1 parent 96d22a3 commit 7a18b43

File tree

2 files changed

+67
-48
lines changed

2 files changed

+67
-48
lines changed

index.js

Lines changed: 66 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,25 @@ function findSelector(start, selector) {
9393
function findDemoWrapper(el) {
9494
while(el && el.parentNode) {
9595
if(matches.call(el.parentNode, '.demo_wrapper')) {
96-
var demoWrapper = el.parentNode;
97-
return demoWrapper;
96+
return el.parentNode;
9897
}
9998
el = el.parentNode;
10099
}
101100
}
102101

102+
function findPreForToolbarBtn(el) {
103+
while(el) {
104+
if (el.nodeName === "PRE") {
105+
return el;
106+
}
107+
if (matches.call(el, '.toolbar')) {
108+
el = findSelector(el, 'pre');
109+
} else {
110+
el = el.parentNode;
111+
}
112+
}
113+
}
114+
103115
function getStylesFromIframe(iframe) {
104116
var styles = iframe.contentDocument.documentElement.querySelectorAll("style");
105117
var cssText = "";
@@ -130,53 +142,60 @@ module.exports = function() {
130142
if (hasRunBtn) {
131143
var btn = document.createElement("button");
132144
btn.innerHTML = "Run";
133-
document.body.addEventListener('click', function (ev) {
134-
ev.stopPropagation();
135-
if (ev.target === btn) {
136-
if (!demoWrapper && matches.call(env.element.parentNode, 'pre')) {
137-
var language = env.language;
138-
var text = env.code;
139-
var data = types[language](text);
140-
if (data.js) {
141-
data.js = data.js.trim();
142-
}
143-
if (data.html) {
144-
data.html = data.html.trim();
145-
}
146-
if (data) {
147-
cleanCodePenData(data);
148-
if (window.CREATE_CODE_PEN) {
149-
CREATE_CODE_PEN(data);
150-
} else {
151-
createCodePen(data);
152-
}
153-
} else {
154-
console.warn('Unable to create a codepen for this demo');
155-
}
156-
}
157-
if (demoWrapper && matches.call(demoWrapper, '.demo_wrapper')) {
158-
var htmlCode = demoWrapper.querySelector('[data-for=html] code');
159-
var htmlText = htmlCode ? htmlCode.textContent.trim() : '';
160-
var jsCode = demoWrapper.querySelector('[data-for=js] code');
161-
var jsText = jsCode ? jsCode.textContent.trim() : '';
162-
var cssText = getStylesFromIframe(demoWrapper.querySelector('iframe'));
163-
var codePen = {
164-
html: htmlText,
165-
js: jsText,
166-
js_module: true,
167-
editors: '1011',
168-
css: cssText.trim()
169-
};
170-
cleanCodePenData(codePen);
171-
if (window.CREATE_CODE_PEN) {
172-
CREATE_CODE_PEN(codePen);
173-
} else {
174-
createCodePen(codePen);
175-
}
145+
btn.setAttribute("data-run", "");
146+
return btn;
147+
}
148+
});
149+
document.body.addEventListener('click', function (ev) {
150+
if (ev.target.getAttribute('data-run') != null) {
151+
var btn = ev.target;
152+
var demoWrapper = findDemoWrapper(btn);
153+
if (!demoWrapper) {
154+
var preElement = findPreForToolbarBtn(btn);
155+
var codeElement = preElement.querySelector("code");
156+
var language = codeElement.className.match(languageHTML)[1];
157+
var text = codeElement.textContent;
158+
159+
var data = types[language](text);
160+
161+
if(data.js) {
162+
data.js = data.js.trim();
163+
}
164+
if(data.html) {
165+
data.html = data.html.trim();
166+
}
167+
if(data) {
168+
cleanCodePenData(data);
169+
if(window.CREATE_CODE_PEN) {
170+
CREATE_CODE_PEN(data);
171+
} else {
172+
createCodePen(data);
176173
}
174+
175+
} else {
176+
console.warn("Unable to create a codepen for this demo");
177177
}
178-
});
179-
return btn;
178+
}
179+
if (demoWrapper && matches.call(demoWrapper, '.demo_wrapper')) {
180+
var htmlCode = demoWrapper.querySelector('[data-for=html] code');
181+
var htmlText = htmlCode ? htmlCode.textContent.trim() : '';
182+
var jsCode = demoWrapper.querySelector('[data-for=js] code');
183+
var jsText = jsCode ? jsCode.textContent.trim() : '';
184+
var cssText = getStylesFromIframe(demoWrapper.querySelector('iframe'));
185+
var codePen = {
186+
html: htmlText,
187+
js: jsText,
188+
js_module: true,
189+
editors: '1011',
190+
css: cssText.trim()
191+
};
192+
cleanCodePenData(codePen);
193+
if (window.CREATE_CODE_PEN) {
194+
CREATE_CODE_PEN(codePen);
195+
} else {
196+
createCodePen(codePen);
197+
}
198+
}
180199
}
181200
});
182201
};

test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ describe("bit-docs-html-codepen-link", function() {
271271
toolbars.forEach(function(toolbar) {
272272
var children = toolbar.children;
273273
assert.equal(toolbar.children.length, 2);
274-
assert.equal(children[children.length - 1].innerHTML, '<div class="toolbar-item"><button>Copy</button></div><div class="toolbar-item"><button>Run</button></div>');
274+
assert.equal(children[children.length - 1].innerHTML, '<div class="toolbar-item"><button>Copy</button></div><div class="toolbar-item"><button data-run="">Run</button></div>');
275275
});
276276
close();
277277
done();

0 commit comments

Comments
 (0)