如何从一个页面复制<div>元素并使用greasemonkey / tampermonkey将其粘贴到另一个页面?

时间:2017-04-18 01:46:02

标签: javascript html greasemonkey tampermonkey

你能帮我解决我的第一个关键词吗?我是一个完全的初学者,会非常感谢你的帮助。我已经尝试了很多,但总是失败。 (编辑:我现在有一些工作)

►简而言之,我想从奥地利报纸 (“Kurier”) 文章中抓住byline并添加它(略微修改了文章的打印视图。

所以这是greasemonkey脚本应该做的事情(没有外部脚本,如jquery ):

  • 第1步(已完成):导航到文章网址后,重定向到printview网址
  • 第2步(已完成):从文章网址
  • 复制署名
  • 第3步(差不多完成):修改署名(见下文)
  • 第4步:将署线粘贴到打印视图页面


    每个步骤的评论:


[第1步]:完成
每篇文章的打印视图位于[article URL] + "/print", 例如:
文章网址:https://kurier.at/wissen/mars-simulation-auf-hawaii/249.106.702
打印视图网址:https://kurier.at/wissen/mars-simulation-auf-hawaii/249.106.702/print

这对我有用:

// ==UserScript==
// @name        KURIER printview
// @include     https://kurier.at/*
// @exclude     https://kurier.at/*/print
// @version     1
// @run-at      document-start
// ==/UserScript==

window.location.replace(window.location + "/print");

我使用@exclude来避免无限循环。

为了不减慢脚本速度,如果@run-at document-start可以保持不变,那将是很好的,这样脚本就不必渲染文章页面而是直接跳转到printview URL。因此,只需要呈现1页而不是2页。

(我希望第2步可以从printview位置完成 - 或者从文章页面完成,但不渲染它?任何一种方法都可以避免渲染2页。)


[第2步]:完成
byline是一个div容器,有三种不同的形式(取决于作者的数量):
•没有作者:<div class="misc no-author">
•单一作者:<div class="misc single-author has-image">
•多位作者:<div class="misc multiple-authors">

以下是每种类型的示例文章:
- 没有作者:https://kurier.at/wissen/mars-experiment-auf-hawaii/218.311.221
- 单一作者:https://kurier.at/wissen/mars-simulation-auf-hawaii/249.106.702
- 多位作者:https://kurier.at/wissen/mars-wann-ist-es-soweit/230.174.316

这会让我们得到div容器:

var $byline = document.getElementsByClassName("misc");

byline是页面上的第一个div.misc,因此byline现在位于$byline[0]


[第3步]
byline div容器具有以下结构:

<div class="misc [no-author/single-author/multiple-authors]">
    |__ [optional content]
    |__ <div class="last-modified">
    |__ <div class="social-media-container">
    |__ <div class="clear"> 

a)应删除社交媒体容器 b)(已完成)可选内容可能包含图片 图片网址方案为:https://images.kurier.at/[imagename].jpg/[size]x[size]/[imageID]
如果存在图像,则应从:

更改的像素值
<img width="35" height="35" src="https://images.kurier.at/Sandra-
Lumetsberger(2)-REdit.jpg/70x70/133.396.913" alt="Sandra Lumetsberger">

<img width="100" height="100" src="https://images.kurier.at/Sandra-
Lumetsberger(2)-REdit.jpg/200x200/133.396.913" alt="Sandra Lumetsberger">

我只找到了这个快速而又肮脏的解决方案:

document.body.innerHTML = document.body.innerHTML.replace(
    /height="35" width="35"/g,
    'height="100" width="100"').replace("/70x70/", "/200x200/");


[第4步]
printview页面具有以下结构:

<body>
    |__ <script>
    |__ <div class="wrapper">
        |__ <header class="header">
        |__ <div class="rfloat noprint">
        |__ <p class="open12 marginb10">
        |__ <div class="clear">
        |__ <article>       

在步骤2中复制并在步骤3中修改的byline div应粘贴在p元素下面。


非常感谢你!

1 个答案:

答案 0 :(得分:1)

更改为其他URL时,将释放脚本范围,并在下一页上启动新脚本运行。所以你不能直接传输数据。

查看GM_getValue()&amp; GM_setValue()函数。

您还需要在标题中加入@grant

还有一些其他技术可以在页面之间交换数据

  • 饼干
  • 现代浏览器的HTML5 localStorage
  • 通过自定义事件重定向到GM控制的Frame +消息传递
  • 通过AJAX&amp;阅读另一页将操纵数据集成到当前页面 - GM支持简化的GM_xmlhttpRequest()功能。

我推荐AJAX变体,但这取决于你想要获得的行为。