- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
注意:这是对my previous one的后续问题。
我决定通过#posts
元素内的扩展程序将帖子显示在仪表板上。现在我的问题是 Tumblr在滚动时会自动删除帖子的内容。
这是删除之前的普通帖子的示例:
<li class="post_container" data-pageable="post_110141415125">
<div class="post post_full ..." [...]>
<!-- ... -->
</div>
</li>
<li class="post_container" data-pageable="post_110141415125" style="border-radius: 3px; height: 207px; width: 540px; background-color: rgb(255, 255, 255);">
</li>
.post
中的DOM元素?removeChild
方法添加了此注入(inject)代码:function addScript(){
var script = document.createElement('script');
script.id = 'newRemoveChildScript'; ///just to find is faster in the code
script.src = chrome.extension.getURL("injectedCode.js");
$($('script')[0]).before(script); ///Script is indeed present, I checked that
}
window.onload = addScript;
injectedCode.js
文件,如下所示:(function (obj, method) {
function isPost(el) {
return (/^post_\d+$/.test(el.id) && ~el.className.indexOf('post'));
}
obj[method] = (function (obj_method) {
return function (child) {
if (isPost(child)) return child;
return obj_method.apply(this, arguments);
}
}(obj[method]));
}(Element.prototype, 'removeChild'));
最佳答案
劫持Tumblr仪表板行为
免责声明:此处完全合法,请不要惊慌!
您要问的是并不是一件容易的事,但是实际上您可以阻止Tumblr在离开视口(viewport)时在滚动时隐藏帖子。更准确地说,高级程序员实际上可以操纵任何Tumblr方法,使其表现出所需的状态,但是,现在,让我们集中讨论您的问题。
为什么Tumblr在滚动时会删除帖子?
Tumblr删除了帖子的内容,使页面变淡,并且由于包含大量元素,您可以继续浏览而不会出现任何滞后和/或滚动。想象一下,连续向下滚动一个小时:您的破折号将包含数千个帖子,并且由于每次滚动都必须移动过多的内容,因此浏览器可能会冻结。
Tumblr如何做到这一点?
我没有检查和理解Tumblr代码的每一行,因为它们都是打包的/最小化的,而且实际上不可能理解任何方法的一行(除非您在Tumblr工作,在这种情况下,恭喜您),但是,基本上,我放了一些DOM breakpoints,并且检查了将帖子移出视口(viewport)时删除帖子的部分代码。
简而言之,这就是它的作用:
li.post_container
元素上的 DOM断点,您将能够看到这些侦听器位于dashboard.js
JavaScript文件中。function j(t,v) { try{ t.removeChild(v) } catch(u){} }
其中t
是li.post_container
和v
是其子代:div#post_[id]
。div#post_[id]
中删除了li.post_container
元素。#posts
元素的高度,该元素保存所有帖子,否则删除帖子的内容会使页面向下滚动H
像素,其中H是高度被删除的职位。index.js
中,并且我什至没有仔细研究它,因为它根本无法阅读:<li class="post_container" [...]>
<div id="post_[id]" class="post post_full ..." [...]>
<!-- post body... -->
</div>
</li>
对此:<li class="post_container" [...] style="border-radius: 3px; height: Hpx; width: Wpx; background-color: rgb(255, 255, 255);">
</li>
防止Tumblr代码删除帖子(确实有些小技巧)!important
防止内联样式覆盖它们。这是我们要添加的CSS:li.post_container {
height: auto !important;
width: 540px !important;
/* 540px is the default width
* change it to any amount that applies to your layout
*/
}
或者,使用JavaScript,我们可以执行以下操作:var s = document.createElement('style');
s.textContent = 'li.post_container{height:auto!important;width:540px!important;}';
document.head.appendChild(s);
防止删除帖子:简便(愚蠢)方式removeChild
的Element.prototype
方法,并将其命名为_removeChild
。Element.prototype._removeChild = Element.prototype.removeChild
Element.prototype.removeChild = function(child) {
// Check if the element is a post (e.g. the id looks like "post_123456...")
if (/^post_\d+$/.test(child.id)) {
// If so, stop here by returning the post
// This will make Tumblr believe the post has been removed
return child;
}
// Otherwise the element isn't a post, so we can remove it
return Element.prototype._removeChild.apply(this, arguments);
}
代码长度,无注释:5行post
和post_full
类,或者它的parentElement
是否具有post_container
类,依此类推……由您决定。Element.prototype.removeChild
方法。这是我们要做的:Element.prototype.removeChild
方法,为其添加一个“过滤器”。isPost()
),以过滤将要删除的元素。Element.prototype.removeChild
方法,使其表现如下:isPost()
检查元素以删除。Element.prototype.removeChild
方法调用原始.apply
方法。(function (obj, method) {
// This is all wrapped inside a closure
// to make the new removeChild method remember the isPost function
// and maintain all the work invisible to the rest of the code in the page
function isPost(el) {
// Check if the element is a post
// This will return true if el is a post, otherwise false
return (/^post_\d+$/.test(el.id) && ~el.className.indexOf('post'));
}
// Edit the Element.prototype.removeChild assigning to it our own function
obj[method] = (function (obj_method) {
return function (child) {
// This is the function that will be assigned to removeChild
// It is wrapped in a closure to make the check before removing the element
// Check if the element that is going to be removed is a post
if (isPost(child)) return child;
// If so, stop here by returning the post
// This will make Tumblr believe the post has been removed
// Otherwise continue and remove it
return obj_method.apply(this, arguments);
}
}(obj[method]));
}(Element.prototype, 'removeChild'));
代码长度,不带注释:11行window
对象中工作,因此内容脚本代码无法与页面代码交互,因此您必须将代码直接从内容脚本插入页面中。为此,您需要创建一个<script>
元素并将其插入页面的<head>
中。您可以将要注入(inject)的代码存储在新脚本中(我们将其称为injectedCode.js
),然后使用chrome.runtime.getURL
获取要在<script>
src中使用的绝对URL。injectedCode.js
文件添加到"web_accessible_resources"
中的 manifest.json
field中,以使其可从Tumblr访问,如下所示:"web_accessible_resources": ["/injectedCode.js"]
然后,您可以创建一个<script>
,将.src
设置为您的injectedCode.js
,如下所示:/* In your content script: */
var s = document.createElement('script');
s.src = chrome.extension.getURL("/injectedCode.js");
document.head.appendChild(s);
尾注MutationObserver
来检查子树的修改,删除所有帖子并使用新的个人事件和方法创建新的容器来模仿Tumblr的事件,插入Tumblr代码并直接对其进行编辑(几乎不可能,合法性不高),依此类推。关于javascript - 防止在Tumblr仪表板上删除DOM元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28338450/
我正在查看 Tumblr API但难以理解是否可以使用它在 Tumblr 中进行全局搜索,而不是针对特定用户? 这是我想收集的信息: 10 个左右评论最多的帖子,全局所有用户 10 个左右最受欢迎的帖
当我在 tumblr 上分享链接时,它有时会抓取页面的博客文章图片。例如,如果我分享以下内容: http://www.smartpassiveincome.com/income-reports/my-
在仪表板上,Tumblr 帖子按它们的创建顺序显示(无论附加日期如何)。但是在前端(例如在 mysite.tumblr.com),我看到帖子的顺序不一致 具有相同的发布日期和时间 . 在 Tumblr
我正在尝试更改 Tumblr 上标记的页面 的样式(如收集所有特定标签的页面 - example)。目前所有标记的页面看起来都一样。这是我用过的代码 - {block:TagPage}
做一个自定义的 Tumblr 主题,它将混合常见的 Tumblr 帖子类型(文本、图片、链接等)。 我还想偶尔做一个特殊的帖子类型,以展示我的摄影作品,但我不想调整它的大小,而是希望以高分辨率展示照片
我经常在 tumblr 中自定义主题,但是这个编辑器很糟糕。在 Linux (Ubuntu) 操作系统下,在 tumblr 中创建主题有更好的可能性吗? 我正在考虑使用vim。但是我必须将文本复制到v
我希望让我的 Tumblr 博客对移动设备更友好,我想在桌面主题旁边使用移动主题。 我看到我可以为移动设备使用默认的移动主题,但是有没有办法让我自定义移动主题,但仍然保留桌面的常规主题? 最佳答案 只
我正在为一位想要使用 Tumblr 的 Photoset 功能创建作品集网站的婚礼摄影师设计一个主题。 如何从照片集中提取第一张图像,以便创建一个带有链接到每个照片集的单个缩略图预览(大小取决于我的选
我目前有 About和 Contact部分。现在我想添加新闻部分,但是是否可以直接在其中添加帖子而不显示在您博客的首页上?谢谢你! ^_^ 最佳答案 您可以创建实际上是单个帖子的自定义页面,并根据需要
在 tumblr 中,是否可以在主页中只显示带有特定标签的帖子? 如果是这样,它是如何完成的? 最佳答案 我刚刚在这里写了相反问题的解决方案: How to hide the posts with a
他们的文档根本不清楚 站点上根本没有任何标记为“API key ”的地方,但有 消费者 key : 消费者 secret : token : token_secret: 最佳答案 在 Tumblr 注
在通过 v2 API 发布到 Tumblr 时,我不断收到 401,但没有进一步解释错误是什么。 请求如下 - 添加换行符以提高可读性 POST http://api.tumblr.com/v2/bl
我对使用 tumblr 写博客很感兴趣,我发现了一个很棒的响应式主题,但我想知道是否可以删除“在 Tumblr 应用程序中打开”消息,我该怎么做。 openapptumblr 我是 stackover
这写在示例输出( objective-c )中: { "meta": { "status": 401, "msg": "Not Authorized" }, "response": [] } 可能是什
在构建 Tumblr 主题时,我的服务器上有一个外部 .css,这非常方便,因为我可以直接在我的编辑器中工作,保存到我的服务器并刷新以查看我的结果。 但是,如果我需要更改主题的 HTML,我一直在编辑
我似乎找不到任何关于如何更改 tumblr guide 上看似新的“.../image/...”页面的说明。 (在“基本变量”下) 例如,在更改“.../post/...”页面时,我可以使用“{blo
我已使用下面的代码获取特定用户的关注者。但有时某些 tumblr 博客没有从响应中显示出来。 $oauth = new OAuth($conskey,$conssec); $oauth->fetch(
我希望我的 Tumblr 主页显示一个由“精选”标签选择的问题/答案帖子,或者更确切地说是标记为“精选”的最新问题/答案帖子。我没有看到任何内置的 Tumblr 标签可以做到这一点。 最佳答案 默认情
我到处寻找这个答案 - 考虑到在我无限的谷歌搜索中阅读到的关于 Tumblr API 的所有复杂内容,我想这会很简单。 我想做的就是在我的 tumblr 索引页面上的一个小框中显示帖子总数。 例如帖子
我有几个博客链接到我的 Tumblr 帐户,但是 bookmarklet总是选择我的“主要”博客(列表中的第一个)。 如何修改小书签以使其自动选择特定博客?我想要多个书签链接,例如“在博客 1 上分享
我是一名优秀的程序员,十分优秀!