代码之家  ›  专栏  ›  技术社区  ›  jorilallo

用bookmarklet传输数据的方法

  •  3
  • jorilallo  · 技术社区  · 14 年前

    我正在为一项服务做一个书签。我需要从打开的窗口传输数据(URL,文本),但我不知道哪种方法是最好的。由于跨域问题,get限制数据量和Ajax是不可能的。

    最理想的方法是什么?

    3 回复  |  直到 13 年前
        1
  •  7
  •   Dagg Nabbit    14 年前

    如果有大量的数据,你可以使用post。使用带有文本框的窗体创建隐藏的iframe。将Form方法设置为Post,并将操作设置为您的服务。将数据放入文本框,将iframe附加到文档,然后提交表单。

    尝试如下操作:

      function postData (data, url, cb) {
    
        var f     = document.createElement('iframe'),
            fname = (+((''+Math.random()).substring(2))).toString(36);
    
        f.setAttribute('name', fname);
        f.setAttribute('id', fname);
        f.setAttribute('style', 'width:0;height:0;border:none;margin:none;padding:none;position:absolute;');
    
        document.body.appendChild(f);
    
        var frame = window.frames[fname], 
            doc   = frame.document,
            form  = doc.createElement('form'),
            text  = doc.createElement('textarea');
    
        text.setAttribute('name', 'data');
        text.appendChild(doc.createTextNode(data));
    
        form.setAttribute('action', url);
        form.setAttribute('method', 'post');
        form.appendChild(text);
    
        doc.body.appendChild(form);
    
        if (cb) { document.getElementById(fname).onload=cb; }
    
        doc.forms[0].submit();
      }
    

    如果需要,可以从回调中的文档中删除iframe。

        2
  •  0
  •   Alain Beauvois    13 年前

    您可以将数据放入编码的JSON字符串中,并使用Ajax Post发送数据。Ajax支持日志。

        3
  •  -1
  •   warfangle    14 年前

    没有推荐的方法是可行的。

    另一种解决跨域问题的方法是:您可以使用所需的大多数javascript(包括xhr代码)托管一个JS文件,并只需使用bookmarklet代码将脚本元素插入引用JS文件的当前页面(为可读性添加了换行符;当然,在bookmarklet代码中删除它们):

    javascript:(function() {
        var sc = document.createElement("SCRIPT");
        sc.type = "text/javascript";
        sc.src = "http://domain.com/path/to/script.js";
        document.body.appendChild(sc);
    })();