Javascript bookmarklet从一个页面获取信息并将其提交到另一个页面上的表单

时间:2010-07-27 21:39:04

标签: javascript bookmarklet

现在我发现我不能在一个页面内编写JavaScript以在另一个外部页面上输入表单数据,我想用基于浏览器的书签来代替。

我可以使用此bookmarklet代码段访问原始页面上的数据:

javascript:var%20thecode=document.myForm.myTextArea.value;

如果我在浏览器中手动打开外部基于Web的表单,则此代码会更改文本框中的内容:

javascript:void(document.externalForm.externalTextArea.value="HELLO WORLD"));

此bookmarklet代码将使用外部表单打开一个新的浏览器窗口:

javascript:newWindow=window.open("http://www.url.com","newWindow");if(window.focus){void(newWindow.focus());}

但是,当我尝试将这些片段放在一个小书签中以在新窗口中打开外部表单并更改其中的数据时,我无法访问newWindow中的任何元素。例如,这不能检查新窗口中文本区域的现有值

javascript:var%20newWindow=window.open("http://www.url.com","newWindow");if(window.focus){void(newWindow.focus());}window.alert(newWindow.document.externalForm.externalTextArea.value);

一旦我使用bookmarklet代码以newWindow的形式打开新窗口,我似乎无法访问该新窗口中的元素。有什么建议我缺少什么?感谢。

1 个答案:

答案 0 :(得分:0)

这是因为bookmarklet在当前网页的沙箱(环境)中运行。由于您不允许访问另一个没有相同协议,域名和端口的页面(DOM),因此当您无法访问document newWindow属性时协议,域和端口不匹配。顺便说一下,访问页面上的iframe也是如此。

当你在谈论“外部形式”时,我想你不会留在同一个域名上。其他示例检索或操作当前页面上的数据(此时)并且不会出错。

另见Same origin policy

更新:关于Delicious(et al。)bookmarklet:其代码实际上是:

(function () {
    f = 'http://delicious.com/save?url=' + encodeURIComponent(window.location.href) + '&title=' + encodeURIComponent(document.title) + '&v=5&';
    a = function () {
        if (!window.open(f + 'noui=1&jump=doclose', 'deliciousuiv5', 'location=yes,links=no,scrollbars=no,toolbar=no,width=550,height=550'))
            location.href = f + 'jump=yes'
    };
    if (/Firefox/.test(navigator.userAgent)) {
        setTimeout(a, 0)
    } else {
        a()
    }
})()

所以,是的,参数仅使用GET请求传输。