iframe2link
by
noromanba
2016-02-29 [2016/02/29 06:20:18]
replace iframe to anchor link
@@ -1,15 +1,46 @@
/*
* @title iframe2link
* @description replace iframe to anchor link
- * @include http://*
- * @include https://*
+ * @include http://example.com/DIY/*
* @license MIT http://opensource.org/licenses/MIT
* @javascript_url
*/
-Array.prototype.forEach.call(document.body.querySelectorAll('iframe[src]:not([src^="javascript:"])'), function (iframe) {
- var link = document.createElement('a');
- link.href = iframe.src;
- link.appendChild(document.createTextNode(link.href));
- iframe.parentNode.replaceChild(link, iframe);
-});
+// UserScript
+// https://gist.github.com/noromanba/26d1804fac23f76d9dfc
+
+// ready to use @run-at document-start
+
+(() => {
+ const whitelist = [
+ '[src^="javascript:"]',
+ '[src^="http://www.facebook.com/"]',
+ // #twitter-widget-* .twitter-share-button .twitter-tweet-button
+ '[class|="twitter"]',
+ ].map(sel => ':not(' + sel + ')').join('');
+
+ const replace = (ctx) => {
+ if (ctx.tagName.toLowerCase() === 'iframe') {
+ ctx = ctx.parentNode || document.body;
+ }
+
+ Array.from(ctx.querySelectorAll('iframe[src]' + whitelist)).forEach(iframe => {
+ const link = document.createElement('a');
+ link.href = iframe.src;
+ link.appendChild(document.createTextNode(link.href));
+
+ iframe.parentNode.replaceChild(link, iframe);
+ });
+ };
+ replace(document.body);
+
+ new MutationObserver(records => {
+ records.forEach(record => {
+ const ctx = record.target;
+ if (!ctx.tagName || !ctx.querySelectorAll) return;
+
+ replace(ctx);
+ });
+ }).observe(document.body, { childList: true, subtree: true });
+})();
+
/*
* @title iframe2link
* @description replace iframe to anchor link
* @include http://example.com/DIY/*
* @license MIT http://opensource.org/licenses/MIT
* @javascript_url
*/
// UserScript
// https://gist.github.com/noromanba/26d1804fac23f76d9dfc
// ready to use @run-at document-start
(() => {
const whitelist = [
'[src^="javascript:"]',
'[src^="http://www.facebook.com/"]',
// #twitter-widget-* .twitter-share-button .twitter-tweet-button
'[class|="twitter"]',
].map(sel => ':not(' + sel + ')').join('');
const replace = (ctx) => {
if (ctx.tagName.toLowerCase() === 'iframe') {
ctx = ctx.parentNode || document.body;
}
Array.from(ctx.querySelectorAll('iframe[src]' + whitelist)).forEach(iframe => {
const link = document.createElement('a');
link.href = iframe.src;
link.appendChild(document.createTextNode(link.href));
iframe.parentNode.replaceChild(link, iframe);
});
};
replace(document.body);
new MutationObserver(records => {
records.forEach(record => {
const ctx = record.target;
if (!ctx.tagName || !ctx.querySelectorAll) return;
replace(ctx);
});
}).observe(document.body, { childList: true, subtree: true });
})();
- Permalink
- このページへの個別リンクです。
- RAW
- 書かれたコードへの直接のリンクです。
- Packed
- 文字列が圧縮された書かれたコードへのリンクです。
- Userscript
- Greasemonkey 等で利用する場合の .user.js へのリンクです。
- Loader
- @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
- Metadata
- コード中にコメントで @xxx と書かれたメタデータの JSON です。