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

Javascript bookmarklet从一个页面获取信息并提交到另一个页面的表单,javascript,bookmarklet,Javascript,Bookmarklet,现在我发现我不能在一个页面中编写JavaScript来在另一个外部页面上输入表单数据,我想用一个基于浏览器的bookmarklet来代替 我可以使用以下bookmarklet代码片段访问原始页面上的数据: javascript:var%20thecode=document.myForm.myTextArea.value; 如果在浏览器中手动打开外部基于Web的表单,此代码将更改文本框中的内容: javascript:void(document.externalForm.externalText

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

我可以使用以下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());}
但是,当我试图将这些片段放在一个bookmarklet中,以便在新窗口中打开外部表单并更改其中的数据时,我无法访问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的形式打开新窗口,我似乎无法访问新窗口中的元素。有什么建议我遗漏了什么?谢谢。

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

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

另见

更新:关于Delicious(等)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
请求传输。

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

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

另见

更新:关于Delicious(等)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
请求传输。

谢谢。打开一个新窗口的bookmarklet必须有某种方式可以访问来自原始窗口的信息,考虑到各种现有的bookmarklet,例如“在Facebook上共享”或“在Delicious上添加书签”,这些书签预先使用来自前一个窗口的信息填充新窗口。在我看来,这些请求并不都是“获取”请求,但可能是这样。@CodeFavoriter:您也可以使用bookmarklet中的POST(使用javascript提交的表单)提交此类数据,但这不会很干净。谢谢。打开一个新窗口的bookmarklet必须有某种方式可以访问来自原始窗口的信息,考虑到各种现有的bookmarklet,例如“在Facebook上共享”或“在Delicious上添加书签”,这些书签预先使用来自前一个窗口的信息填充新窗口。在我看来,这些请求并不都是“获取”请求,但可能是这样。@CodeFavoriter:您也可以使用bookmarklet中的POST(使用javascript提交的表单)提交此类数据,但这并不是很干净。