修改bookmarklet以使用剪贴板中的相同副本来处理剪贴板内容和填充表单

时间:2016-03-22 22:55:27

标签: javascript forms cross-domain bookmarklet

我找到了两个小册子,可以从剪贴板中获取格式化文本,并在另一页上填写表格。这甚至适用于跨域和跨浏览器。问题是书签“B”不能填充“A”可以填写的相同形式。

留下书签“A”的唯一真正问题是它有一个粘贴剪贴板收件箱,书签“B”不必显示,但必要时会重新开启。

测试这些图书小册子的好页面:google.com/advanced_search

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

set @q = buildQuery(); set @q = concat( 'SELECT f.flag ', @q, ' FROM flags f LEFT JOIN flag_colors fc ON fc.flag_id = f.id LEFT JOIN colors c ON c.id = fc.color_id GROUP BY f.id'); prepare s from @q; execute s; deallocate prepare s;

预期的剪贴板内容需要如下所示: 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;}

Bookmarklet“B”来源:https://github.com/cvuorinen/my-bookmarklets/tree/master/form-populate

0~::~text~::~jdiv~0~::~text~::~as_eq~::~If you see this the bookmarklet worked!~jdiv~

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

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);}})();

老实说,我不知道javascript,我花了50多个小时试图研究一种在没有网络服务器的情况下传输表格数据跨域的方法。

很容易使我的page1(在我的控件中生成剪贴板)问题一直使第2页尽可能容易使用。

我真的认为这是可能的,但不确定如何修改bookmarlet“A”以像“B”一样从剪贴板复制。如果我必须忍受“A”,我会好的,但如果我能避免使用ctrl-v步骤并使其成为双击解决方案,那么我的最终解决方案会更好。

提前感谢您的任何帮助。

更新:使用IE开发者工具后的4/14/16我找到了罪魁祸首。它与t变量有关。

“的javascript:函数%20repop(){风险%20j中,A = ”“,T,d,E,F = document.forms,G = ”“,DIV = ”〜::〜“,H,FA = [],TA = [],DF = [],DA = [],C;%20%20℃= window.clipboardData;%20%20if%图20(c)20%{%20%20%20%20H = c.getData( '文本');} K = H.split( “〜jdiv〜”);而(K.length大于0)。{风险%20L = K.shift()分割(DIV); mypush( L,FA);} VAR%20alen = FA.length;对于(VAR%20C = 0; C ^

这个书签,只要你的表格内容已经在原始复制书签的格式上已经放在剪贴板上(请参阅前面提到的书签中的更多内容),然后这个修改过的书签将填写。

1 个答案:

答案 0 :(得分:0)

原始的bookmarklet开发人员提供了以下内容..似乎它只适用于某些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;}