使用jQuery和DOM发布innerHTML并获取btoa错误

时间:2015-03-17 17:33:47

标签: jquery html dom

我有一个脚本使用jQuery来获取页面的整个html源,然后将该数据发布到一个表单中,然后POST脚本使用DOMDocument来解析html并获取我正在寻找的数据: / p>

的script.php

$data = base64_decode($_POST['data']);
$dom = new DOMDocument();
$dom->loadHTML($data);
//find element ids and upload data to a db

这是在源页面上加载的jQuery:

jQuery(document.body).append("<iframe id='somenewtab' name='somenewtab' />");
jQuery(document.body).append("<form action='script.php' target='somenewtab' id='form_submit_data' method='post' enctype='multipart/form-data'><input type='hidden' name='data' id='submit_data'><input type='submit' value=' '></form>");
jQuery("#submit_data").val( btoa(document.body.innerHTML) );
jQuery("#form_submit_data").submit();

我的问题是,在具有jQuery的页面上的控制台中,它有时会给我这个错误并且页面停止并且数据不会发布到script.php:

Uncaught InvalidCharacterError: Failed to execute 'btoa' on 'Window': 
The string to be encoded contains characters outside of the Latin1 range.

我无法弄清楚该怎么做。看起来像innerHTML的某种编码问题。任何帮助将非常感激。

2 个答案:

答案 0 :(得分:1)

确定。这是一些严重的不良做法,可能会产生严重的性能和安全影响。

话虽如此,这可以使它发挥作用 -

btoa(encodeURI(document.body.innerHTML));

答案 1 :(得分:0)

是的,这是一个编码问题。在运行latin1方法之前,必须通过对它们进行scaping来修复不在btoa编码中的字母。为此,请运行以下代码:

base64 = btoa(str.replace(/[\u00A0-\u2666]/g, function(c) {
    return '&#' + c.charCodeAt(0) + ';';
}));