Bookmarklet发布html内容(而不是获取/请求)

时间:2013-09-30 02:26:42

标签: javascript http-post bookmarklet

我想创建一个bookmarklet来获取html页面的内容并将其发送到外部URL进行处理。

通常只需将document.title发送到服务器并将服务器上的CURL发送到服务器就足够了,但由于各种原因,这不是一个选项。我试过了:

javascript:
(
    function()
    {
        var htmlstuff=document.documentElement.innerHTML;

        window.open
        (
            'http://127.0.0.1/grabhtml.php?url='+escape(document.location)+'&title='+escape(document.title)+'&html='+escape(htmlstuff)+'&lm='+escape(document.lastModified)
            ,'InfoDialog','menubar=no,toolbar=no,location=no,directories=no,status=no,scrollbars=yes,resizable=yes,dependent=no,width=400,height=480,left=50,top=50'
        );
    }
)
();

grabhtml.php就是这样 <? file_put_contents('result.html',$_REQUEST['html']); ?>

正如预期的那样,Apache不喜欢这么长的请求:

Request-URI Too Large
The requested URL's length exceeds the capacity limit for this server.

因此我考虑过通过POST而不是GET发送document.documentElement.innerHTML。

Firefox-WebmasterTools可以选择显示“查看生成的源”而不是普通的“查看源”。

我记得去年我读过一篇关于Instapaper-like-service如何完全相同的文章。

我已经搜索了这篇文章的日子,或者将“Generated Source”发布到我的表单的bookmarklet示例。

我的Javascript技能非常基础,但我是一个快速学习者。我们将非常感谢向正确的方向迈进。

1 个答案:

答案 0 :(得分:0)

您只能通过AJAX使用POST,因此您的JS脚本必须与grabhtml.php

在同一个域中运行

如果是,你可以简单地使用jQuery,它看起来像:

$.post('grabhtml.php', {
    url: document.location,
    title: document.title,
    html: htmlstuff
}, function(response) {
    alert('Successfully posted.');
});

如果没有,您可以尝试将脚本嵌入iframe(与php脚本在同一个域中运行),从父框架向此iframe发送标题,正文等。 (通过window.postMessage)并发出上述POST请求,省略跨域限制。

您可以在此处阅读有关window.postMessage的更多信息: http://viget.com/extend/using-javascript-postmessage-to-talk-to-iframes

注意:我不确定window.postMessage的最大邮件大小