修改小书签以使用剪贴板中的相同副本来处理剪贴板内容和填写表格

Revise bookmarklet to use the same copy from clipboard to process the clipboard contents and fill form

我找到了两个可以从剪贴板获取格式化文本并在另一页上填写表格的小书。这甚至适用于跨域和跨浏览器。问题是小书签 "B" 无法填写 "A" 可以填写的表格。

小书签 "A" 唯一真正的问题是它有一个粘贴剪贴板收件箱,小书签 "B" 不必显示但在必要时返回。

测试这些 bookmarlet 的好页面:google。com/advanced_search

Bookmarklet "A" 来源:http://wundes.com/bookmarklets.html(顺便说一句,它在 IE 中确实有效,尽管页面上说它不会。)

javascript:function%20repop(){var%20j,A="",D,E,F=document.forms,G="",div="~::~",H,FA=[],TA=[],DF=[],DA=[];H=prompt("Paste-Form-Vars-Here","");K=H.split("~jdiv~");while(K.length>0){var%20L=K.shift().split(div);mypush(L,FA);}var%20alen=FA.length;for(var%20c=0;c<alen;c++){TA[c]=[];addtypes(FA[c],TA[c]);}for(all%20in%20FA){addObj(FA[all],TA[all]);}for(var%20eff%20in%20TA){for(var%20o%20in%20TA[eff]){for(var%20i%20in%20TA[eff][o].objArr){var%20fl=F[eff].length;for(var%20df=0;df<fl;df++){var%20dff=F[eff][df];var%20taf=TA[eff][o].objArr[i];if(dff.name==taf[1]){if(taf[2].length==0||taf[2].length==undefined){taf[2]="";}dff.value=taf[2];}}}}}}repop();void(null);function%20addObj(obj,ElArr){for(i%20in%20obj){for(var%20e%20in%20ElArr){if(obj[i][0]==ElArr[e].name){ElArr[e].objArr.push(obj[i]);break;}}}}function%20mypush(a,Ar){var%20n=a.shift();if(Ar[n]==undefined){Ar[n]=[];}Ar[n].push(a);}function%20addtypes(a,Ar){for(var%20e%20in%20a){var%20t=a[e][0];if(elemIndexOf(t,Ar)==-1){var%20bob=new%20Elemental(t,[]);Ar.push(bob);}}}function%20elemIndexOf(s,a){var%20ln=a.length;for(var%20x=0;x<ln;x++){if(a[x].name==s){return(x);}}return(-1);}function%20Elemental(name,objArr){this.name=name;this.objArr=objArr;}

它期望的剪贴板内容需要如下所示: 0~::~text~::~jdiv~0~::~text~::~as_eq~::~If you see this the bookmarklet worked!~jdiv~

小书签 "B" 来源:https://github.com/cvuorinen/my-bookmarklets/tree/master/form-populate

javascript:(function(){t='';c=window.clipboardData;if(c){t=c.getData('Text');}if(!t){t=window.prompt('Paste:');}p=t.split('|');t=p.shift();t=t.split(';');v=t[0].split(':');f=t[1].split(':');l=v.length;d=((f.length>l+1)?'window.'+f[l+1]+'.':'')+'document.'+f[l]+'.';for(i=0;i<l;i++){eval(d+f[i]).value=v[i];}p=p.join('|');if(c){c.setData('Text',p);}else if(p){window.prompt('Copy:',p);}})();

它期望的剪贴板内容需要如下所示:

If you see this the bookmarklet worked!;as_eq:f

老实说我不知道​​ javascript 我已经花了 50 多个小时试图研究一种无需网络服务器即可跨域传输表单数据的方法。

很容易使我的第 1 页(在我的控制下生成剪贴板)问题一直在使第 2 页尽可能易于使用。

我真的认为这是可行的,但不确定如何修改 bookmarlet "A" 使其像 "B" 对剪贴板中的副本所做的那样。如果我必须忍受 "A" 我会没事的,但如果我能避免 ctrl-v 步骤并将其设为两次单击解决方案,我的最终解决方案会好得多。

在此先感谢您的帮助。

更新:2016 年 4 月 14 日在使用 IE 开发人员工具后我找到了罪魁祸首。它与 t 变量有关。

'javascript:function%20repop(){var%20j,A="",t,D,E,F=document.forms,G="",div="~::~",H,FA=[],TA=[],DF=[],DA=[],c;%20%20c=window.clipboardData;%20%20if%20 (c)%20{%20%20%20%20H=c.getData('Text');}K=H.split("~jdiv~");而(K.length>0){var%20L=K.shift().split(div);mypush(L,FA);}var%20alen=FA.length;for (var%20c=0;c

这个小书签只要你的剪贴板上的表格内容是原始副本小书签制作的格式(更多信息请参见前面提到的小书签 A 来源),那么这个修改后的小书签将填写它。

最初的小书签开发者提供了以下内容。似乎它只适用于某些 IE 版本。希望这可以帮助需要此表单填写功能的人。

javascript:function%20repop(){var%20j,A="",D,E,F=document.forms,G="",div="~::~",H,FA=[],TA=[],DF=[],DA=[],c;%20%20c=window.clipboardData;wait(3000);%20%20if%20(c)%20{%20%20%20%20H=c.getData('Text');%20%20}%20%20%20%20if%20(!t)%20%20{%20%20%20%20H=window.prompt('Paste:');%20%20}K=H.split("~jdiv~");while(K.length>0){var%20L=K.shift().split(div);mypush(L,FA);}var%20alen=FA.length;for(var%20c=0;c<alen;c++){TA[c]=[];addtypes(FA[c],TA[c]);}for(all%20in%20FA){addObj(FA[all],TA[all]);}for(var%20eff%20in%20TA){for(var%20o%20in%20TA[eff]){for(var%20i%20in%20TA[eff][o].objArr){var%20fl=F[eff].length;for(var%20df=0;df<fl;df++){var%20dff=F[eff][df];var%20taf=TA[eff][o].objArr[i];if(dff.name==taf[1]){if(taf[2].length==0||taf[2].length==undefined){taf[2]="";}dff.value=taf[2];}}}}}}repop();void(null);function%20addObj(obj,ElArr){for(i%20in%20obj){for(var%20e%20in%20ElArr){if(obj[i][0]==ElArr[e].name){ElArr[e].objArr.push(obj[i]);break;}}}}function%20mypush(a,Ar){var%20n=a.shift();if(Ar[n]==undefined){Ar[n]=[];}Ar[n].push(a);}function%20addtypes(a,Ar){for(var%20e%20in%20a){var%20t=a[e][0];if(elemIndexOf(t,Ar)==-1){var%20bob=new%20Elemental(t,[]);Ar.push(bob);}}}function%20elemIndexOf(s,a){var%20ln=a.length;for(var%20x=0;x<ln;x++){if(a[x].name==s){return(x);}}return(-1);}function%20Elemental(name,objArr){this.name=name;this.objArr=objArr;}