来自我的 cmets 的改编
要使用 hacky 样式注入,只需将以下代码放入脚本标记中。这会将https://platform.twitter.com/widgets.js 脚本标签添加到您的页面,因此您不再需要将其作为单独的脚本标签。
// widgets script loading taken from Twitter
window.twttr = (function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0],
t = window.twttr || {};
if (d.getElementById(id)) return;
js = d.createElement(s);
js.id = id;
js.src = "https://platform.twitter.com/widgets.js";
fjs.parentNode.insertBefore(js, fjs);
t._e = [];
t.ready = function (f) {
t._e.push(f);
};
return t;
}(document, "script", "twitter-wjs"));
twttr.ready(function (twttr) {
twttr.events.bind("rendered", function (event) {
var widgetFrame = event.target;
var retweets = widgetFrame.contentDocument.querySelectorAll('div.timeline-Tweet--isRetweet');
retweets.forEach(function (node) {
if (node.parentNode) { // (in)sanity check
node.parentNode.style = 'display: none;' // hide entire parent li tag
}
})
});
});
备注一下
我们将父节点视为每个div.timeline-Tweet--isRetweet 都位于li 标记中,这为您提供了边框,因此您最终会在隐藏转推后留下一些奇怪的双边框。我认为没有办法通过 CSS 选择器到达父级,所以我们必须使用代码来做到这一点。
另外说明
黑客攻击严重依赖于时间线内容的结构方式,并且这些内容可能会在没有 Twitter 通知的情况下发生变化,因此您冒着有一天醒来时会感到沮丧并在时间线中转发回推的风险 ;)
更新
好的,这里是 v2,它会在 ol 上收听更新……但写完之后我开始理解弗兰肯斯坦博士的感受 ;)
window.twttr = (function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0],
t = window.twttr || {};
if (d.getElementById(id)) return;
js = d.createElement(s);
js.id = id;
js.src = "https://platform.twitter.com/widgets.js";
fjs.parentNode.insertBefore(js, fjs);
t._e = [];
t.ready = function (f) {
t._e.push(f);
};
return t;
}(document, "script", "twitter-wjs"));
twttr.ready(function (twttr) {
twttr.events.bind("rendered", function (event) {
var frameDoc = event.target.contentDocument;
// initially hide retweets
var hideRetweets = function () {
var retweets = frameDoc.querySelectorAll('div.timeline-Tweet--isRetweet');
retweets.forEach(function (node) {
if (node.parentNode && node.parentNode.style !== 'display: none;') { // (in)sanity check
node.parentNode.style = 'display: none;' // hide entire parent li tag
}
});
};
hideRetweets();
// Twitter widget emitts no events on updates so we hook up ourselves to ol element to listen on it for additions of children
var watcher = new MutationObserver(function (mutations) {
// check whether new tweets arrived
var hasNewTweets = mutations.some(function (mutation) {
return mutation.addedNodes.length > 0;
});
if (hasNewTweets) {
hideRetweets(); // rescan all tweets as it is easier
}
});
watcher.observe(frameDoc.querySelector('ol.timeline-TweetList'), { childList: true });
});
});